OpenGL使用纹理上的着色器

时间:2013-03-04 18:56:31

标签: c++ opengl shader textures

我有两张图片,并在这里的指示的帮助下: 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;
 }

但是我如何制作以Vertex形式上传的纹理,以便我可以使用此片段着色器来完成此乘法。

我所做的只是生成了gluBuild2DMipmaps,但现在我不知道如何将Vertex / Fragment着色器应用到我的纹理中?

1 个答案:

答案 0 :(得分: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之后等等。)顶点和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);