小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Samsung Mobile Innovator - Samsung Developer ...

 kimbaku 2011-01-15

     接著上一篇文章的內容,本文主要分析如何將紋理映射到多邊形和物體上,會包含幾種紋理映射的方式。
準備好了紋理下面我們分析如何進行映射,將紋理數據映射到具體的物體上去。紋理坐標如下圖所示。
假設圖中的正方向就是我們要將紋理映射上去的物體(地面),那么我們需要按照圖中的表示,為每個頂點指定一個紋理坐標,也稱之為UV坐標,它的橫向為s軸,縱向圍t軸,如下圖所示。關于stuv坐標可以參考一些3D圖形學相關知識。


那么下面我們就按照圖中的指示來為地面創(chuàng)建一個紋理坐標數組和緩沖區(qū),代碼如下:
byte[] tcs = {0,0, 1,0, 0,1, 1,1};
tcsBuf = ByteBuffer.allocateDirect(tcs.length);
tcsBuf.put(tcs).rewind();
準備好紋理的uv坐標之后,下面是最后一步,如何繪制該物體及紋理。代碼如下:
 public void draw()
 {
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    gl.glVertexPointer(3, GL10.GL_BYTE, 0, vertsBuf); // use floor verts
    gl.glTexCoordPointer(2, GL10.GL_BYTE, 0, tcsBuf); // use tex coords
    gl.glEnable(GL10.GL_TEXTURE_2D);
    setTexture();
    gl.glNormal3f( 0, 1.0f, 0);   // facing up
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    gl.glDisable(GL10.GL_TEXTURE_2D);   // switch off texturing
 } // end of draw()
 private void setTexture()
 {
    gl.glBindTexture(GL10.GL_TEXTURE_2D, texNames[0]); // use the tex name
    // specify the texture for the currently bound tex name
    gl.glTexImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGB, imWidth, imHeight, 0,
                    GL10.GL_RGB, GL10.GL_UNSIGNED_BYTE, texBuf);
    // set the minification/magnification techniques
    gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
    gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
 } // end of setTexture()
其中大部分代碼我們已經接觸過,標注為紅色的是需要我們解釋的,glEnableClientState函數就是允許我們設置紋理坐標數組,而函數glTexCoordPointer就是將前面準備的紋理坐標緩沖區(qū)告訴Opengl,這樣在繪制圖形時,Opengl會自動的對紋理進行處理,并展現(xiàn)出來。
運行結果如下圖所示。
圖中的地面就是我們繪制的一個四邊形,然后給映射了一個地面的紋理貼圖上去形成的。這里我們是直接將一整張圖給映射上去了,那么我們是否可以只映射圖像的一部分呢?答案是肯定的,我們只需要改動UV坐標即可。UV坐標對應如下圖所示。
這樣應該很好理解,相當于我們只是映射了圖像上的0.250.75之間的部分(整個圖像的寬度和高度為1),即圖像的中間部分。當然你同樣可以更改這個坐標,來調整自己需要映射的部分,這在實際的游戲開發(fā)過程中是經常使用的,尤其是一些2D游戲的開發(fā),會將很多小的圖片放置到一個大的圖片之上,做成一個圖片集,就可以通過這種方式來確定需要映射圖片集中的哪一個小的圖塊。按照上圖的指示,我們將代碼需要改成float類型的數據即可,如下所示。
float[] tcs = {0.25f,0.25f,0.75f,0.25f,0.25f,0.75f,0.75f,0.75f};
tcsBuf = ByteBuffer.allocateDirect(tcs.length*4).asFloatBuffer();
tcsBuf.put(tcs).rewind();
/////
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, tcsBuf);
運行效果如下圖所示。
和第一個效果圖相比很明顯的紋理只去了圖像的中間一部分,上面的兩種方式都是將紋理映射到一個四邊形上,但是在Opengl ES中最基本的應該是三角形,我們是否可以將紋理映射到三角形上呢,同樣可以,對于三角形的紋理示意圖如下所示。
就這樣,同樣的步驟適合于幾何體中任何三角形,而且你甚至可以通過非常規(guī)方式的映射來扭曲紋理,產生各種特殊的效果??偠灾?,紋理上的任何一點都可以映射到多邊形的任何一點。或者換而言之,你可以對任何地點(uv)使用任何(s,t)而OpenGL ES則為你進行映射。



zhangjj
帖子 : 19
加入日期 : 2010.08.04 10:28 GMT+8
地點 : 中國

JavaME 3D游戲開發(fā)——紋理映射

發(fā)表在 2010.12.22 13:53 GMT+8
我們的紋理坐標系統(tǒng)在兩個軸上都是從0.0 1.0,如果設置超出此范圍的值會怎么樣?根據視圖的設置方式有兩種選擇。一種選擇是平鋪紋理。按OpenGL的術語,也叫“重復”。如果我們將第一個紋理坐標數組的所有1.0改為2.0
float[] tcs = {0.0f,0.0f, 2.0f,0.0f, 0.0f,2.0f, 2.0f,2.0f};
在加入如下代碼來設置重復的效果。
gl.glTexParameterx(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_S,GL10.GL_REPEAT);
gl.glTexParameterx(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_T,GL10.GL_REPEAT);
那么運行效果就會產生將多個相同的圖像平鋪到地面的四邊形上,下如圖所示。
 
另一種可能的選擇是讓OpenGL ES簡單地將超過1.0的值限制為1.0,任何低于0.0的值限制為 0.0。這實際會引起邊沿像素重復,從而產生奇怪的效果。將代碼更改為如下所示:
gl.glTexParameterx(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_S,GL10.GL_CLAMP_TO_EDGE);
gl.glTexParameterx(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_T,GL10.GL_CLAMP_TO_EDGE);
運行效果如下圖所示,這個表現(xiàn)得非常明顯。
  
到這里,我們幾乎分析完了Opengl中紋理映射的各種方式,當然也還會有其他的方式,但是原理都一樣,這里就不重復了,前面介紹的也都是將紋理映射在平面物體上,在文章的最后,我們將一個紋理映射到一個立方體上去。
首先定義紋理映射坐標,如下代碼所示:
 private byte texCoords[] = { // 4 tex coords for each face
    0,0, 1,0, 0,1, 1,1,   0,0, 1,0, 0,1, 1,1,   0,0, 1,0, 0,1, 1,1,
    0,0, 1,0, 0,1, 1,1,   0,0, 1,0, 0,1, 1,1,   0,0, 1,0, 0,1, 1,1
 };
tcsBuf = ByteBuffer.allocateDirect(texCoords.length);
tcsBuf.put(texCoords).rewind();
然后再繪制時加入和之前同樣的代碼即可,如下所示。
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
gl.glTexCoordPointer(2, GL10.GL_BYTE, 0, tcsBuf); // use tex coords
gl.glEnable(GL10.GL_TEXTURE_2D);   // use texturing
指定紋理坐標緩沖區(qū),開啟紋理,運行效果就會出現(xiàn)一個貼了紋理的立方體,如下圖所示。,
 
這樣的渲染結果看上去比前面幾個例子真實多了,這主要就是紋理的用作,因此紋理也是游戲開發(fā)中的重點,由于條件限制,大家可以測試更多種類的紋理以及其不同的映射方式。為了使游戲更加完美,下一文我們將介紹更適合游戲中物體的表現(xiàn)方式——模型。
  •  

  •  

  •  

go top

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多