1

私は2つの画像を持っています.ここの指示の助けを借りて: http://en.wikibooks.org/wiki/OpenGL_Programming/Intermediate/Textures

それらを 2 つの別々のテクスチャに別々に保存し、ビデオ メモリにアップロードすることができました。

 gluBuild2DMipmaps(GL_TEXTURE_2D, 4, width, height, GL_RGBA, GL_UNSIGNED_BYTE, data);

では、シェーダーを使用してこれらのテクスチャにアクセスし、これら 2 つのテクスチャを乗算するにはどうすればよいでしょうか?

たとえば、シェーダーを使用した乗算に関するこの例を見つけました: http://www.opengl.org/wiki/Texture_Combiners

//Vertex shader
 #version 110
 attribute vec4 InVertex;
 attribute vec2 InTexCoord0;
 attribute vec2 InTexCoord1;
 uniform mat4 ProjectionModelviewMatrix;
 varying vec2 TexCoord0;
 varying vec2 TexCoord1;    //Or just use TexCoord0
 //------------------------
 void main()
 {
   gl_Position = ProjectionModelviewMatrix * InVertex;
   TexCoord0 = InTexCoord0;
   TexCoord1 = InTexCoord1;
 }
 //------------------------
 //Fragment shader
 #version 110
 uniform sampler2D Texture0;
 uniform sampler2D Texture1;
 //------------------------
 varying vec2 TexCoord0;
 varying vec2 TexCoord1;    //Or just use TexCoord0
 //------------------------
 void main()
 {
    vec4 texel = texture2D(Texture0, TexCoord0);
    texel *= texture2D(Texture1, TexCoord1);
    gl_FragColor = texel;
 }

しかし、このフラグメント シェーダーを使用してこの乗算を実行できるように、アップロードしたテクスチャを Vertex の形式で作成するにはどうすればよいでしょうか。

gluBuild2DMipmap を生成しただけですが、Vertex/Fragment シェーダーをテクスチャに適用する方法がわかりません。

4

1 に答える 1

0

最初の 3 つの値が頂点座標であるクワッドがあるとします。最後の 2 つは TexCoord です。

   -1.0f,-1.0f, 1.0f,   0.0f, 0.0f,
    1.0f,-1.0f, 1.0f,   1.0f, 0.0f,
   -1.0f, 1.0f, 1.0f,   0.0f, 1.0f,
    1.0f,-1.0f, 1.0f,   1.0f, 0.0f,
    1.0f, 1.0f, 1.0f,   1.0f, 1.0f,
   -1.0f, 1.0f, 1.0f,   0.0f, 1.0f,

ハードウェアのさまざまなユニフォームと属性を提出する必要があります。

まず最初に (MVP などの後) 頂点と textcoord:

glEnableVertexAttribArray(VAA_Normal);
glVertexAttribPointer(VAA_Normal, 3, GL_FLOAT, GL_TRUE,  5*sizeof(GLfloat), (const GLvoid*)(5 * sizeof(GLfloat)));

glEnableVertexAttribArray(VAA_TexCoord);
glVertexAttribPointer(VAA_TexCoord, 2, GL_FLOAT, GL_TRUE,  5*sizeof(GLfloat), (const GLvoid*)(3 * sizeof(GLfloat)));

(VAA_Normal = glGetAttribLocation(aProgram, attribName);)

最後になりましたが、重要なテクスチャ:

   glActiveTexture(GL_TEXTURE0);
   glBindTexture(GL_TEXTURE_2D, aTexture);

忘れないでください: 異なるテクスチャをどのように組み合わせるかはあなた次第です

編集:すみません、忘れました

  glUniform1i(glGetUniformLocation(aProgramID, "TEXTURE0"), 0);
于 2014-05-23T08:49:07.820 に答える