日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenGL ES 纹理设置

發布時間:2023/12/10 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenGL ES 纹理设置 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  • 紋理過濾
  • 紋理采樣
    • 最近點采樣
    • 線性紋理采樣
    • MIPMAP紋理

紋理過濾

紋理拉伸:重復拉伸和截取拉伸

用于指定紋理坐標超過(00.0,1.0)范圍時所發生的行為,使用glTexParameterf函數指定,GL_TEXTURE_WRAP_S 定義 s 坐標超出范圍[0.0, 1.0]的情況,GL_TEXTURE_WRAP_T 設定 t 坐標。

  • GL_REPEAT 重復紋理,超過1的部分其實只看它的小數部分,也就是說比如紋理坐標為2.4,那么相當于取樣0.4處的紋理值。
  • GL_CLAMP_TO_EDGE 采樣紋理邊緣,不想要任何格式的重復,應該使用 GL_CLAMP_TO_EDGE,超過1的部分都當成1.
  • GL_MIRRORED_REPEAT 重復紋理和鏡像,在重復的基礎上呈現鏡像效果。

在立方體紋理的例子上,修改一下vertices數組,增加一個變量i

float vertices[] = new float[] {// 頂點 顏色 紋理坐標//前面0, 0, 1, 1,1,1,0, 0.5f*i, 0.5f*i,1, 1, 1, 1,0,0,0, 1.0f*i, 0.0f*i,-1, 1, 1, 1,0,0,0, 0.0f*i, 0.0f*i,0, 0, 1, 1,1,1,0, 0.5f*i, 0.5f*i,-1, 1, 1, 1,0,0,0, 0.0f*i, 0.0f*i,-1,-1, 1, 1,0,0,0, 0.0f*i, 1.0f*i,0, 0, 1, 1,1,1,0, 0.5f*i, 0.5f*i,-1,-1, 1, 1,0,0,0, 0.0f*i, 1.0f*i,1,-1, 1, 1,0,0,0, 1.0f*i, 1.0f*i,0, 0, 1, 1,1,1,0, 0.5f*i, 0.5f*i,1,-1, 1, 1,0,0,0, 1.0f*i, 1.0f*i,1, 1, 1, 1,0,0,0, 1.0f*i, 0.0f*i,//后面0, 0,-1, 1,1,1,0, 0.5f*i, 0.5f*i,1, 1,-1, 1,0,0,0, 1.0f*i, 0.0f*i,1,-1,-1, 1,0,0,0, 0.0f*i, 0.0f*i,0, 0,-1, 1,1,1,0, 0.5f*i, 0.5f*i,1,-1,-1, 1,0,0,0, 0.0f*i, 0.0f*i,-1,-1,-1, 1,0,0,0, 0.0f*i, 1.0f*i,0, 0,-1, 1,1,1,0, 0.5f*i, 0.5f*i,-1,-1,-1, 1,0,0,0, 0.0f*i, 1.0f*i,-1, 1,-1, 1,0,0,0, 1.0f*i, 1.0f*i,0, 0,-1, 1,1,1,0, 0.5f*i, 0.5f*i,-1, 1,-1, 1,0,0,0, 1.0f*i, 1.0f*i,1, 1,-1, 1,0,0,0, 1.0f*i, 0.0f*i,//左面-1, 0, 0, 1,1,1,0, 0.5f*i, 0.5f*i,-1, 1, 1, 1,0,0,0, 1.0f*i, 0.0f*i,-1, 1,-1, 1,0,0,0, 0.0f*i, 0.0f*i,-1, 0, 0, 1,1,1,0, 0.5f*i, 0.5f*i,-1, 1,-1, 1,0,0,0, 0.0f*i, 0.0f*i,-1,-1,-1, 1,0,0,0, 0.0f*i, 1.0f*i,-1, 0, 0, 1,1,1,0, 0.5f*i, 0.5f*i,-1,-1,-1, 1,0,0,0, 0.0f*i, 1.0f*i,-1,-1, 1, 1,0,0,0, 1.0f*i, 1.0f*i,-1, 0, 0, 1,1,1,0, 0.5f*i, 0.5f*i,-1,-1, 1, 1,0,0,0, 1.0f*i, 1.0f*i,-1, 1, 1, 1,0,0,0, 1.0f*i, 0.0f*i,//右面1, 0, 0, 1,1,1,0, 0.5f*i, 0.5f*i,1, 1, 1, 1,0,0,0, 1.0f*i, 0.0f*i*i,1,-1, 1, 1,0,0,0, 0.0f*i, 0.0f*i,1, 0, 0, 1,1,1,0, 0.5f*i, 0.5f*i,1,-1, 1, 1,0,0,0, 0.0f*i, 0.0f*i,1,-1,-1, 1,0,0,0, 0.0f*i, 1.0f*i,1, 0, 0, 1,1,1,0, 0.5f*i, 0.5f*i,1,-1,-1, 1,0,0,0, 0.0f*i, 1.0f*i,1, 1,-1, 1,0,0,0, 1.0f*i, 1.0f*i,1, 0, 0, 1,1,1,0, 0.5f*i, 0.5f*i,1, 1,-1, 1,0,0,0, 1.0f*i, 1.0f*i,1, 1, 1, 1,0,0,0, 1.0f*i, 0.0f*i,//上面0, 1, 0, 1,1,1,0, 0.5f*i, 0.5f*i,1, 1, 1, 1,0,0,0, 1.0f*i, 0.0f*i,1, 1,-1, 1,0,0,0, 0.0f*i, 0.0f*i,0, 1, 0, 1,1,1,0, 0.5f*i, 0.5f*i,1, 1,-1, 1,0,0,0, 0.0f*i, 0.0f*i,-1, 1,-1, 1,0,0,0, 0.0f*i, 1.0f*i,0, 1, 0, 1,1,1,0, 0.5f*i, 0.5f*i,-1, 1,-1, 1,0,0,0, 0.0f*i, 1.0f*i,-1, 1, 1, 1,0,0,0, 1.0f*i, 1.0f*i,0, 1, 0, 1,1,1,0, 0.5f*i, 0.5f*i,-1, 1, 1, 1,0,0,0, 1.0f*i, 1.0f*i,1, 1, 1, 1,0,0,0, 1.0f*i, 0.0f*i,//下面0,-1, 0, 1,1,1,0, 0.5f*i, 0.5f*i,1,-1, 1, 1,0,0,0, 1.0f*i, 0.0f*i,-1,-1, 1, 1,0,0,0, 0.0f*i, 0.0f*i,0,-1, 0, 1,1,1,0, 0.5f*i, 0.5f*i,-1,-1, 1, 1,0,0,0, 0.0f*i, 0.0f*i,-1,-1,-1, 1,0,0,0, 0.0f*i, 1.0f*i,0,-1, 0, 1,1,1,0, 0.5f*i, 0.5f*i,-1,-1,-1, 1,0,0,0, 0.0f*i, 1.0f*i,1,-1,-1, 1,0,0,0, 1.0f*i, 1.0f*i,0,-1, 0, 1,1,1,0, 0.5f*i, 0.5f*i,1,-1,-1, 1,0,0,0, 1.0f*i, 1.0f*i,1,-1, 1, 1,0,0,0, 1.0f*i, 0.0f*i};

設置i=2時,相當于紋理坐標設置的范圍為(0,2)之間,定義紋理過濾方式為重復模式

GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,GLES20.GL_REPEAT); GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,GLES20.GL_REPEAT);


