2011-10-13 117 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