コード例 #1
0
ファイル: GLSLLinkProgram.cs プロジェクト: axiom3d/axiom
        /// <summary>
        ///		Updates program object uniforms using data from GpuProgramParameters.
        ///		normally called by GLSLGpuProgram.BindParameters() just before rendering occurs.
        /// </summary>
        /// <param name="parameters">GPU Parameters to use to update the uniforms params.</param>
        public void UpdateUniforms(GpuProgramParameters parameters, GpuProgramParameters.GpuParamVariability mask,
                                   GpuProgramType fromProgType)
        {
            foreach (var currentUniform in this.uniformReferences)
            {
                // Only pull values from buffer it's supposed to be in (vertex or fragment)
                // This method will be called twice, once for vertex program params,
                // and once for fragment program params.
                if (fromProgType == currentUniform.SourceProgType)
                {
                    var def = currentUniform.ConstantDef;

                    if ((def.Variability & mask) != 0)
                    {
                        var glArraySize = def.ArraySize;

                        // get the index in the parameter real list
                        switch (def.ConstantType)
                        {
                        case GpuProgramParameters.GpuConstantType.Float1:
                            using (var ptr = parameters.GetFloatPointer(def.PhysicalIndex))
                            {
                                Gl.glUniform1fvARB(currentUniform.Location, glArraySize, ptr.Pointer.Pin());
                            }
                            break;

                        case GpuProgramParameters.GpuConstantType.Float2:
                            using (var ptr = parameters.GetFloatPointer(def.PhysicalIndex))
                            {
                                Gl.glUniform2fvARB(currentUniform.Location, glArraySize, ptr.Pointer.Pin());
                            }
                            break;

                        case GpuProgramParameters.GpuConstantType.Float3:
                            using (var ptr = parameters.GetFloatPointer(def.PhysicalIndex))
                            {
                                Gl.glUniform3fvARB(currentUniform.Location, glArraySize, ptr.Pointer.Pin());
                            }
                            break;

                        case GpuProgramParameters.GpuConstantType.Float4:
                            using (var ptr = parameters.GetFloatPointer(def.PhysicalIndex))
                            {
                                Gl.glUniform4fvARB(currentUniform.Location, glArraySize, ptr.Pointer.Pin());
                            }
                            break;

                        case GpuProgramParameters.GpuConstantType.Matrix_2X2:
                            using (var ptr = parameters.GetFloatPointer(def.PhysicalIndex))
                            {
                                Gl.glUniformMatrix2fvARB(currentUniform.Location, glArraySize, 1, ptr.Pointer.Pin());
                            }
                            break;

                        case GpuProgramParameters.GpuConstantType.Matrix_2X3:
                            using (var ptr = parameters.GetFloatPointer(def.PhysicalIndex))
                            {
                                Gl.glUniformMatrix2x3fv(currentUniform.Location, glArraySize, 1, ptr.Pointer.Pin());
                            }
                            break;

                        case GpuProgramParameters.GpuConstantType.Matrix_2X4:
                            using (var ptr = parameters.GetFloatPointer(def.PhysicalIndex))
                            {
                                Gl.glUniformMatrix2x4fv(currentUniform.Location, glArraySize, 1, ptr.Pointer.Pin());
                            }
                            break;

                        case GpuProgramParameters.GpuConstantType.Matrix_3X2:
                            using (var ptr = parameters.GetFloatPointer(def.PhysicalIndex))
                            {
                                Gl.glUniformMatrix3x2fv(currentUniform.Location, glArraySize, 1, ptr.Pointer.Pin());
                            }
                            break;

                        case GpuProgramParameters.GpuConstantType.Matrix_3X3:
                            using (var ptr = parameters.GetFloatPointer(def.PhysicalIndex))
                            {
                                Gl.glUniformMatrix3fv(currentUniform.Location, glArraySize, 1, ptr.Pointer.Pin());
                            }
                            break;

                        case GpuProgramParameters.GpuConstantType.Matrix_3X4:
                            using (var ptr = parameters.GetFloatPointer(def.PhysicalIndex))
                            {
                                Gl.glUniformMatrix3x4fv(currentUniform.Location, glArraySize, 1, ptr.Pointer.Pin());
                            }
                            break;

                        case GpuProgramParameters.GpuConstantType.Matrix_4X2:
                            using (var ptr = parameters.GetFloatPointer(def.PhysicalIndex))
                            {
                                Gl.glUniformMatrix4x2fv(currentUniform.Location, glArraySize, 1, ptr.Pointer.Pin());
                            }
                            break;

                        case GpuProgramParameters.GpuConstantType.Matrix_4X3:
                            using (var ptr = parameters.GetFloatPointer(def.PhysicalIndex))
                            {
                                Gl.glUniformMatrix4x3fv(currentUniform.Location, glArraySize, 1, ptr.Pointer.Pin());
                            }
                            break;

                        case GpuProgramParameters.GpuConstantType.Matrix_4X4:
                            using (var ptr = parameters.GetFloatPointer(def.PhysicalIndex))
                            {
                                Gl.glUniformMatrix4fv(currentUniform.Location, glArraySize, 1, ptr.Pointer.Pin());
                            }
                            break;

                        case GpuProgramParameters.GpuConstantType.Int1:
                            using (var ptr = parameters.GetIntPointer(def.PhysicalIndex))
                            {
                                Gl.glUniform1ivARB(currentUniform.Location, glArraySize, ptr.Pointer.Pin());
                            }
                            break;

                        case GpuProgramParameters.GpuConstantType.Int2:
                            using (var ptr = parameters.GetIntPointer(def.PhysicalIndex))
                            {
                                Gl.glUniform2ivARB(currentUniform.Location, glArraySize, ptr.Pointer.Pin());
                            }
                            break;

                        case GpuProgramParameters.GpuConstantType.Int3:
                            using (var ptr = parameters.GetIntPointer(def.PhysicalIndex))
                            {
                                Gl.glUniform3ivARB(currentUniform.Location, glArraySize, ptr.Pointer.Pin());
                            }
                            break;

                        case GpuProgramParameters.GpuConstantType.Int4:
                            using (var ptr = parameters.GetIntPointer(def.PhysicalIndex))
                            {
                                Gl.glUniform4ivARB(currentUniform.Location, glArraySize, ptr.Pointer.Pin());
                            }
                            break;

                        case GpuProgramParameters.GpuConstantType.Sampler1D:
                        case GpuProgramParameters.GpuConstantType.Sampler1DShadow:
                        case GpuProgramParameters.GpuConstantType.Sampler2D:
                        case GpuProgramParameters.GpuConstantType.Sampler2DShadow:
                        case GpuProgramParameters.GpuConstantType.Sampler3D:
                        case GpuProgramParameters.GpuConstantType.SamplerCube:
                            var value = parameters.GetIntConstant(def.PhysicalIndex);
                            Gl.glUniform1iARB(currentUniform.Location, value);
                            break;

                        case GpuProgramParameters.GpuConstantType.Unknown:
                            break;
                        } // end switch
                        GLSLHelper.CheckForGLSLError("GLSLLinkProgram::updateUniforms", 0);
                    }     // variability & mask
                }         // fromProgType == currentUniform->mSourceProgType
            }             // end for
        }