在OpenGL

时间:2017-09-07 08:34:00

标签: c++ opengl

我在将实例化数据与非实例数据混合时遇到了一些困难。

我拥有的是GLfloat s数组和GLuint s数组。

GLuint是我用于渲染元素的索引数据。我的GLfloat是顶点,纹素和深度信息。

我正在做的是收集渲染一系列四边形所需的所有数据,并将它们全部提交:

  • 每个Quad都有:
    • 四个顶点:
      • 顶点位置的2个浮点数
      • 2个浮点数用于纹理位置
    • 一个深度浮动
    • 提交到索引缓冲区的6个索引

他们按顺序排列。因此,在一个纹理的blit之后,我希望将所有这些显示到屏幕的范围,我希望看到(拉伸整个纹理以适应屏幕)(右上,右下,左下,顶部 - 左)(纹理坐标可能看起来翻转,但它们是正确的):

浮动缓冲区

[ 1 | -1 | 1 | 0 ] [ 1 | 1 | 1 | 1 ] [ -1 | 1 | 0 | 1 ] [ -1 | -1 | 0 | 0 ] [ 0.9 ]
[  pos   |  tex  ] [  pos  |  tex  ] [   pos  |  tex  ] [   pos   |  tex  ] [depth]

Uint缓冲区

[ 0 | 1 | 3 | 3 | 1 | 2 ]

如果不清楚,四边形的四个顶点中的每一个都要在其碎片中使用相同的深度值。

所以,我设置缓冲区如下:

uint32_t maxNum = 32; // this is the max amount I can submit

glGenBuffers(1, &m_vbo); // to store my vertex positions, texels and depth

glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
    glBufferData(GL_ARRAY_BUFFER, 17 * maxNum, nullptr, GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

glGenBuffers(1, &m_indicesBuffer); // to store the indices

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indicesBuffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, 6 * maxNum, nullptr, GL_DYNAMIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

glGenVertexArrays(1, &m_vertexArrayObject);
glBindVertexArray(m_vertexArrayObject);

    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
    glEnableVertexAttribArray(2);
    glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
        glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 17, 0);
        glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 17, (void*)(sizeof(GLfloat)*2));
        glVertexAttribPointer(2, 1, GL_FLOAT, GL_FALSE, 17, (void*)(sizeof(GLfloat)*16));
        glVertexAttribDivisor(0,0);
        glVertexAttribDivisor(1,0);
        glVertexAttribDivisor(2,4);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indicesBuffer);


glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

填充缓冲区和绘图就是这样。 vertexAndTexelDataindicesData是上面讨论的GLfloatGLuint缓冲区。 numSubmitted是我实际绘制的数量。

glBindTexture(GL_TEXTURE_2D, texture);

        glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
            glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(GLfloat) * vertexAndTexelData.size(), vertexAndTexelData.data());
        glBindBuffer(GL_ARRAY_BUFFER, 0);

        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_indicesBuffer);
            glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(GLuint) * indicesData.size(), indicesData.data());
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

        glBindVertexArray(m_vertexArrayObject);
            glDrawElementsInstanced(GL_TRIANGLES,indicesData.size(),GL_UNSIGNED_INT,(const void*)0,numSubmitted);
        glBindVertexArray(0);

当我画出这一切时,我得到一个黑屏。如果我拿出深度数据和实例绘图的东西,一切都很好。所以我猜测它与实例绘图有关。

如果我通过RenderDoc进行此操作,请参阅以下内容:

缓冲区绑定 enter image description here

所以我可以看到我的三个顶点属性似乎设置正确。

顶点属性格式 enter image description here

所以这些似乎是正确的布局和正确的数据类型。

网格输出 但是,如果我查看提交的网格数据... enter image description here

有些事情显然是错误的。深度值似乎都是正确的,因此看起来实例化绘图正在那里工作。

但很明显,这些位置和纹素都被破坏了。有趣的是,如果没有垃圾值,即-101,那么该位置是正确的。

我怀疑它是步幅或偏移还是某种东西......但我无法看到这个问题。

0 个答案:

没有答案