OpenGL:零活动制服

OpenGL: Zero active uniforms

本文关键字:制服 活动 OpenGL      更新时间:2023-10-16

>我指的是OpenGL超级圣经。我使用他们的框架来创建自己的程序。我想用接口块(特别是统一块(做一些事情。如果我打电话

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 代码中带有该前缀的制服。如果你想要这个,你必须为制服块设置一个实例名称,块名称与访问/命名制服完全无关。仅当您将访问同一接口块的多个着色器链接在一起时,它才用于匹配接口。