Проблемы с пониманием индексов буфера OpenGL - PullRequest
0 голосов
/ 28 октября 2019

У меня есть некоторый код 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 должно совпадать с расположением макета в скрипте шейдера, но, видимо, это не так просто. Может ли кто-нибудь объяснить, как индексы буфера работают полностью, чтобы я мог получить это право надежно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...