首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL统一缓冲区对象(数组)跳过所有其他Vec2

OpenGL统一缓冲区对象(数组)跳过所有其他Vec2
EN

Stack Overflow用户
提问于 2014-11-11 22:19:03
回答 1查看 729关注 0票数 1

问题

这些白线之间不应该有空白。这些行是由正方形组成的(最终,我不会只生成另一个巨大的方块;这是用于调试的)。由于某些原因,当我通过统一缓冲区对象(例如下面的例子)发送数据时,我得到的是空白。就好像它跳过了所有其他的y值。实际上每个位置上有两个正方形,而不是一个在(y)和一个在(y + 1)处。

代码段

生成数据指针数组

代码语言:javascript
复制
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);
    }
}

呈现类中的

代码语言:javascript
复制
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);

顶点着色器

代码语言:javascript
复制
layout (std140) uniform blockData {
    vec2 blockDataPosition[5184];
};

测试

  • 当我将blockData[i] = glm::vec2(x, y);改为blockData[i] = glm::vec2(y, x); (切换y和x)时,间隙移动到x轴.
  • 我尝试过切换for循环中的x和y,但是它不影响它。这个问题在某种程度上与y变量有关。
  • 如果我在int i = x * 24 + y;中切换x和y,会产生什么影响?
  • 将vec2设置为(x,x)将导致正确放置对角线。
  • 将vec2设置为(y,y)会产生奇怪的对角线(如下所示)
  • 在切换到UBO之前,我只是在着色器中使用制服,效果很好。这就是为什么我相信这与我通过UBO发送数据有关。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-12 23:02:36

那么,目前发生的事情很可能是一个对齐问题。使用std140,您必须对齐4个浮标。但是,如果没有看到所有的代码,我就不可能完全确定您是如何缓冲数据的。但是,我可以建议的是使用glGetActiveUniformsiv查询块偏移量,然后在此基础上对齐对象。一个典型的例子是:

代码语言:javascript
复制
    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循环来填充每个偏移量,或者只需打印出来,查看所有内容是如何对齐的。这不应该在循环中完成,而是一次用于初始化和诸如此类。如果你有任何问题或需要一个更具体的例子,请告诉我。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26875669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档