Я работаю над внедрением отложенного затенения в мою игру. Я отрисовал диффузные текстуры для цели рендеринга, и у меня есть рендеринг освещения для цели рендеринга. И то, и другое хорошо известно, потому что я могу без проблем отобразить их прямо на экране. То, что я хочу сделать, это объединить диффузную карту и карту освещения в шейдере, чтобы создать окончательное изображение. Вот мой текущий фрагментный шейдер, который приводит к черному экрану.
#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();
}