我在将实例化数据与非实例数据混合时遇到了一些困难。
我拥有的是GLfloat
s数组和GLuint
s数组。
GLuint
是我用于渲染元素的索引数据。我的GLfloat
是顶点,纹素和深度信息。
我正在做的是收集渲染一系列四边形所需的所有数据,并将它们全部提交:
他们按顺序排列。因此,在一个纹理的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);
填充缓冲区和绘图就是这样。 vertexAndTexelData
和indicesData
是上面讨论的GLfloat
和GLuint
缓冲区。 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进行此操作,请参阅以下内容:
所以我可以看到我的三个顶点属性似乎设置正确。
所以这些似乎是正确的布局和正确的数据类型。
有些事情显然是错误的。深度值似乎都是正确的,因此看起来实例化绘图正在那里工作。
但很明显,这些位置和纹素都被破坏了。有趣的是,如果没有垃圾值,即-1
,0
或1
,那么该位置是正确的。
我怀疑它是步幅或偏移还是某种东西......但我无法看到这个问题。