私は自分のゲームに遅延シェーディングを実装しようとしています。拡散テクスチャをレンダリングターゲットにレンダリングし、レンダリングターゲットにレンダリングされた照明を持っています。どちらも私が知っているので、問題なく画面にまっすぐに表示できるので、問題ありません。私がしたいことは、拡散マップとライトマップの両方をシェーダで結合して最終的な画像を作成することです。ここに私の現在のフラグメントシェーダがあります。その結果、黒い画面になります。フラグメントシェーダで2つのテクスチャを組み合わせる
#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;
}
拡散マップをまっすぐ上に描画するのと同じ結果になるべきではありませんか?
私はこの方法
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;
}
EDITでsampler2dを設定します。いくつかのより多くの情報。ここでシェーダを使用するコードを示します。 2つのテクスチャを設定し、シェーダが使用するための空白の四角形を描きます。私がここでやったのと同じgetTextureIdを使って上手く描くことができるので、私が前に言ったように、私のレンダーターゲットが動作していることは確かです。 GLSLバージョンあなたが使うべき110で
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();
}
2つのテクスチャを組み合わせる前に、* 1つのテクスチャを使用できることを確認してください。 –