私は一種のライトベイクをしようとしています.アイデアは、メインパスで使用中のテクスチャがすでにシェーディングされるように、プリパスでライトをテクスチャに「ベイク」することです.私は次のようにします:
- 入力テクスチャのサイズで FBO とテクスチャ アタッチメントを作成します。
- 入力テクスチャをバインドし、全画面クワッドにレンダリングします。
- 3D メッシュに (ライトをベイクした) 出力テクスチャを使用します。
現在は動作しません.結果は黒です.頂点がモデルビュープロジェクションマトリックスで変換されたときにフラグメント座標が期待されるものと異なるという事実に関連していると思います(私の場合、正規化された頂点座標はすぐに)。
ここに私の頂点シェーダーがあります:
#version 420 core
layout(location = 0) in vec4 position;//vertices are in range [-1,1]
layout(location = 1) in vec2 uvs;
layout(location = 2) in vec3 normal;
uniform mat4 MODEL_VIEW_MATRIX;
noperspective out vec2 vTexcoord;
out vec3 Position;
out smooth vec3 Normal;
out gl_PerVertex
{
vec4 gl_Position;
};
void main() {
vTexcoord = position.xy * 0.5 + 0.5;
Normal = vec3(normalize(MODEL_VIEW_MATRIX * vec4(normal,0)));
Position = vec3(MODEL_VIEW_MATRIX * position);
gl_Position = vec4( position.xy ,0.0 , 1.0 );
}
フラグメント シェーダー:
void main() {
ivec2 tsize = textureSize(COLOR_MAP_0, 0);
vec2 texcoord = gl_FragCoord.xy * (1.0 / vec2(tsize));
fResult = texture(COLOR_MAP_0 , texcoord) ;
fResult.rgb *= pointlightType(0 , Position , Normal);// typical point light algo
}
ここで何が欠けていますか?また、私の場合、深度バッファは利用できません。
アップデート:
解決しました。問題は、一部のユニフォームがシェーダーに渡されないことでした。私の場合、ソース テクスチャとターゲット テクスチャの両方が同じ寸法であるため、実装は簡単でした。