统一缓冲区更新不正确

eyh26e7m  于 2021-06-26  发布在  Java
关注(0)|答案(1)|浏览(398)

我在着色器中有一个统一的缓冲区,如下所示:

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); 
}

它会更新,但对于所有对象都是一次更新的,尽管我会在渲染每个对象之前更新它。不是每个人都受摄像机的影响就是不受影响。缓冲矩阵中的另外两个变量工作正常。

ddrv8njm

ddrv8njm1#

请参阅opengl 4.6 api核心配置文件规范-7.6.2.1统一缓冲区对象存储:
通过在指定偏移量处读取单个uint、int、uint、float或double值,分别从缓冲区对象中提取bool、int、uint、float和double类型的成员。
这意味着您需要在缓冲区中为布尔值设置一个4字节的值(无符号32位)。将布尔值转换为32位整数值0或1,并将其存储在缓冲区中。

相关问题