【问题标题】:OpenGL instancing : how to debug missing per instance dataOpenGL 实例化:如何调试丢失的每个实例数据
【发布时间】:2016-11-06 16:12:08
【问题描述】:

我对实例化绘图和每个实例数据比较熟悉:我过去成功地实现了这一点。

现在我正在重构一些旧代码,并且我引入了一个关于如何将每个实例数据提供给着色器的错误。 相关位如下:

  1. 我有一个使用 glMultiDrawElementsIndirect 实现的有效渲染循环:如果我忽略每个实例的数据,一切都会按预期绘制。
  2. 我有一个 vbo 存储对象的世界变换。我使用 AMD 的 CodeXL 来调试这个:缓冲区正确填充了数据,并且在绘制框架时被绑定。

    glBindBuffer(GL_ARRAY_BUFFER,batch.mTransformBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(glm::mat4) * OBJ_NUM, &xforms, GL_DYNAMIC_DRAW);

  3. 着色器明确指定输入位置:

    #version 450
    layout(location = 0) in vec3 vertexPos;
    layout(location = 1) in vec4 vertexCol;
    //...
    layout(location = 6)uniform mat4 ViewProj;
    layout(location = 10)uniform mat4 Model;
    

ViewProj 矩阵对于所有实例都是相等的,并且使用以下方法正确设置:

glUniformMatrix4fv(6, 1, GL_FALSE, &viewProjMat[0][0]);

Model 是每个实例的世界矩阵,它是错误的:包含全零。

在绑定缓冲区和绘制每一帧之前,我试图设置属性指针和除数,使每个绘制的实例都会收到不同的变换:

for (size_t i = 0; i < 4; ++i)
{
  glEnableVertexAttribArray(10 + i);

  glVertexAttribPointer(10 + i, 4, GL_FLOAT, GL_FALSE,
                        sizeof(GLfloat) * 16,
                        (const GLvoid*) (sizeof(GLfloat) * 4 * i));

  glVertexAttribDivisor(10 + i, 1);
}

现在,我已经查看了一段时间的代码,但我真的无法弄清楚我缺少什么。 CodeXL 清楚地显示模型(位置 10)未正确填充。不会产生 OpenGL 错误。

我的问题是:有谁知道在什么情况下每个实例数据的设置可能会静默失败?或者有关如何进一步调试此问题的任何建议?

【问题讨论】:

  • 我不太了解设置。 Model 不应该是统一的,它是一个常规属性(......顶点着色器的输入)。您只需在其上设置一个非零除数,然后它将在每个实例的基础上提供(实例编号 i 的所有顶点着色器调用都将获得 i / divisor i> 来自该属性数组的属性)。为什么在上面使用uniform

标签: c++ opengl shader geometry-instancing


【解决方案1】:
layout(location = 6)uniform mat4 ViewProj;
layout(location = 10)uniform mat4 Model;

这些是统一的,而不是输入值。他们不会被属性喂养;他们通过glUniform* 电话获得食物。如果您希望 Model 成为输入值,请使用 in 限定它,而不是 uniform

同样重要的是,输入和制服的位置不同。我的意思是统一位置与输入位置具有不同的空间。输入可以具有与制服相同的位置索引,并且它们不会引用相同的东西。输入位置仅指属性索引;统一位置是指统一位置。

最后,统一位置不像输入位置那样工作。对于属性,每个vec4-equivalent 使用单独的属性索引。使用统一位置,每个基本类型(不是结构或数组的任何东西)都使用一个统一的位置。所以如果ViewProj是一个统一的位置,那么它只占用1个位置。但是如果Model是一个输入,那么它会占用4个属性索引。

【讨论】:

  • 感谢您的解释。这说得通。它解释了为什么调试时我在制服中什么也看不到,但是,更改为“in”似乎不足以解决我的问题。我可能在其他地方有错误!
猜你喜欢
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-27
  • 2014-11-07
  • 1970-01-01
  • 2011-10-22
相关资源
最近更新 更多