【问题标题】:Incorrectly updated uniform buffer错误更新的统一缓冲区
【发布时间】: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


【解决方案1】:

OpenGL 4.6 API Core Profile Specification - 7.6.2.1 Uniform Buffer Object Storage:

bool、int、uint、float 和 double 类型的成员分别是 通过读取单个 uint、int、uint、float 来从缓冲区对象中提取, 或指定偏移量处的双精度值。

这意味着您需要在缓冲区中为布尔值设置一个 4 字节值(无符号 32 位)。将布尔值转换为 32 位整数值 0 或 1 并将其存储在缓冲区中。

【讨论】:

  • 我把 int 放在那里,没有任何变化
猜你喜欢
  • 1970-01-01
  • 2016-12-14
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多