private UniformCollection FindUniforms(ShaderProgramNameGL3x program) { int programHandle = program.Value; int numberOfUniforms; GL.GetProgram(programHandle, ProgramParameter.ActiveUniforms, out numberOfUniforms); int uniformNameMaxLength; GL.GetProgram(programHandle, ProgramParameter.ActiveUniformMaxLength, out uniformNameMaxLength); UniformCollection uniforms = new UniformCollection(); for (int i = 0; i < numberOfUniforms; ++i) { int uniformNameLength; int uniformSize; ActiveUniformType uniformType; StringBuilder uniformNameBuilder = new StringBuilder(uniformNameMaxLength); GL.GetActiveUniform(programHandle, i, uniformNameMaxLength, out uniformNameLength, out uniformSize, out uniformType, uniformNameBuilder); string uniformName = CorrectUniformName(uniformNameBuilder.ToString()); if (uniformName.StartsWith("gl_", StringComparison.InvariantCulture)) { // // Names starting with the reserved prefix of "gl_" have a location of -1. // continue; } // // Skip uniforms in a named block // int uniformBlockIndex; GL.GetActiveUniforms(programHandle, 1, ref i, ActiveUniformParameter.UniformBlockIndex, out uniformBlockIndex); if (uniformBlockIndex != -1) { continue; } if (uniformSize != 1) { // TODO: Support arrays throw new NotSupportedException("Uniform arrays are not supported."); } int uniformLocation = GL.GetUniformLocation(programHandle, uniformName); uniforms.Add(CreateUniform(uniformName, uniformLocation, uniformType)); } return(uniforms); }
private static ShaderVertexAttributeCollection FindVertexAttributes(ShaderProgramNameGL3x program) { int programHandle = program.Value; int numberOfAttributes; GL.GetProgram(programHandle, ProgramParameter.ActiveAttributes, out numberOfAttributes); int attributeNameMaxLength; GL.GetProgram(programHandle, ProgramParameter.ActiveAttributeMaxLength, out attributeNameMaxLength); ShaderVertexAttributeCollection vertexAttributes = new ShaderVertexAttributeCollection(); for (int i = 0; i < numberOfAttributes; ++i) { int attributeNameLength; int attributeLength; ActiveAttribType attributeType; StringBuilder attributeNameBuilder = new StringBuilder(attributeNameMaxLength); GL.GetActiveAttrib(programHandle, i, attributeNameMaxLength, out attributeNameLength, out attributeLength, out attributeType, attributeNameBuilder); string attributeName = attributeNameBuilder.ToString(); if (attributeName.StartsWith("gl_", StringComparison.InvariantCulture)) { // // Names starting with the reserved prefix of "gl_" have a location of -1. // continue; } int attributeLocation = GL.GetAttribLocation(programHandle, attributeName); vertexAttributes.Add(new ShaderVertexAttribute( attributeName, attributeLocation, TypeConverterGL3x.To(attributeType), attributeLength)); } return(vertexAttributes); }
public ShaderProgramGL3x( string vertexShaderSource, string geometryShaderSource, string fragmentShaderSource) { _vertexShader = new ShaderObjectGL3x(ShaderType.VertexShader, vertexShaderSource); if (geometryShaderSource.Length > 0) { _geometryShader = new ShaderObjectGL3x(ShaderType.GeometryShaderExt, geometryShaderSource); } _fragmentShader = new ShaderObjectGL3x(ShaderType.FragmentShader, fragmentShaderSource); _program = new ShaderProgramNameGL3x(); int programHandle = _program.Value; GL.AttachShader(programHandle, _vertexShader.Handle); if (geometryShaderSource.Length > 0) { GL.AttachShader(programHandle, _geometryShader.Handle); } GL.AttachShader(programHandle, _fragmentShader.Handle); GL.LinkProgram(programHandle); int linkStatus; GL.GetProgram(programHandle, ProgramParameter.LinkStatus, out linkStatus); if (linkStatus == 0) { throw new CouldNotCreateVideoCardResourceException("Could not link shader program. Link Log: \n\n" + ProgramInfoLog); } _fragmentOutputs = new FragmentOutputsGL3x(_program); _vertexAttributes = FindVertexAttributes(_program); _dirtyUniforms = new List <ICleanable>(); _uniforms = FindUniforms(_program); _uniformBlocks = FindUniformBlocks(_program); InitializeAutomaticUniforms(_uniforms); }
public ShaderProgramGL3x( string vertexShaderSource, string geometryShaderSource, string fragmentShaderSource) { _vertexShader = new ShaderObjectGL3x(ShaderType.VertexShader, vertexShaderSource); if (geometryShaderSource.Length > 0) { _geometryShader = new ShaderObjectGL3x(ShaderType.GeometryShaderExt, geometryShaderSource); } _fragmentShader = new ShaderObjectGL3x(ShaderType.FragmentShader, fragmentShaderSource); _program = new ShaderProgramNameGL3x(); int programHandle = _program.Value; GL.AttachShader(programHandle, _vertexShader.Handle); if (geometryShaderSource.Length > 0) { GL.AttachShader(programHandle, _geometryShader.Handle); } GL.AttachShader(programHandle, _fragmentShader.Handle); GL.LinkProgram(programHandle); int linkStatus; GL.GetProgram(programHandle, ProgramParameter.LinkStatus, out linkStatus); if (linkStatus == 0) { throw new CouldNotCreateVideoCardResourceException("Could not link shader program. Link Log: \n\n" + ProgramInfoLog); } _fragmentOutputs = new FragmentOutputsGL3x(_program); _vertexAttributes = FindVertexAttributes(_program); _dirtyUniforms = new List<ICleanable>(); _uniforms = FindUniforms(_program); _uniformBlocks = FindUniformBlocks(_program); InitializeAutomaticUniforms(_uniforms); }
private static ShaderVertexAttributeCollection FindVertexAttributes(ShaderProgramNameGL3x program) { int programHandle = program.Value; int numberOfAttributes; GL.GetProgram(programHandle, ProgramParameter.ActiveAttributes, out numberOfAttributes); int attributeNameMaxLength; GL.GetProgram(programHandle, ProgramParameter.ActiveAttributeMaxLength, out attributeNameMaxLength); ShaderVertexAttributeCollection vertexAttributes = new ShaderVertexAttributeCollection(); for (int i = 0; i < numberOfAttributes; ++i) { int attributeNameLength; int attributeLength; ActiveAttribType attributeType; StringBuilder attributeNameBuilder = new StringBuilder(attributeNameMaxLength); GL.GetActiveAttrib(programHandle, i, attributeNameMaxLength, out attributeNameLength, out attributeLength, out attributeType, attributeNameBuilder); string attributeName = attributeNameBuilder.ToString(); if (attributeName.StartsWith("gl_", StringComparison.InvariantCulture)) { // // Names starting with the reserved prefix of "gl_" have a location of -1. // continue; } int attributeLocation = GL.GetAttribLocation(programHandle, attributeName); vertexAttributes.Add(new ShaderVertexAttribute( attributeName, attributeLocation, TypeConverterGL3x.To(attributeType), attributeLength)); } return vertexAttributes; }
public FragmentOutputsGL3x(ShaderProgramNameGL3x program) { _program = program; }
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 UniformCollection FindUniforms(ShaderProgramNameGL3x program) { int programHandle = program.Value; int numberOfUniforms; GL.GetProgram(programHandle, ProgramParameter.ActiveUniforms, out numberOfUniforms); int uniformNameMaxLength; GL.GetProgram(programHandle, ProgramParameter.ActiveUniformMaxLength, out uniformNameMaxLength); UniformCollection uniforms = new UniformCollection(); for (int i = 0; i < numberOfUniforms; ++i) { int uniformNameLength; int uniformSize; ActiveUniformType uniformType; StringBuilder uniformNameBuilder = new StringBuilder(uniformNameMaxLength); GL.GetActiveUniform(programHandle, i, uniformNameMaxLength, out uniformNameLength, out uniformSize, out uniformType, uniformNameBuilder); string uniformName = CorrectUniformName(uniformNameBuilder.ToString()); if (uniformName.StartsWith("gl_", StringComparison.InvariantCulture)) { // // Names starting with the reserved prefix of "gl_" have a location of -1. // continue; } // // Skip uniforms in a named block // int uniformBlockIndex; GL.GetActiveUniforms(programHandle, 1, ref i, ActiveUniformParameter.UniformBlockIndex, out uniformBlockIndex); if (uniformBlockIndex != -1) { continue; } if (uniformSize != 1) { // TODO: Support arrays throw new NotSupportedException("Uniform arrays are not supported."); } int uniformLocation = GL.GetUniformLocation(programHandle, uniformName); uniforms.Add(CreateUniform(uniformName, uniformLocation, uniformType)); } return uniforms; }
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); }