-1

あなたが尋ねる前に、はい、私は多数のチュートリアル、このフォーラムや他のフォーラムに投稿された同様の質問などを読みました...私が見つけることができるすべての提案を試しましたが、GLSL 3.3マルチテクスチャリングを私の人生で機能させることはできません.

https://drive.google.com/file/d/0B05Cvmc8jIzjMW1wS09BSWp3MzA/view?usp=sharingで完全な VS2013 プロジェクトを Google ドキュメントに投稿しました。

これが私のテクスチャバインディングコードです:

static GLuint gTextures[2];

/* Create textures */
glGenTextures( 2, gTextures );

glBindTexture( GL_TEXTURE_2D, gTextures[ 0 ] );
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, 8, 8, 0, GL_RGB, GL_UNSIGNED_BYTE, gTestTexture0 );
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

glBindTexture( GL_TEXTURE_2D, gTextures[ 1 ] );
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, 8, 8, 0, GL_RGB, GL_UNSIGNED_BYTE, gTestTexture1 );
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

/* For the next lines, "shader_id" is the value returned from glCreateProgram when I create
   the shader. */

glActiveTexture(GL_TEXTURE0);
glEnable( GL_TEXTURE_2D );
glBindTexture(GL_TEXTURE_2D, gTextures[0]);
glBindSampler(0, glGetUniformLocation(shader_id, "mytex[0]"));

glActiveTexture(GL_TEXTURE1);
glEnable( GL_TEXTURE_2D );
glBindTexture(GL_TEXTURE_2D, gTextures[1]);
glBindSampler(1, glGetUniformLocation(shader_id, "mytex[1]"));

私のフラグメントシェーダーコード:

#version 330 core
precision mediump float;

in vec3 pass_Color;
in vec2 pass_texcrd0;
in vec2 pass_texcrd1;

uniform sampler2D mytex[ 2 ];

out vec4 outputF;

void main()
{
    outputF = vec4( 
                texture( mytex[ 0 ], pass_texcrd0 ).r * texture( mytex[ 1 ], pass_texcrd1 ).r, 
                texture( mytex[ 0 ], pass_texcrd0 ).g * texture( mytex[ 1 ], pass_texcrd1 ).g, 
                texture( mytex[ 0 ], pass_texcrd0 ).b * texture( mytex[ 1 ], pass_texcrd1 ).b, 
                1.0 );
}

テクスチャ 1 は白い正方形で、中央に灰色の正方形があるため、出力は中央に暗い陰影のあるテクスチャ 0 になると予想されます。ただし、テクスチャ 0 は変更されていないように見えます。問題を切り分けるために、フラグメント シェーダーの main() を次のように変更しました。

outputF = vec4( texture( mytex[ 0 ], pass_texcrd0 ).rgb, 1.0 );

予想どおり、これはテクスチャ 0 を表示します。ただし、本当のキッカケは、フラグメント シェーダ命令を mytex[ 1 ] のみを参照するように変更しても、出力には引き続きテクスチャ 0 が表示されることです。

ATI と Nvidia を搭載した 2 台のコンピューターでこれを試しました。問題は、ATI コンピューターが OpenGL 3.2 しかサポートしていないことにあるのではないかと考えたので、代わりに #version 150 を使用する必要がありました。ただし、NVidia は OpenGL 4.1 をサポートしているため、問題はありません。どちらのマシンもレガシー クライアント呼び出しによるマルチテクスチャリングをサポートしているため、一般的なマルチテクスチャリング サポートの欠如は問題ではありません。

また、glBindSampler() の代わりに glUniform1iv を使用して、次のようにテクスチャ ユニットを設定しようとしました。

GLint samplerArrayLoc = glGetUniformLocation(shader_id, "mytex");
const GLint samplers[2] = {0,1}; // we've bound our textures in textures 0 and 1.
glUniform1iv( samplerArrayLoc, 2, samplers );

これも効果がありませんでした。

私は長い間、古いクライアント呼び出し (glVertex3d、glTexCoord2d など) でプログラミングを行ってきました。私はGLSLでスピンアップしています。だからただじっと見つめている。私がやろうとしているのは、単純な正方形を三角形のストリップ パターンでレンダリングすることだけです。私の頂点とテクスチャの座標配列は次のとおりです。

float vertices[] =
    {
    -0.5, -0.5, 0.0,
     0.5, -0.5, 0.0,
    -0.5,  0.5, 0.0,
     0.5,  0.5, 0.0
    };

float tex0[] =
    {
    0.0, 0.0,
    1.0, 0.0,
    0.0, 1.0,
    1.0, 1.0
    };

float tex1[] =
    {
    0.0, 0.0,
    1.0, 0.0,
    0.0, 1.0,
    1.0, 1.0
    };
4

1 に答える 1