У меня есть некоторый код 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;
Мне нужно несколько шейдеров, некоторые только с цветом (этот), один только с текстурой, а другой с цветом и текстурой. Для этого я хочу сместить индекс буфера ModelIndices в положение 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 и использовать вместо него glVertexAttribPointer()
, например:
case GfxBuffer::ModelIndices:
glBindBuffer(GL_ARRAY_BUFFER, m_handle);
glVertexAttribPointer(2u, 1, GL_UNSIGNED_INT, GL_FALSE, 0, NULL);
break;
Даже если индекс остается прежним, это не такЭто тоже не работает.
Я думал, что значение index
в вызове OpenGL должно совпадать с расположением макета в скрипте шейдера, но, видимо, это не так просто. Может ли кто-нибудь объяснить, как индексы буфера работают полностью, чтобы я мог получить это право надежно.