0

テクスチャのアルファが != 1 であるオブジェクトによるシャドウ キャスティングの修正に関する情報を Web で見つけることができないようです。

「頂点ごと」ではなく、「フラグメントごとの深度テスト」のようなものを実装する方法はありますか? また、理論的には、シャドウ マッピングがより正確になる可能性があります。

編集

ええと、それは上で示したひどいアイデアだったかもしれませんが、私が望んでいるのは、テクセルのアルファが 1 未満の場合、そのテクセルの背後にあるものをシャドウする必要がないことをシェーダーに伝えることだけです。深度テクスチャには頂点情報のみが必要だと思います。そのため、シャドウ マッピングに関するすべてのチュートリアルで頂点と空のフラグメント シェーダーが最小化され、フラグメント シェーダーで何かをしようとしても何も起こりません。

とにかく、部分的に透明なオブジェクトによる影のキャスティングを修正する主なアイデアは何ですか?

EDIT2

シェーダーを変更しましたが、少なくとも 1 つの透明度が o_O の場合、すべてのフラグメントが破棄されます。そのため、これらのオブジェクトはシャドウをキャストしなくなりました (ただし、不透明なオブジェクトはシャドウをキャストしません)。シェーダーを見てください。

// Vertex Shader
uniform mat4 orthoView;

in vec4 in_Position;
in vec2 in_TextureCoord;
out vec2 TC;

void main(void) {
TC = in_TextureCoord;
        gl_Position = orthoView * in_Position; 
}

.

//Fragment Shader
uniform sampler2D texture;

in vec2 TC;

void main(void) {
vec4 texel = texture2D(texture, TC);
if (texel.a < 0.4)
    discard;
}

そして、他のシェーダーで同じテクスチャで同じトリックを使用し、それが機能するので奇妙です...何かアイデアはありますか?

4

1 に答える 1

1

フラグメント シェーダーで破棄を使用すると、そのフラグメントの深度情報は記録されません。したがって、フラグメント シェーダーで、テクスチャが透明かどうかを確認するテストを追加し、そうであればそのフラグメントを破棄します。

于 2013-01-19T16:18:56.880 に答える