
问题
这些白线之间不应该有空白。这些行是由正方形组成的(最终,我不会只生成另一个巨大的方块;这是用于调试的)。由于某些原因,当我通过统一缓冲区对象(例如下面的例子)发送数据时,我得到的是空白。就好像它跳过了所有其他的y值。实际上每个位置上有两个正方形,而不是一个在(y)和一个在(y + 1)处。
代码段
生成数据指针数组
blockData = new glm::vec2[24*24];
for (int x = 0; x < 24; x++) {
for (int y = 0; y < 24; y++) {
int i = x * 24 + y;
blockData[i] = glm::vec2(x, y);
}
}呈现类中的
glBindBuffer(GL_UNIFORM_BUFFER, ubo);
glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(glm::vec2) * blocksActive, blockData);
glBindBufferRange(GL_UNIFORM_BUFFER, uniBlockData, ubo, 0, sizeof(glm::vec2) * blocksActive);
glBindBuffer(GL_UNIFORM_BUFFER, 0);
glBindVertexArray(vao);
glDrawElementsInstanced(GL_TRIANGLES, 6, GL_UNSIGNED_INT, (void*)0, blocksActive);
glBindVertexArray(0);顶点着色器
layout (std140) uniform blockData {
vec2 blockDataPosition[5184];
};测试
blockData[i] = glm::vec2(x, y);改为blockData[i] = glm::vec2(y, x); (切换y和x)时,间隙移动到x轴.int i = x * 24 + y;中切换x和y,会产生什么影响?
发布于 2014-11-12 23:02:36
那么,目前发生的事情很可能是一个对齐问题。使用std140,您必须对齐4个浮标。但是,如果没有看到所有的代码,我就不可能完全确定您是如何缓冲数据的。但是,我可以建议的是使用glGetActiveUniformsiv查询块偏移量,然后在此基础上对齐对象。一个典型的例子是:
char* bufferNames[] = [generate the values with a for loop, this should be pretty easy with string and sprintf e.g "blockData.blockDataPosition[0]" to "block.Data.blockDataPosition[5184]"];
GLuint uniformBlockIndex = glGetUniformBlockIndex(yourprogram, "block name");
GLuint uniformIndices[number of names in bufferNames];
glGetUniformIndices(yourprogram, the number of names in bufferNames, bufferNames, indices);
GLint uniformOffsets[the number of names in bufferNames];
glGetActiveUniformsiv(yourprogram, 1, &uniformIndices, GL_UNIFORM_OFFSET, uniformOffsets);补偿会告诉你你需要知道的一切。它们是每个名称的偏移量(以字节为单位)。您可以使用for循环来填充每个偏移量,或者只需打印出来,查看所有内容是如何对齐的。这不应该在循环中完成,而是一次用于初始化和诸如此类。如果你有任何问题或需要一个更具体的例子,请告诉我。
https://stackoverflow.com/questions/26875669
复制相似问题