4

私が達成しようとしていること:シーンの上にシーンの深度マップを描画する(オブジェクトが近くにあると暗くなり、遠くにあると明るくなるように)

問題:頂点シェーダーからフラグメントシェーダーに正しいテクスチャ座標を渡す方法がわからないようです。

そこで、FBOと、深度マップが描画されるテクスチャを作成しました...自分が何をしていたかが完全にわかっているわけではありませんが、何であれ、機能します。固定機能パイプラインを使用してテクスチャを描画することをテストしましたが、想定どおりのように見えます(つまりデプスマップ)。

しかし、シェーダーで使用しようとしても機能しません...

テクスチャをバインドするrenderメソッドの部分は次のとおりです。

glActiveTexture(GL_TEXTURE7);
glBindTexture(GL_TEXTURE_2D, depthTextureId);
glUniform1i(depthMapUniform, 7);
glUseProgram(shaderProgram);
look();  //updates my viewing matrix
box.render();   //renders box VBO

だから...そうですね。多分?テクスチャ7が、私がチェックしていたチュートリアルにあったものだった理由はわかりません...

そして、これが私の頂点シェーダーからの重要なものです:

out vec4 ShadowCoord;

void main() {
    gl_Position = PMatrix * (VMatrix * MMatrix) * gl_Vertex;  //projection, view and model matrices
    ShadowCoord = gl_MultiTexCoord0;    //something I kept seeing in examples, was hoping it would work.
}

Aaand、フラグメントシェーダー:

in vec4 ShadowCoord;
in vec3 Color;  //passed from vertex shader, didn't include the code for it though. Just the vertex color.

out vec4 FragColor;

void main(
    FragColor = vec4(texture2D(ShadowMap,shadowCoord.st).x * vec3(Color), 1.0);

ここで問題となるのは、フラグメントシェーダーがテクスチャに対して受け取る座標が常に(0,0)、つまり左下隅であるということです。ShadowCoord = gl_MultiTexCoord7に変更してみました。これは、テクスチャをスロット番号7に配置することに関係があると考えたためです...しかし、残念ながら、問題は解決しませんでした。(0、0)の色が変わると、適切なピクセル/フラグメントのみの色が変わるのではなく、シーン全体の色も変わります。

そして、それは私がいくつかの洞察を得ることを望んでいることです...正しい座標を渡す方法(テクスチャの角が私の画面の角と同じ座標になりたいです)。はい、これは初心者の質問です...しかし、私はOrange Bookを調べていました。問題は、GLSL側では優れているということですが、OpenGL側では、次のような例が大幅に不足しています。私は本当に使うことができました...

4

1 に答える 1

6

入力変数(または 7) は、 (イミディエイト モードを使用する場合) または (配列/VBO を使用する場合)gl_MultiTexCoord0によって設定される、0 番目 (または 7 番目) のテクスチャ座標の組み込みの頂点ごとのテクスチャ座標です。gl(Multi)TexCoordglTexCoordPointer

ただし、深度バッファーは既に画面空間にあるため、必要なのは、オブジェクトに配置された通常のテクスチャではなく、特定のピクセル/フラグメントのテクスチャの値だけです。したがって、頂点シェーダーはまったく関与しません。代わりに、現在のフラグメントの画面空間位置をテクスチャ座標として使用するだけで、フラグメント シェーダーで を使用して読み取ることができますgl_FragCoord。ただし、この座標は [0,w]x[0,h] であり、テクスチャは [0,1] の正規化されたテクスチャ座標によってアクセスされることに注意してください。したがって、フラグメントの座標を画面サイズで割る必要があります。

uniform vec2 screenSize;
...
... texture2D(ShadowMap, gl_FragCoord.st/screenSize) ...

ただし、実際には、このエフェクトに 2 つのパスは必要ありません。フラグメントの深度をテクスチャに書き込まずに直接使用できるためです。それ以外の

texture2D(ShadowMap, gl_FragCoord.st/screenSize).x

あなたはただ使うことができます

gl_FragCoord.z

これは、最初のパスでテクスチャに書き込まれたフラグメントの深度値に他なりません。このようにして、最初の深度書き込みパスと 2 番目のパスでのテクスチャ アクセスを完全に節約できます。

于 2011-10-16T02:33:25.257 に答える