我在着色器中有一个统一的缓冲区,如下所示:
layout (std140) uniform transform {
mat4 projection;
mat4 cam;
bool enabledCam;
};
随后,我使用一个变量“enabledcam”来确定是否将摄影机矩阵应用于对象。
if (enabledCam) {
gl_Position = projection * cam * model * vec4(pos, 1.0f);
} else {
gl_Position = projection * model * vec4(pos, 1.0f);
}
在“enabledcam”只是一个统一的变量之前,一切都正常工作,但当将其传输到缓冲区时,它并没有正常工作。我更新代码中的变量如下:
public void setEnabledCam(boolean enabledCam) {
glBindBuffer(GL_UNIFORM_BUFFER, bufferID);
ByteBuffer bf = BufferUtils.createByteBuffer(4);
bf.putInt(enabledCam ? 1 : 0);
bf.flip();
glBufferSubData(GL_UNIFORM_BUFFER, 128, bf);
}
缓冲区初始化:
int blockID = glGetUniformBlockIndex(programId, "transform");
if (blockID != -1) {
GL31.glUniformBlockBinding(programId, blockID, 0);
bufferID = glGenBuffers();
glBindBuffer(GL_UNIFORM_BUFFER, bufferID);
glBufferData(GL_UNIFORM_BUFFER, 132, GL_STATIC_DRAW);
GL30.glBindBufferBase(GL_UNIFORM_BUFFER, 0, bufferID);
}
它会更新,但对于所有对象都是一次更新的,尽管我会在渲染每个对象之前更新它。不是每个人都受摄像机的影响就是不受影响。缓冲矩阵中的另外两个变量工作正常。
1条答案
按热度按时间ddrv8njm1#
请参阅opengl 4.6 api核心配置文件规范-7.6.2.1统一缓冲区对象存储:
通过在指定偏移量处读取单个uint、int、uint、float或double值,分别从缓冲区对象中提取bool、int、uint、float和double类型的成员。
这意味着您需要在缓冲区中为布尔值设置一个4字节的值(无符号32位)。将布尔值转换为32位整数值0或1,并将其存储在缓冲区中。