【发布时间】:2021-01-06 20:15:52
【问题描述】:
我在着色器中有一个统一的缓冲区,如下所示:
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);
}
它会更新,但会同时更新所有对象,尽管我会在渲染每个对象之前对其进行更新。要么每个人都受到相机的影响。缓冲区中的另外两个变量 - 矩阵工作正常。
【问题讨论】:
-
@Rabbid76 我读到 0 转换为 false,1 转换为 true
-
奇怪,我删除了
glBindBuffer(GL_UNIFORM_BUFFER, bufferID);行,它起作用了。不明白为什么。 -
为什么不直接将
cam设为不使用的单位矩阵,顺便说一句?
标签: java opengl glsl buffer lwjgl