private static UniformBlockCollection FindUniformBlocks(ShaderProgramNameGL3x program) { int programHandle = program.Value; int numberOfUniformBlocks; GL.GetProgram(programHandle, ProgramParameter.ActiveUniformBlocks, out numberOfUniformBlocks); UniformBlockCollection uniformBlocks = new UniformBlockCollection(); for (int i = 0; i < numberOfUniformBlocks; ++i) { string uniformBlockName = GL.GetActiveUniformBlockName(programHandle, i); int uniformBlockSizeInBytes; GL.GetActiveUniformBlock(programHandle, i, ActiveUniformBlockParameter.UniformBlockDataSize, out uniformBlockSizeInBytes); int numberOfUniformsInBlock; GL.GetActiveUniformBlock(programHandle, i, ActiveUniformBlockParameter.UniformBlockActiveUniforms, out numberOfUniformsInBlock); int[] uniformIndicesInBlock = new int[numberOfUniformsInBlock]; GL.GetActiveUniformBlock(programHandle, i, ActiveUniformBlockParameter.UniformBlockActiveUniformIndices, uniformIndicesInBlock); // // Query uniforms in this named uniform block // int[] uniformTypes = new int[numberOfUniformsInBlock]; int[] uniformOffsetsInBytes = new int[numberOfUniformsInBlock]; int[] uniformLengths = new int[numberOfUniformsInBlock]; int[] uniformArrayStridesInBytes = new int[numberOfUniformsInBlock]; int[] uniformmatrixStrideInBytess = new int[numberOfUniformsInBlock]; int[] uniformRowMajors = new int[numberOfUniformsInBlock]; GL.GetActiveUniforms(programHandle, numberOfUniformsInBlock, uniformIndicesInBlock, ActiveUniformParameter.UniformType, uniformTypes); GL.GetActiveUniforms(programHandle, numberOfUniformsInBlock, uniformIndicesInBlock, ActiveUniformParameter.UniformOffset, uniformOffsetsInBytes); GL.GetActiveUniforms(programHandle, numberOfUniformsInBlock, uniformIndicesInBlock, ActiveUniformParameter.UniformSize, uniformLengths); GL.GetActiveUniforms(programHandle, numberOfUniformsInBlock, uniformIndicesInBlock, ActiveUniformParameter.UniformArrayStride, uniformArrayStridesInBytes); GL.GetActiveUniforms(programHandle, numberOfUniformsInBlock, uniformIndicesInBlock, ActiveUniformParameter.UniformMatrixStride, uniformmatrixStrideInBytess); GL.GetActiveUniforms(programHandle, numberOfUniformsInBlock, uniformIndicesInBlock, ActiveUniformParameter.UniformIsRowMajor, uniformRowMajors); UniformBlock uniformBlock = new UniformBlockGL3x(uniformBlockName, uniformBlockSizeInBytes, i); for (int j = 0; j < numberOfUniformsInBlock; ++j) { string uniformName = GL.GetActiveUniformName(programHandle, uniformIndicesInBlock[j]); uniformName = CorrectUniformName(uniformName); UniformType uniformType = TypeConverterGL3x.To((ActiveUniformType)uniformTypes[j]); uniformBlock.Members.Add(CreateUniformBlockMember(uniformName, uniformType, uniformOffsetsInBytes[j], uniformLengths[j], uniformArrayStridesInBytes[j], uniformmatrixStrideInBytess[j], uniformRowMajors[j])); } uniformBlocks.Add(uniformBlock); // // Create a one to one mapping between uniform blocks and uniform buffer objects. // GL.UniformBlockBinding(programHandle, i, i); } return uniformBlocks; }
private static UniformBlockCollection FindUniformBlocks(ShaderProgramNameGL3x program) { int programHandle = program.Value; int numberOfUniformBlocks; GL.GetProgram(programHandle, ProgramParameter.ActiveUniformBlocks, out numberOfUniformBlocks); UniformBlockCollection uniformBlocks = new UniformBlockCollection(); for (int i = 0; i < numberOfUniformBlocks; ++i) { string uniformBlockName = GL.GetActiveUniformBlockName(programHandle, i); int uniformBlockSizeInBytes; GL.GetActiveUniformBlock(programHandle, i, ActiveUniformBlockParameter.UniformBlockDataSize, out uniformBlockSizeInBytes); int numberOfUniformsInBlock; GL.GetActiveUniformBlock(programHandle, i, ActiveUniformBlockParameter.UniformBlockActiveUniforms, out numberOfUniformsInBlock); int[] uniformIndicesInBlock = new int[numberOfUniformsInBlock]; GL.GetActiveUniformBlock(programHandle, i, ActiveUniformBlockParameter.UniformBlockActiveUniformIndices, uniformIndicesInBlock); // // Query uniforms in this named uniform block // int[] uniformTypes = new int[numberOfUniformsInBlock]; int[] uniformOffsetsInBytes = new int[numberOfUniformsInBlock]; int[] uniformLengths = new int[numberOfUniformsInBlock]; int[] uniformArrayStridesInBytes = new int[numberOfUniformsInBlock]; int[] uniformmatrixStrideInBytess = new int[numberOfUniformsInBlock]; int[] uniformRowMajors = new int[numberOfUniformsInBlock]; GL.GetActiveUniforms(programHandle, numberOfUniformsInBlock, uniformIndicesInBlock, ActiveUniformParameter.UniformType, uniformTypes); GL.GetActiveUniforms(programHandle, numberOfUniformsInBlock, uniformIndicesInBlock, ActiveUniformParameter.UniformOffset, uniformOffsetsInBytes); GL.GetActiveUniforms(programHandle, numberOfUniformsInBlock, uniformIndicesInBlock, ActiveUniformParameter.UniformSize, uniformLengths); GL.GetActiveUniforms(programHandle, numberOfUniformsInBlock, uniformIndicesInBlock, ActiveUniformParameter.UniformArrayStride, uniformArrayStridesInBytes); GL.GetActiveUniforms(programHandle, numberOfUniformsInBlock, uniformIndicesInBlock, ActiveUniformParameter.UniformMatrixStride, uniformmatrixStrideInBytess); GL.GetActiveUniforms(programHandle, numberOfUniformsInBlock, uniformIndicesInBlock, ActiveUniformParameter.UniformIsRowMajor, uniformRowMajors); UniformBlock uniformBlock = new UniformBlockGL3x(uniformBlockName, uniformBlockSizeInBytes, i); for (int j = 0; j < numberOfUniformsInBlock; ++j) { string uniformName = GL.GetActiveUniformName(programHandle, uniformIndicesInBlock[j]); uniformName = CorrectUniformName(uniformName); UniformType uniformType = TypeConverterGL3x.To((ActiveUniformType)uniformTypes[j]); uniformBlock.Members.Add(CreateUniformBlockMember(uniformName, uniformType, uniformOffsetsInBytes[j], uniformLengths[j], uniformArrayStridesInBytes[j], uniformmatrixStrideInBytess[j], uniformRowMajors[j])); } uniformBlocks.Add(uniformBlock); // // Create a one to one mapping between uniform blocks and uniform buffer objects. // GL.UniformBlockBinding(programHandle, i, i); } return(uniformBlocks); }