[英]OpenGL: Zero active uniforms
我指的是 OpenGL SuperBible。 我使用他们的框架来创建自己的程序。 我想用接口块(特别是统一块)做一些事情。 如果我打电话
glGetActiveUniformsiv(program, 1, uniformIndices, GL_UNIFORM_OFFSET, uniformOffsets);
我收到一个错误,即GL_INVALID_VALUE
。 但是如果我用 0 而不是 1 调用同一个函数,它就不会出错。 我当时假设,我没有现役制服。 不过,我应该有 3 个。 我如何激活它们? 这是我的着色器:
#version 450 core
layout (location = 0) in vec4 position;
layout (location = 1) in vec4 color;
out vec4 vs_color;
uniform TransformBlock {
mat4 translation;
mat4 rotation;
mat4 projection_matrix;
};
void main(void)
{
mat4 mvp = projection_matrix * translation * rotation ;
gl_Position = mvp * position;
vs_color = color;
}
以下是启动方法中的一些代码:
static const GLchar* uniformNames[3] = {
"TransformBlock.translation",
"TransformBlock.rotation",
"TransformBlock.projection_matrix",
};
GLuint uniformIndices[3];
glUseProgram(program);
glGetUniformIndices(program, 3, uniformNames, uniformIndices);
GLint uniformOffsets[3];
GLint matrixStrides[3];
glGetActiveUniformsiv(program, 3, uniformIndices, GL_UNIFORM_OFFSET, uniformOffsets);
glGetActiveUniformsiv(program, 3, uniformIndices, GL_UNIFORM_MATRIX_STRIDE, matrixStrides);
unsigned char* buffer1 = (unsigned char*)malloc(4096);
//fill buffer1 in a for-loop
GLuint block_index = glGetUniformBlockIndex(program, "TransformBlock");
glUniformBlockBinding(program, block_index, 0);
glBindBufferBase(GL_UNIFORM_BUFFER, 0, (GLuint)buffer1);
free(buffer1);
但是,由于函数返回GL_INVALID_VALUE
,调用出现错误:
*((float *)(buffer1 + offset)) = ...
并且整个程序中断。 如果不添加offset
,我不会在这里收到错误,所以我认为第二个错误取决于第一个错误。
我认为glGetUniformIndices
出错了,因为您在统一名称前加上TransformBlock
。 您也不会使用它来访问 GLSL 代码中带有该前缀的制服。 如果需要,则必须为统一块设置实例名称,块名称与访问/命名统一块完全无关。 如果将访问同一接口块的多个着色器链接在一起,则它仅用于匹配接口。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.