4

私のプログラムでは、t0 と t1 の 2 つのテクスチャを使用しています。t1 は追加で、場合によってのみ必要です。

.....
glActiveTexture ( GL_TEXTURE1 );
if ( mDisplayMode == EDM_DEFAULT ){
    glBindTexture( GL_TEXTURE_2D, 0 ); // In this case I don't need t1
}else{
    glBindTexture( GL_TEXTURE_2D, mglDegreeTexture ); // In this case t1 will overlap t0
}
shader->setUniformValue( "textureId1", 1 );

描画用シェーダー:

.....
vec4 c1 = texture( textureId0, uv );
vec4 c2 = texture( textureId1, gridUV );
float a = c2.a;
gl_FragColor = ( 1.0 - a )*c1 + a*c2;

正常に動作します。必要に応じて、2 番目のテクスチャが最初に重なります。glBindTexture( .. , 0 ) を使用するとゼロ テクスチャ (0,0,0,0) が返されると仮定しますが、NVidia ドライバーを 314.07 に更新した後、私のコードは glBindTexture( .. , 0 ) return (0,0) のように黒い画面を生成します。 ,0,1) テクスチャ。

いくつかのテストを実行します: シェーダーを使用

....
vec4 c1 = texture( textureId0, uv );
vec4 c2 = texture( textureId1, gridUV );
float a = c2.a;
if (a == 1){
    gl_FragColor = vec4(1,0,0,0);
    return;
}
if ( a == 0){
    gl_FragColor = vec4(0,1,0,0);
    return;
}
gl_FragColor = ( 1.0 - a )*c1 + a*c2;

古いドライバー (296、306) では緑色の画面が表示され、新しいドライバーでは赤色の画面が表示されます。Win 7 (GeForce 210) と win XP (GTX 260) を搭載した 2 台のコンピューターでテストしました。

したがって、私の質問は次のとおりです。0 を 2 番目のパラメーターとして glBindTexture を使用するのは正しいのですが、新しいドライバーで同じ結果 ( 0000 texture ) を達成するにはどうすればよいですか?

4

1 に答える 1

8

以下はすべて、コア プロファイル 3.2 に関するものですが、通常は GL のすべてのバージョンに適用されます。

名前 0 は、デフォルトのテクスチャ オブジェクトに対応します (テクスチャ ターゲットごとに 1 つ: 1d、2d、... 3.8.14 の最後の段落を参照)。

これglBindtexture(2D, 0);で、デフォルトのテクスチャ オブジェクトが取得されます。テクスチャリングを無効にするという意味ではありません。デフォルト オブジェクトからテクスチャリングすると、自分で作成していないテクスチャ オブジェクトに対してのみ、通常の操作が行われます。初期のテクスチャ オブジェクトは最初は不完全であるため、修正しない限り、「不完全」なルールに従って動作します。

現在、仕様では (3.9.2、Texture Access パラグラフ)、不完全なテクスチャからのサンプリングは (0,0,0,1) を返すと述べています。

したがって、古いドライバーは仕様に従って動作しませんでした。

于 2013-03-07T15:51:04.177 に答える