Объединение двух текстур в фрагментный шейдер - PullRequest
0 голосов
/ 11 февраля 2012

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

#version 110

uniform sampler2D diffuseMap;
uniform sampler2D lightingMap;

void main()
{
    vec4 color = texture(diffuseMap, gl_TexCoord[0].st);
    vec4 lighting = texture(lightingMap, gl_TexCoord[0].st);

    vec4 finalColor = color;

    gl_FragColor = finalColor;
}

Разве это не должно приводить к тому же, что и рисование диффузной карты прямо вверх?

Я установил sampler2d этим методом

void ShaderProgram::setUniformTexture(const std::string& name, GLint t) {
    GLint var = getUniformLocation(name);
    glUniform1i(var, t);
}

GLint ShaderProgram::getUniformLocation(const std::string& name) {
    if(mUniformValues.find(name) != mUniformValues.end()) {
        return mUniformValues[name];
    }

    GLint var = glGetUniformLocation(mProgram, name.c_str());
    mUniformValues[name] = var;

    return var;
}

РЕДАКТИРОВАТЬ: Еще немного информации. Вот код, где я использую шейдер. Я установил две текстуры и нарисовал пустой квадрат для шейдера. Я точно знаю, что мои цели рендеринга работают, как я уже говорил, потому что я могу хорошо их рисовать, используя тот же getTextureId, что и здесь.

    graphics->useShader(mLightingCombinedShader);
    mLightingCombinedShader->setUniformTexture("diffuseMap", mDiffuse->getTextureId());
    mLightingCombinedShader->setUniformTexture("lightingMap", mLightMap->getTextureId());
    graphics->drawPrimitive(mScreenRect, 0, 0);
        graphics->clearShader();



void GraphicsDevice::useShader(ShaderProgram* p) {
    glUseProgram(p->getId());
}

void GraphicsDevice::clearShader() {
    glUseProgram(0);
}

И вершинный шейдер

#version 110 

varying vec2 texCoord;

void main() 
{ 
    texCoord = gl_MultiTexCoord0.xy;
    gl_Position = ftransform();

}

Ответы [ 3 ]

1 голос
/ 11 февраля 2012

В GLSL версии 110 вы должны использовать:

texture2D(diffuseMap, gl_TexCoord[0].st); // etc.

вместо функции текстур.

А затем, чтобы объединить текстуры, просто умножьте цвета вместе, т.е.

gl_FragColor = color * lighting;
0 голосов
/ 16 февраля 2012

Проблема закончилась тем, что я не включил координаты текстуры для прямоугольника экрана, который рисовал.

0 голосов
/ 11 февраля 2012
glUniform1i(var, t);

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

...