效果圖

設置紋理過濾模式為重復鏡像模式

GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_WRAP_S,GLES20.GL_MIRRORED_REPEAT); GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_WRAP_T,GLES20.GL_MIRRORED_REPEAT);

效果圖

紋理采樣

紋理采樣就是根據偏遠的紋理坐標到紋理圖中提取對應位置顏色的過程,但一般而言,片元數量和紋理圖中的像素數量并不一定相同,比如將較小的紋理圖映射到較大的圖元或者將較大的紋理圖映射到較小的圖元時就會出現這樣的狀況,通過紋理坐標在紋理圖中并不一定能找到與之完全對應的像素,這時候就要采取相應的策略在紋理圖中選取顏色了。

最近點采樣

最近點采樣的原理就是根據片元的紋理坐標在紋理圖中的位置距離那個像素近就選擇哪個像素的顏色值作為該片元的顏色采樣值。最近點采樣計算很簡單,但存在的問題就是將較小的紋理圖映射到較大的圖元上容易產生明顯的鋸齒,同時將較大的紋理縮小的一定的程度后也就不好用了。加載紋理時設置最近點采樣的方式

GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,GLES20.GL_NEAREST); GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_MAG_FILTER,GLES20.GL_NEAREST);

線性紋理采樣

線性紋理采樣的結果并不僅來自紋理圖中的一個像素,在進行紋理采樣時會考慮到該片元對應的紋理坐標周圍的幾個像素,然后根據周圍幾個像素的比例進行加權得到最終的采樣結果。由于線性采樣對多個像素進行了加權平均,僅此將較小的圖元紋理映射到較大的圖元時,不會有鋸齒現象,而是平滑過渡。加載紋理時設置線性紋理采樣的方式

GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,GLES20.GL_LINEAR); GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_MAG_FILTER,GLES20.GL_LINEAR);

因此一般來說對于縮小映射采用最近點采樣,對于放大映射來說采用線性采樣。GL_TEXTURE_MIN_FILTER表示縮小的映射,GL_TEXTURE_MAG_FILTER表示放大映射。

MIPMAP紋理

盡管用線性采樣很適合處理放大的情況,但是對于縮小到一定的大小后,它就不好用了,一個紋理在渲染表面所占的大小減少的越多,就會有越多的紋理元素擁擠到一個片元上,一般情況下使用線性采樣,每個片元值使用了四個紋理像素,我們就會失去很多的細節。

使用MIPMAP技術,可以用來生成一組優化過的不同大小的紋理,并且會使用所有的紋理元素來生成每個級別的紋理。當加載紋理的時候,不單單是加載一個紋理,而是加載一系列從大到小的紋理當mipmapped紋理狀態中。在渲染時,OpenGL會根據每個片元的紋理元素數量為每個片元選擇最合適的級別的紋理。

使用glGenerateMipmap函數自動生成多級紋理,對綁定的紋理調用glGenerateMipmap函數會產生從原始圖像開始的多級紋理鏈。后續的每個紋理是上一個紋理圖像的一半,一直持續到最后底部的1x1的紋理。

public static native void glGenerateMipmap(int target );

加載MIP紋理的方式允許在設置紋理采樣方式時采用MIP方式,即param參數除了GL_NEAREST和GL_LINEAR以外,還可以使用GL_NEAREST_MIPMAP_NEAREST、GL_NEAREST_MIPMAP_LINEAR、GL_LINEAR_MIPMAP_NEAREST、GL_LINEAR_MIPMAP_LINEAR。

public static native void glTexParameterf(int target,int pname,float param);

使用GL_LINEAR_MIPMAP_LINEAR模式效果最佳。
測試各種類型的紋理采樣方式

代碼下載

轉載于:https://www.cnblogs.com/qhyuan1992/p/6071965.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的OpenGL ES 纹理设置的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。