2012-12-01 49 views
0

我正在使用GLSL进行纹理处理。 我如何处理GLSL的两个纹理? 一个人建议我在我的GLSL中做两个samplers2D ... 但是GLSL怎么知道哪个samplers2D应该使用? (我不是在说混合纹理......)GLSL - 两种纹理(不混合)

我听说我应该使用glBindTexture。 我该怎么做?用glBindTexture?任何人都有这样的例子吗?

的openGL 3.3


编辑:

我有这样的:

uniform Sampler2D texture1; 
uniform Sampler2D texture2; 

我需要绘制两个对象,使用纹理,这样怎么能GLSL知道他是否应该使用texture1或纹理2根据我想绘制的对象。这是我的问题。

+0

[OpenGL Wiki有一篇关于如何工作的文章](http://www.opengl.org/wiki/Sampler_%28GLSL% 29个#Binding_textures_to_samplers)。 –

+0

@NicolBolas你知道他们为什么在这些例子中使用GL_TEXTURE0 + x而不是'GL_TEXTURE0','GL_TEXTURE2'等。 – user1118321

+0

@ user1118321由于'GL_TEXTURE#'只能达到31,而*实际*限制可能要高得多。你应该总是使用'GL_TEXTURE0 + x'。 –

回答

2

您需要将每个纹理绑定到不同的纹理单元,然后使用多纹理坐标。它会看起来像这样(假设你已经有纹理):

glActiveTexture (GL_TEXTURE0); // First texture is going into texture unit 0 
glBindTexture (GL_TEXTURE_2D, tex0); 
glEnable (GL_TEXTURE_2D); 

glActiveTexture (GL_TEXTURE1); // Second texture is going into texture unit 1 
glBindTexture (GL_TEXTURE2D, tex1); 
glEnable (GL_TEXTURE_2D); 

glUseProgram (yourGLSLProgramID); 
glUniform1i (sampler1Location, 0); // tell glsl that sampler 1 is sampling the texture in texture unit 0 
glUniform1i (sampler2Location, 1); // tell glsl that sampler 2 is sampling the texture in texture unit 1 
///... set the rest of your uniforms... 

glBegin (GL_QUADS); 
    glMultiTexCoord2f(GL_TEXTURE0, 0.0, 0.0); 
    glMultiTexCoord2f(GL_TEXTURE1, 0.0, 0.0); 
    glVertexCoord2f(0.0, 0.0); 

    glMultiTexCoord2f(GL_TEXTURE0, 1.0, 0.0); 
    glMultiTexCoord2f(GL_TEXTURE1, 1.0, 0.0); 
    glVertexCoord2f(width, 0.0); 

    glMultiTexCoord2f(GL_TEXTURE0, 1.0, 1.0); 
    glMultiTexCoord2f(GL_TEXTURE1, 1.0, 1.0); 
    glVertexCoord2f(width, height); 

    glMultiTexCoord2f(GL_TEXTURE0, 0.0, 1.0); 
    glMultiTexCoord2f(GL_TEXTURE1, 0.0, 1.0); 
    glVertexCoord2f(0.0, height); 
glEnd(); 
+1

谢谢,但我需要使用openGL 3.3。 – Spamdark

+2

好的,所以唯一的区别是不会使用'glBegin()'/'glEnd()'。相反,你会使用各种纹理单元的坐标数组。 – user1118321

+0

请参阅[这个答案](http://stackoverflow.com/questions/1524736/glmultitexcoord-in-opengl-es)关于如何使用'glTexCoordPointer()'而不是'glMultiTexCoord()'的信息。 – user1118321