2011-10-13 65 views
5

我需要使用多纹理渲染对象,但两个纹理对于同一对象具有不同的uv坐标。一个是法线图,另一个是光线图。OpenGL ES 1具有不同uv坐标的多纹理

请提供任何有用的材料。

+0

欢迎来到StackOverflow,我希望你阅读[FAQ](http://stackoverflow.com/faq#howtoask)。 –

回答

6

在OpenGL ES 2中,您仍然使用着色器。所以你完全可以使用任何你喜欢的纹理坐标。刚刚介绍的第二纹理cooridnate对附加属性和委派这对片段着色器,通常使用:

... 
attribute vec2 texCoord0; 
attribute vec2 texCoord1; 

varying vec2 vTexCoord0; 
varying vec2 vTexCoord1; 

void main() 
{ 
    ... 
    vTexCoord0 = texCoord0; 
    vTexCoord1 = texCoord1; 
} 

而在片段着色器使用相应的坐标来访问纹理:

... 
uniform sampler2D tex0; 
uniform sampler2D tex1; 
... 
varying vec2 vTexCoord0; 
varying vec2 vTexCoord1; 

void main() 
{ 
    ... = texture2D(tex0, vTexCoord0); 
    ... = texture2D(tex1, vTexCoord1); 
} 

当然,您需要为这个新属性提供数据(使用glVertexAttribPointer)。但是,如果所有这些对你来说听起来都非常陌生,那么你应该深入研究一下GLSL着色器,或者实际使用OpenGL ES 1.在这种情况下,你应该重申你的问题,我会更新我的答案。

编辑:根据您对OpenGL ES 1的更新,情况有点不同。我假设你已经知道如何使用单个纹理并为此指定纹理坐标,否则在深入研究多纹理之前应该从那里开始。

随着glActiveTexture(GL_TEXTUREi)你可以激活ith纹理单元。以下与纹理状态有关的所有操作仅涉及第i个纹理单元(如glBindTexture,还包括glTexEnvgl(En/Dis)able(GL_TEXTURE_2D))。

用于指定纹理坐标,你还是使用glTexCoordPointer功能,与单纹理,但glCientActiveTexture(GL_TEXTUREi)可以选择纹理单元向glTexCoordPointerglEnableClientAttrib(GL_TEXTURE_COORD_ARRAY)以下呼叫是指哪些。

因此,这将是这样的:

//bind and enable textures 
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, <second texture>); 
glTexEnv(<texture environment for second texture>); //maybe, if needed 
glEnable(GL_TEXTURE_2D); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, <first texture>); 
glTexEnv(<texture environment for first texture>); //maybe, if needed 
glEnable(GL_TEXTURE_2D); 

//set texture coordinates 
glClientActiveTexture(GL_TEXTURE1); 
glTexCoordPointer(<texCoords for second texture>); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glClientActiveTexture(GL_TEXTURE0); 
glTexCoordPointer(<texCoords for first texture>); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

//other arrays, like glVertexPointer, ... 

glDrawArrays(...)/glDrawElements(...); 

//disable arrays 
glClientActiveTexture(GL_TEXTURE1); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glClientActiveTexture(GL_TEXTURE0); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 

//disable textures 
glActiveTexture(GL_TEXTURE1); 
glDisable(GL_TEXTURE_2D); 
glActiveTexture(GL_TEXTURE0); 
glDisable(GL_TEXTURE_2D); 

我设定的参数为第二个纹理之前,首先质地的原因才让它们设置后,我们结束了纹理单元0活跃。我想我已经看到驾驶员在绘图时出现问题,而另一个单元比单元0活跃。在结尾处保留一个或多或少干净的状态总是一个好主意,这意味着默认的纹理单元(GL_TEXTURE0)处于活动状态,否则不关心多纹理的代码可能会出现问题。

编辑:如果使用即时模式(glBegin/glEnd),而不是顶点数组,然后你不使用glTexCoordPointer,当然。在这种情况下,当然你也不需要glClientAttribTexture。您只需使用glMultiTexCoord(GL_TEXTUREi, ...)以及适当的纹理单元(GL_TEXTURE0,GL_TEXTURE1,...)而不是glTexCoord(...)。但是,如果我得到正确的通知,无论如何,OpenGL ES并不具备即时模式。

+0

感谢您的feedback.now我已经用opengles打乱了我的问题。请提供解决方案如何在OpenGL ES中执行此操作1.请提供任何示例代码(如果可用)。提前致谢。 – rocksvick

+0

@rocksvick您已添加opengl-es标记,但未删除opengl-es-2.0标记,也未更改标题。那么你是否只需要OpenGL ES 1.1解决方案或OpenGL ES 2.0解决方案呢? –

+0

根据您的指导原则,我已经删除了opengl-es-2.0标签并更改了标题。请提供解决方案和任何示例代码(如果可用)。谢谢 – rocksvick