C++ OpenGL:零活动制服
我指的是OpenGL超级圣经。我使用他们的框架来创建自己的程序。我想用接口块(特别是统一块)做一些事情。如果我打电话C++ OpenGL:零活动制服,c++,pointers,opengl,glsl,C++,Pointers,Opengl,Glsl,我指的是OpenGL超级圣经。我使用他们的框架来创建自己的程序。我想用接口块(特别是统一块)做一些事情。如果我打电话 glGetActiveUniformsiv(program, 1, uniformIndices, GL_UNIFORM_OFFSET, uniformOffsets); 我得到一个错误,即GL\u无效\u值。 但是如果我用0而不是1调用同一个函数,它不会出错。我当时以为我没有现役制服。不过,我应该有三个。 如何激活它们?这是我的着色器: #version 450 core
glGetActiveUniformsiv(program, 1, uniformIndices, GL_UNIFORM_OFFSET, uniformOffsets);
我得到一个错误,即GL\u无效\u值
。
但是如果我用0而不是1调用同一个函数,它不会出错。我当时以为我没有现役制服。不过,我应该有三个。
如何激活它们?这是我的着色器:
#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\u INVALID\u值
,调用出现错误:
*((float *)(buffer1 + offset)) = ...
整个程序中断了。如果不添加
偏移量
,我不会在这里得到错误,因此我认为第二个错误取决于第一个错误。我认为在glGetUniformIndicates
处出错,因为您在统一名称前面加了TransformBlock
。你也不能用它来访问GLSL代码中带有前缀的制服。如果需要,必须为统一块设置一个实例名,该块名与访问/命名统一完全无关。仅当将访问同一接口块的多个着色器链接在一起时,它才用于匹配接口 我认为glGetUniformIndications
会出错,因为您在统一名称前面加了TransformBlock
。你也不能用它来访问GLSL代码中带有前缀的制服。如果需要,必须为统一块设置一个实例名,该块名与访问/命名统一完全无关。仅当将访问同一接口块的多个着色器链接在一起时,它才用于匹配接口 非常感谢!我认为这有很大帮助。现在我对我的问题进行了“编辑”。你也能帮我做这个吗?您可以在问题的底部找到编辑。我认为您需要在调用glDrawArrays之前在渲染函数中绑定UBO。非常感谢!我认为这有很大帮助。现在我对我的问题进行了“编辑”。你也能帮我做这个吗?您可以在问题的底部找到编辑。我认为您需要在调用glDrawArrays之前在渲染函数中绑定UBO。我认为您应该为一个全新的问题提出一个新问题。乍一看,现在看来你的vertex attrib指针设置是错误的。我只是想我必须再次对整个代码段进行注释。再次对相同的代码段进行注释有点多余。或者这是一个全新的问题,与现在的问题无关?可以说,在我将设置更改为基于块的统一结构之前,整个代码都工作了。所以我不知道问题是否出在顶点属性上。当然可能,我不是专家。如果这个问题是全新的,我当然会开始一个新的话题。看起来像一个全新的问题。我想你应该为一个全新的问题提出一个新的问题。乍一看,现在看来你的vertex attrib指针设置是错误的。我只是想我必须再次对整个代码段进行注释。再次对相同的代码段进行注释有点多余。或者这是一个全新的问题,与现在的问题无关?可以说,在我将设置更改为基于块的统一结构之前,整个代码都工作了。所以我不知道问题是否出在顶点属性上。当然可能,我不是专家。如果这个问题是全新的,我当然会开始一个新的话题。看起来像是全新的问题