2013-03-04 60 views
1

我有兩個圖像,並與指令的幫助在這裏着色器: http://en.wikibooks.org/wiki/OpenGL_Programming/Intermediate/Textures的OpenGL使用的紋理

我可以將它們存儲分開,分成兩個獨立的紋理,並將其上傳到視頻內存:

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,但現在我不知道如何將Vertex/Fragment着色器應用於我的紋理?

+0

你改變紋理單元(使用'glActiveTexture'調用)在應用程序中的任何地方?紋理單元只能保存單個紋理(並且mipmap堆棧被視爲單個紋理),因此要同時使用兩個紋理,則需要在上傳之前更改紋理單元。 – radical7 2013-03-04 19:02:50

+0

@ radical7:不,我沒有,但考慮如果我這樣做,仍然如何讓我的紋理被視爲頂點? – user2112840 2013-03-04 19:14:59

+3

@ user2112840:作爲頂點的紋理?說真的,你應該讓你的術語和OpenGL基礎紮實。你必須通過的是用作統一的紋理單元。我強烈建議你先通過一些很好的教程,比如Nicol Bolas的教程:http://www.arcsynthesis.org/gltut – datenwolf 2013-03-04 19:20:39

回答

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);