2012-07-11 115 views
1

我找到了一個Android的3D圖形框架Rajawali,我正在學習如何使用它。我遵循最基本的教程,即爲紋理渲染帶有1024x512大小jpg圖像的shpere對象。它在Galaxy Nexus上運行良好,但在Galaxy Player GB70上無效。在某些設備上不顯示OpenGL ES 2.0紋理

當我說它沒有工作,我的意思是對象出現,但紋理不呈現。最終,我在創建紋理時改變了我用於Rajawali框架的一些參數並使其工作。這是我發現的。

原因來自GL_TEXTURE_MIN_FILTER的設置位置。之間的下列四個值

GLES20.GL_LINEAR_MIPMAP_LINEAR 
GLES20.GL_NEAREST_MIPMAP_NEAREST 
GLES20.GL_LINEAR 
GLES20.GL_NEAREST 

GL_TEXTURE_MIN_FILTER未使用的mipmap設置爲過濾紋理僅呈現。所以當GL_TEXTURE_MIN_FILTER設置爲最後兩個它的作品。

現在這裏是我不明白和好奇的。當我縮小尺寸爲512x512的紋理圖像時,GL_TEXTURE_MIN_FILTER設置無關緊要。最小過濾器的所有四個設置都起作用。

所以我的問題是,是否有對圖像的尺寸使用紋理最小濾鏡時的要求?比如我需要使用一個正方形的圖像嗎?其他的東西,如包裝樣式或磁鐵過濾器的配置是否有問題?

或者它看起來像是設備的OpenGL實現錯誤?

回答

7

早上好,這是2個紋理非功率的典型例子。

由於多種原因,紋理的分辨率必須是2的權力,這是一個非常常見的錯誤,它確實發生在每個人都陷入這個陷阱中:)我也是如此。

2個紋理的非功率在某些設備/ GPU上順利運行的事實僅取決於OpenGL驅動程序的實現,一些GPU支持它們很清楚,其他一些則不支持,我強烈建議您去選擇pow2紋理爲了能夠保證所有設備的功能。

最後但並非最不重要的一點是,使用2個紋理的非功率會導致您在GPU內存利用率上出現巨大變化,因爲大多數接受非powerof2紋理的驅動程序都需要將紋理調整到最接近的更高2因素的力量。例如,具有520X520的紋理可能會導致1024X1024的實際內存映射。

這是你不想要的東西,因爲在現實世界中「尺寸很重要」,特別是在移動設備上。

你可以在OpenGL的黃金書顯示,OpenGL ES 2.0的一個相當不錯的解釋:

在OpenGL ES 2.0的,質地可以有非電力的二(npot) 尺寸。換句話說,寬度和高度不需要是2的冪。但是,如果紋理尺寸不是 兩者的功率,則OpenGL ES 2.0對 包裝模式有限制。也就是說,對於npot紋理,換行模式只能是 GL_CLAMP_TO_EDGE,而縮小過濾器只能是GL_NEAREST 或GL_LINEAR(換句話說,不是mip-mapped)。擴展名爲 GL_OES_texture_npot放寬了這些限制,並允許使用GL_REPEAT和GL_MIRRORED_REPEAT的包裝模式 ,並且還允許使用全套縮小過濾器對npot紋理進行mipmap。

我建議你評價這本書,因爲它對這個話題做了相當不錯的報道。

+0

謝謝你提供了一個很好的學習資料來源。但我知道你提到的大部分事情。也許我沒有把我的故事講得很清楚。 – 2012-07-11 07:34:58

+1

我使用1024 * 512大小的圖像作爲紋理。 Galaxy Nexus上的紋理渲染效果不錯,但不會在Galaxy Player上渲染。在以下兩種情況下,紋理將僅適用於Galaxy Player。如果不對GL_TEXTURE_MIN_FILTER(線性或最近)使用mipmap過濾器,或者如果我將大小縮小到512x512(那麼GL_TEXTURE_MIN_FILTER設置無關緊要)。由於1024和512都是兩個數字,所以我猜這個換行模式真的沒有關係。至少從我的理解來看,這是我的想法。 – 2012-07-11 07:39:59

+1

如上所述,我也有一個紋理,它的大小是(1024 x 512),它顯示的是黑色紋理。換行模式的改變對我有效。 – paj7777 2013-05-24 08:49:53