2012-02-11 21 views
8

我在OpenGL ES 2.0中找不到OpenGL中的glTexImage3D()函數。那麼如何使用3D紋理,例如:.tga文件?如何在iOS中使用3-D紋理?

有人知道如何在OpenGL ES 2.0中使用3-D紋理嗎?

回答

2

我不能發現有glTexImage3D功能在OpenGL ES 2

由於3D紋理不由的OpenGL-ES支持。想想看:3D紋理比2D更需要更多的內存。內存是嵌入式/移動設備上非常稀缺的資源,這是ES瞄準的目標。

我想也許有人知道使用3d紋理的算法?

這不是一個算法問題,而是一個有限的資源。理論上你可以使用多個紋理單元/採樣器來上傳圖層,並在着色器中進行插值。但是這會缺乏深度的手勢。

3d紋理,例如:.tag文件?

TAG文件?對不起,我不知道這種格式。你能給我一個鏈接來閱讀它嗎?谷歌沒有找到有用的信息。你是否意味着TGA?

+0

感謝您的回答!是的,我的意思是.tga ... – Ning 2012-02-11 16:59:59

+0

感謝您的回答!事實上,我不確定我需要的是3D紋理。這是我第一次和opengl一起工作。我接受一個項目,我需要在屏幕上渲染一個房子。當我打開.obj文件時,我發現每個vt都有三個組件,不僅僅是vt。如果我忽略vt的第三個組成部分,紋理非常奇怪。也許我不會使用3D紋理?我把紋理圖像放在下面。也許你的專家知道我需要什麼。 ww2.sinaimg.cn/large/991557bagw1dpytx071d5j.jpg最終效果http://ww4.sinaimg.cn/large/991557bagw1dpyu275vz4j.jpg – Ning 2012-02-11 17:12:09

+0

@寧:第三個組件'w'就像一個縮放參數。你不需要它。 – datenwolf 2012-02-11 18:09:37

12

OpenGL ES 1.x和2.x不要求支持3D紋理 - 請參閱glBindTexture的規範手冊頁,其中僅列出了GL_TEXTURE_2DGL_TEXTURE_CUBE_MAP作爲目標 - 而iOS硬件未提供任何合適的擴展名。

我已經能夠提出的最佳解決方案是打包3d紋理,就好像它是2d紋理一樣,所以您已經說了128x128x128 3d紋理,並將其作爲128個單獨的128x128圖像一個2d紋理上的16x8網格。所以2d紋理爲2048x1024像素,接近iPhone 4和iPad 2代設備的硬件限制,以及之前的ES 2.0兼容iOS設備。

然後,您可以將3d紋理座標提供給您的片段着色器,就好像有一種方法可以在本機上對3D紋理進行索引,但可以快速地將其數據合併爲2d。

所以,在128x128x128例子,你會做這樣的事情(在此編碼,因爲我說話,未經測試):

texPos.x = sourceVarying.x/16.0; // because we've packed 16 source images across, 
texPos.y = sourceVarying.y/8.0; // and 8 images down 

// we'll multiply z by 16 since then, logically, the integer part is 
// how many tiles across to index, and the decimal part is now many 
// tiles down to index 
texPos.z *= 16.0; 

// figure out how many tiles across to index, with each tile being 
// 1.0/16.0 in size 
texPos.x += floor(texPos.z)/16.0; 

// remove the integer part of z, then multiply by 8 to do much what 
// we just did to y 
texPos.z = fract(texPos.z) * 8.0; 
texPos.y += floor(texPos.z)/8.0; 

// now load the appropriate sample from texPos.xy 

這可能不是以達到最有效的方法,它是寫(相對)清晰度。您也正在研究每個紋理讀取所依賴的顯着性能劣勢(即,GPU無法預測片段着色器之外的訪問,導致顯着的管線困難)。但是要權衡使用3D紋理貼圖以外的任何費用。

另請注意,您正在執行與特定z切片綁定的一個訪問。所以你至少在一個維度上限制爲GL_NEAREST類型的採樣,除非你想做兩個樣本並且以更高的成本自己混合結果。我也沒有做過關於夾緊的事情,你很可能想要解決這個問題。

Datenwolf(+1,順便說一句)對於mipmapping是一個問題也是完全正確的;我最終只是禁用它。


晚2013補遺:在寫作的時候,的iOS 7,iPhone 5秒,第二代iPad Mini和iPad的空氣都支持ES 3.0。 3.0介紹GL_TEXTURE_3D目標。因此,您可以直接在這些設備上使用3D紋理,可能還會使用所有未來的iOS設備。而且,爲了紀錄,它在Android上看到了類似的可用性,在最近的所有Nexus設備,HTC One,最近的三星和其他一些設備中都得到了支持。

+0

感謝您的回答!事實上,我不確定我需要的是3D紋理。這是我第一次和opengl一起工作。我接受一個項目,我需要在屏幕上渲染一個房子。當我打開.obj文件時,我發現每個vt都有三個組件,不僅僅是vt。如果我忽略vt的第三個組成部分,紋理非常奇怪。也許我不會使用3D紋理?我把紋理圖像放在下面。也許你的專家知道我需要什麼。 ww2.sinaimg.cn/large/991557bagw1dpytx071d5j.jpg最後的效果http://ww4.sinaimg.cn/large/991557bagw1dpyu275vz4j.jpg – Ning 2012-02-11 17:11:52

+1

看起來像普通的2D紋理;你是否記得OBJ存儲y座標的方式與OpenGL的另一種方式相同,所以你需要在你的管道中做一個快速的1-y? – Tommy 2012-02-11 17:13:11

+0

呃...我沒那麼做!謝謝!我會嘗試的! – Ning 2012-02-11 17:20:35