OpenGL在纹理上使用着色器

OpenGL using shaders on textures

本文关键字:纹理 OpenGL      更新时间:2023-10-16

我有两个图像,在这里的指令的帮助下: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,但现在我不知道如何将顶点/片段着色器应用到我的纹理?

假设您有一个四边形,其中前三个值是顶点坐标,后两个值是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);