2014-10-03 73 views
0

爲了調試我的着色器,我試圖顯示立方體貼圖的正面。 立方體地圖是在彼此的頂部上的6面的125x750圖像:使用GLKit加載立方體貼圖後,iOS上openGL ES 2.0的正確立方體貼圖座標是什麼?

Cube map

首先,我加載立方體地圖GLKit:

_cubeTexture = [GLKTextureLoader cubeMapWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"uffizi_cube_map_ios" ofType:@"png"] options:kNilOptions error:&error]; 

然後我將其加載到着色器:

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_CUBE_MAP, self.cubeTexture.name); 
glUniform1i(glGetUniformLocation(self.shaderProgram, "cube"), 0); 

然後,在片段着色器:

gl_FragColor = textureCube(cube, vec3(-1.0+2.0*(gl_FragCoord.x/resolution.x),-1.0+2.0*(gl_FragCoord.y/resolution.y),1.0)); 

這將顯示這似乎是立方圖的頂部的一部分的失真圖像:

Distorted image

它不應該被扭曲,並且它應該顯示的右表面,而不是頂面。

我無法找到任何描述座標映射到多維數據集的文檔,所以我做錯了什麼?

回答

2

看來cubeMapWithContentsOfFile存在問題。 cubeMapWithContentsOfFiles方法(採用6張圖像的數組)可以在模擬器上完美工作。 (設備上的兩種方法都存在不同的問題)。

1

要可視化立方體貼圖的紋理座標工作方式,請在原點處繪製一個立方體,距離原點的距離爲1,並在每個面上指定立方體貼圖圖像。

紋理座標可以被視爲方向向量。從原點開始,3個分量定義了一個可以指向任何方向的向量。由矢量定義的射線將與給定點處的6個立方面之一相交。這是紋理化過程中相應立方體貼圖圖像被採樣的點。

例如,取一個指向最接近正z軸方向的矢量。該向量定義的射線與立方體的頂面相交。因此,立方體貼圖的頂部(POSITIVE_Z)圖像在光線與面相交的點處進行採樣。

等效規則適用於所有其他方向。與矢量分量之一的最大絕對值對應的面確定採樣哪個面,並且交點確定圖像內的位置。

確切的規則和公式可以在spec文檔中找到。例如,在最新的規範(OpenGL 4.5)中,請參見第8.13節「多維數據集貼圖紋理選擇」,其匹配表8.19。但只要您瞭解紋理座標定義了方向矢量,就可以覆蓋主要方面。

你如何確定紋理座標真的取決於你想要達到的目標。常見情況包括:

  • 使用法向量作爲立方體貼圖紋理座標。這可以例如用於預先計算的照明效果,其中立方圖圖像的內容包含針對每個可能的法線方向的預先計算的照明結果。
  • 使用反射向量作爲立方體貼圖紋理座標。這支持環境映射的實施。立方體貼圖的內容是環境的圖片。
+0

這就是我的想法。雖然立方體座標從-1到1而不是0到1的事實有點令人驚訝。儘管如此,我更新的代碼仍然不會產生正確的輸出。此代碼: vec2 coords = vec2(-1.0 + 2.0 *(gl_FragCoord.x/resolution.x), - 1.0 + 2.0 *(gl_FragCoord.y/resolution.y)); gl_FragColor = textureCube(cube,vec3(coords,1.0)); 產生此輸出: http://postimg.org/image/jkqjdz87t/ – xytor 2014-10-03 17:45:19