1

我有两张图片,并在此处的说明的帮助下: http ://en.wikibooks.org/wiki/OpenGL_Programming/Intermediate/Textures

我能够将它们单独存储到两个单独的纹理中,然后将它们上传到视频内存中:

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

现在,我将如何使用着色器访问这些纹理以将这两个纹理相乘?

例如,我发现了这个例子,关于使用着色器的乘法: 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;
 }

但是我将如何制作以顶点形式上传的纹理,以便我可以使用这个片段着色器来完成这种乘法。

我所做的只是生成 gluBuild2DMipmaps,但现在我不知道如何将顶点/片段着色器应用于我的纹理?

4

1 回答 1

0

假设您有一个四边形,其中前三个值是顶点坐标。最后两个是你的 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 等之后)顶点和文本坐标:

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 回答