OpenGL ES 1具有不同uv坐标的多纹理

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

请提供任何有用的材料。

在OpenGL ES 2中,您仍然使用着色器。 所以你完全可以使用任何你喜欢的纹理坐标。 只需为第二个纹理共同体对引入一个附加属性,并像往常一样委托给片段着色器:

... 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)您可以激活第i个纹理单元。 以下所有与纹理状态相关的操作都只涉及第i个纹理单元(如glBindTexture ,还包括glTexEnvgl(En/Dis)able(GL_TEXTURE_2D) )。

为了指定纹理坐标,您仍然使用glTexCoordPointer函数(与单个纹理一样),但使用glCientActiveTexture(GL_TEXTUREi) ,可以select以下对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活跃。 最后留下一个或多或less干净的状态总是一个好主意,这意味着默认的纹理单元( GL_TEXTURE0 )处于活动状态,否则不关心多纹理的代码可能会出现问题。

编辑:如果你使用即时模式( glBegin/glEnd ),而不是顶点数组,那么你当然不使用glTexCoordPointer 。 在这种情况下,你当然也不需要glClientAttribTexture 。 你只需要使用glMultiTexCoord(GL_TEXTUREi, ...)和适当的纹理单元( GL_TEXTURE0GL_TEXTURE1 ,…)来代替glTexCoord(...) 。 但是,如果我得到正确的通知,无论如何,OpenGL ES没有立即模式。