Фрагментный шейдер, кажется, не работает после объединения GL_TEXTURE_BUFFER и GL_TEXTURE_1D - PullRequest
1 голос
/ 09 июня 2019

В настоящее время я пытаюсь реализовать фрагментный шейдер, который смешивает цвета разных частиц жидкости, комбинируя процентное содержание фаз жидкости внутри частицы.Так, например, если жидкость 1 обладает 15% частицы, а жидкость 2 имеет 85%, результирующий цвет должен отражать эту пропорцию.Поэтому у меня есть буферная текстура, содержащая процент, отраженный как значение с плавающей точкой в ​​[0,1] на частицу и на фазу, и текстура, содержащая текучие цвета.

Текстура буфера в настоящее время содержит проценты для каждой частицы в последующем списке.Вот например:

|Частица 1 процент 1 |Частица 1 процент 2 |Частица 2 процент 1 |Частица 2 процент 2 |...

Я уже проверил правильность текстур, назначив их частицам напрямую или назначив volFrac красной части конечного цвета.Я также пробовал разные отладчики GLSL, пытаясь проанализировать проблему, но ни одна из популярных опций не работала на моей машине после попытки.

#version 330

uniform float radius;
uniform mat4 projection_matrix;

uniform uint nFluids;

uniform sampler1D colorSampler;
uniform samplerBuffer volumeFractionSampler;

in block
{
    flat vec3 mv_pos;
    flat float pIndex;
}
In;

out vec4 out_color;

void main(void)
{
    vec3 fluidColor = vec3(0.0, 0.0, 0.0);

    for (int fluidModelIndex = 0; fluidModelIndex < int(nFluids); fluidModelIndex++)
    {
        float volFrac = texelFetch(volumeFractionSampler, int(nFluids * In.pIndex) + fluidModelIndex).x;

        vec3 phaseColor = texture(colorSampler, float(fluidModelIndex)/(int(nFluids) - 1)).xyz;

        fluidColor = volFrac * phaseColor;
    }

    out_color = vec4(fluidColor, 1.0);
}

А также короткий фрагмент инициализации текстуры

    //Texture Initialisation and Manipulation here
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_1D, m_textureMap);

    glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB, nFluids, 0, GL_RGB, GL_FLOAT, color_map);

    //Creation and Initialisation for Buffer Texture containing the volume Fractions
    glBindBuffer(GL_TEXTURE_BUFFER, m_texBuffer);
    glBufferData(GL_TEXTURE_BUFFER, nFluids * nParticles * sizeof(float), m_volumeFractions.data(), GL_STATIC_DRAW);
    glBindBuffer(GL_TEXTURE_BUFFER, 0);

    glBindTexture(GL_TEXTURE_BUFFER, m_bufferTexture);
    glTexBuffer(GL_TEXTURE_BUFFER, GL_R32F, m_texBuffer);

Проблема в том, что если я умножу информацию о текстуре буфера на информацию о текстуре, частицы, которые должны быть визуализированы, исчезнут полностью без каких-либо предупреждений или других сообщений об ошибках.Таким образом, частицы исчезают, если я использую утверждение:

fluidColor = volFrac * phaseColor;

Кто-нибудь знает, почему это так или как я могу отладить эту проблему дальше?

1 Ответ

1 голос
/ 09 июня 2019

Кто-нибудь знает, почему это так

Да. Кажется, вы используете одну и ту же текстурную единицу для colorSampler и volumeFractionSampler, что просто запрещено в соответствии со спецификацией. Цитирование из раздела 7.11 спецификации основного профиля OpenGL 4.6 :

Нельзя иметь переменные разных типов сэмплера, указывающие на один и тот же текстурный блок изображения в программном объекте. Эта ситуация может только быть обнаруженным при следующей выданной команде рендеринга, которая вызывает вызовы шейдеров, и тогда будет сгенерирована ошибка INVALID_OPERATION.

Таким образом, в то время как вы можете связывать разные текстуры, выполняйте разные цели текстурного блока 0 одновременно, каждый вызов рисования может использовать только одну конкретную цель на текстурный блок. Если вы используете только один сэмплер или другой (и шейдерный компилятор будет агрессивно оптимизировать их, если они не влияют на выходы вашего шейдера), вы находитесь в законном случае, но как только вы используете оба, он будет не работает.

...