4

シェーダーから OpenGL の状態にアクセスする方法を探しています。すばらしいリソースであるGLSL クイック リファレンス ガイドは、これに関してはあまり役に立ちませんでした。

私が取り組んでいる例では、次の 2 つのシェーダーがあります。

バーテックス:

void    main()
{
    gl_FrontColor = gl_Color;
    gl_TexCoord[0] = gl_MultiTexCoord0;
    gl_Position = ftransform();
}

断片:

uniform sampler2D   tex;
uniform float   flattening;

void main( void ) 
{
    vec4    texel;
    texel = texture2D(tex, gl_TexCoord[0].st);
    texel.r *= gl_Color.r;
    texel.g *= gl_Color.g;
    texel.b *= gl_Color.b;
    texel.a *= gl_Color.a;
    gl_FragColor = texel;
}

テクスチャが適用されていないポリゴンをレンダリングすると、アルファ値は正しいのに黒が割り当てられます。

vec4(1.0, 1.0, 1.0, 1.0)1、変数 'texel' が無効になっているときにテクスチャからサンプリングするのではなく、変数 'texel' が設定されるようにするには、どのような条件チェックを設定できますGL_TEXTURE_2Dか?

2、テクスチャリングモードごとに異なるシェーダーを作成し、glEnable/ glDisable( GL_TEXTURE_2D) を使用する場所でシェーダーを切り替えると、処理が速くなりますか?

4

2 に答える 2

8

申し訳ありませんが、GLSL からそのような状態にアクセスすることはできません。

実際、将来の GLSL では、すべての unform/attributes を自分で送信する必要があります。つまり、自動の gl_ModelViewMatrix、gl_LightPosition、gl_Normal などは不要です。gl_Position や gl_FragColor などの基本的なもののみが利用可能になります。

そのようなものは 2 番目の質問を無効にしますが、テクスチャ モードごとに個別のシェーダーを作成するよりも便利な場合は、#ifdef を使用してシェーダーのパーツを有効/無効にすることができます。

関連して、分岐は一般的にかなり遅いことに注意してください。速度が必要な場合は、できるだけ避けてください。(フラグメントは SIMD ブロックで処理され、ブロック内のすべてのフラグメントは、1 つまたはいくつかのフラグメントにのみ適用される場合でも、同じ命令を計算する必要があるため、これは特に不規則な動的分岐に重要です。)

于 2009-05-19T19:59:05.673 に答える
3

私が見た 1 つの方法は、テクスチャ化されていないポリゴンをレンダリングするときに、1x1 テクスチャを (1.0, 1.0, 1.0, 1.0) の単一のテクセルにバインドすることです。テクスチャ スイッチはシェーダ スイッチよりも安価である必要があり、1x1 テクスチャはテクスチャ キャッシュ内に完全に収まります。

于 2012-02-03T18:38:10.637 に答える