我有一些代码来设置我的顶点属性指针以进行渲染:
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;
它设置缓冲区的属性如下:
通过调用:
创建surfaceRendererAppendSurface(renderer, 100, 100, 48, 48, glfwTime, 1);
surfaceRendererAppendSurface(renderer, 200, 100, 48, 48, glfwTime, 1);
可以看出,数据正确地发送到GPU,第一个实例正确绘制,GPU正在绘制足够数量的实例,但是当我分析我的应用程序时,第二个,第三个或第四个实例是所有错误,不遵循提供的缓冲...这让我相信它是一个分裂的问题甚至更奇怪的是,当我将我的除数切换为2时,第二个实例绘制得很好,然后3 ,第三个是正确绘制的...这很奇怪,我不知道发生了什么......
(现在看看......看起来像vertexAttribDivisor没有效果!)
答案 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解释为紧密排列的数组,因此屏幕截图中的数据非常有意义。