Vertex Attrib除数不适用于实例渲染

时间:2018-04-22 03:11:46

标签: c opengl glsl instance

我有一些代码来设置我的顶点属性指针以进行渲染:

  glBindBuffer(GL_ARRAY_BUFFER, renderer->instancesBuffer);
  enableFloatVertexAttribute(attributePosition, 2, sizeof(struct surfaceInstance), 0, 1);
  enableFloatVertexAttribute(attributeSize, 2, sizeof(struct surfaceInstance), (void*) (2 * sizeof(float)), 1);
  enableFloatVertexAttribute(attributeAngle, 1, sizeof(struct surfaceInstance), (void*) (4 * sizeof(float)), 1);
  enableFloatVertexAttribute(attributeIdentifier, 1, sizeof(struct surfaceInstance), (void*) (5 * sizeof(float)), 1);
  enableFloatVertexAttribute(attributeAtlasOffset, 2, sizeof(struct surfaceInstance), (void*) (6 * sizeof(float)), 1);
  enableFloatVertexAttribute(attributeTextureSize, 2, sizeof(struct surfaceInstance), (void*) (8 * sizeof(float)), 1);
...
void enableFloatVertexAttribute(int32_t attribute, uint32_t size, uint32_t stride, void const *offset, uint32_t divisor) {
  glEnableVertexAttribArray(attribute);
  glVertexAttribPointer(attribute, size, GL_FLOAT, stride, GL_FALSE, offset);
  if(divisor != 0) glVertexAttribDivisor(attribute, divisor);
}
...
layout(location = 0) in vec2 vertex;
layout(location = 1) in vec2 position;
layout(location = 2) in vec2 size;
layout(location = 3) in float angle;
layout(location = 4) in float identifierPass;
layout(location = 5) in vec2 atlasOffset;
layout(location = 6) in vec2 textureSize;

![enter image description here

它设置缓冲区的属性如下:

enter image description here

通过调用:

创建
surfaceRendererAppendSurface(renderer, 100, 100, 48, 48, glfwTime, 1);
surfaceRendererAppendSurface(renderer, 200, 100, 48, 48, glfwTime, 1);

可以看出,数据正确地发送到GPU,第一个实例正确绘制,GPU正在绘制足够数量的实例,但是当我分析我的应用程序时,第二个,第三个或第四个实例是所有错误,不遵循提供的缓冲...这让我相信它是一个分裂的问题甚至更奇怪的是,当我将我的除数切换为2时,第二个实例绘制得很好,然后3 ,第三个是正确绘制的...这很奇怪,我不知道发生了什么......

例证:实例1 =完全复制! enter image description here

实例=到底发生了什么? enter image description here

(现在看看......看起来像vertexAttribDivisor没有效果!)

1 个答案:

答案 0 :(得分:0)

  

(现在看看......看起来像vertexAttribDivisor没有效果!)

对我来说,看起来stride已完全关闭。瞧,您交换了函数参数:

glVertexAttribPointer(attribute, size, GL_FLOAT, stride, GL_FALSE, offset);
                                                         ^^^^^^^^ this is actually what you set as stride

由于GL_FALSE为0,并且GL将步幅0解释为紧密排列的数组,因此屏幕截图中的数据非常有意义。