理解OpenGL缓冲区索引有困难

理解OpenGL缓冲区索引有困难,opengl,Opengl,我有一些OpenGL代码可以工作: ... excerpt from shader script layout(location = 0) in vec3 position;\n\ layout(location = 1) in vec3 vert_colour;\n\ layout(location = 2) in uint model_idx;\n\ layout(std430, binding = 4) buffer model_ssbo\n\ ... ... excerpt from

我有一些OpenGL代码可以工作:

... excerpt from shader script
layout(location = 0) in vec3 position;\n\
layout(location = 1) in vec3 vert_colour;\n\
layout(location = 2) in uint model_idx;\n\
layout(std430, binding = 4) buffer model_ssbo\n\
...

... excerpt from code
    case GfxBuffer::PositionData:
        glBindBuffer(GL_ARRAY_BUFFER, m_handle);
        glVertexAttribPointer(0u, 3, GL_FLOAT, GL_FALSE, 0, NULL);
        break;

    case GfxBuffer::ColourData:
        glBindBuffer(GL_ARRAY_BUFFER, m_handle);
        glVertexAttribPointer(1u, 3, GL_FLOAT, GL_FALSE, 0, NULL);
        break;

    case GfxBuffer::ModelIndices:
        glBindBuffer(GL_ARRAY_BUFFER, m_handle);
        glVertexAttribIPointer(2u, 1, GL_UNSIGNED_INT, 0, NULL);
        break;

    case GfxBuffer::ModelData:
        glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 4u, m_handle);
        break;

    case GfxBuffer::VertexIndices:
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_handle);
        break;
我想要几个着色器,一些只有颜色(这一个),一个只有纹理,还有一个有颜色和纹理。为此,我想将ModelIndexs缓冲区索引移到位置3,以便为UV阵列腾出空间。像这样:

...
layout(location = 0) in vec3 position;\n\
layout(location = 1) in vec3 vert_colour;\n\
layout(location = 3) in uint model_idx;\n\
layout(std430, binding = 4) buffer model_ssbo\n\
...

...
    case GfxBuffer::ModelIndices:
        glBindBuffer(GL_ARRAY_BUFFER, m_handle);
        glVertexAttribIPointer(3u, 1, GL_UNSIGNED_INT, 0, NULL);
        break;
...
这不管用。谁能告诉我为什么

我还尝试将其保留在索引2中,并使用
glvertexattributepointer()
,如下所示:

    case GfxBuffer::ModelIndices:
        glBindBuffer(GL_ARRAY_BUFFER, m_handle);
        glVertexAttribPointer(2u, 1, GL_UNSIGNED_INT, GL_FALSE, 0, NULL);
        break;
即使索引保持不变,这也不起作用


我认为OpenGL调用中的
index
的值需要匹配着色器脚本中的布局位置,但显然这并不容易。任何人都可以解释缓冲区索引是如何充分工作的,这样我才能可靠地做到这一点。

“我认为OpenGL调用中的索引值需要与布局位置匹配”-当然,属性索引是通用顶点属性数据数组和顶点着色器输入变量之间的绑定。因此,问题必须是代码中的其他地方。您是否也在中更改了索引?请注意,顶点着色器输入和存储缓冲区是不同类型的资源。索引绑定点对于每种类型的资源都必须是唯一的。所以使用
layout(location=0)
作为输入和
layout(std430,binding=0)
作为存储缓冲区并不冲突。Rabbid,你是个天才。非常感谢。我错过了调用GlenableVertexAttributeArray()。我还阅读了关于存储缓冲区的Khronos信息,但不理解。你的解释好多了。如果你能把你的评论作为一个恰当的回答,我将非常感激,这样我就可以接受并投票表决了。