2014-10-20 205 views
1

到目前爲止,在學習Open GL(着色器版本)時,我已經通過將物體座標映射到紋理座標來紋理立方體。所以我將一個頂點緩衝區和一個UV緩衝區傳遞給我的着色器代碼。OpenGL:立方體貼圖紋理,沒有UV貼圖

但是現在當我從各種教程閱讀skybox時,這個過程看起來非常不同,而且相當混亂。首先,他們使用Cube Map紋理。我明白Cube Map紋理應該做什麼,但我不明白這些教程是如何實現它的。例如,大多數這些教程都爲Skybox編寫了一個單獨的片段着色器。爲什麼我不能使用我用於所有其他立方體對象的片段着色器?而且,沒有明確的UV映射正在完成。

有沒有很好的解釋立方體貼圖紋理是如何實現的?

回答

4

就教程而言,我會推薦this one

  • 相反採樣2D紋理通過使UV 座標和獲取當前的像素的顏色在紋理UV位置 工作簡單。
  • 雖然立方貼圖使用從 中心立方體的開始,直到它碰到側 允許它從採樣該側的像素在該特定紋理中的一個沿行進的3D方向矢量。

爲天空盒設置單獨着色器的原因可能很方便。您可能希望在未來某個時候進行特殊修改。但是我們也可以這樣做:pos.xyww;忽略寫入深度緩衝區。

現在注意在頂點着色器中我們設置紋理方向矢量(texDirection)等於當前頂點的位置。請記住,所有向量在到達片段着色器時都會進行插值,因此,將從多維數據集的一側向另一側插入它自己,四處走動。

頂點着色器:

in vec3 position; 
out vec3 texDirection; 

uniform mat4 projection; 
uniform mat4 view; 


void main() { 
    vec4 pos = projection * view * vec4(position, 1.0); 
    gl_Position = pos.xyww; // We ignore the depth buffer here 
    texDirection = position; // Let it interpolate 
} 

裏面的片段着色器,我們在我們可愛的方向拍攝品嚐來自天空盒像素插值texDirection。它碰到其中一邊並返回一個顏色,我們將其存儲在輸出變量顏色中。

片段着色器:

in vec3 texDirection; 
out vec4 color; 

uniform samplerCube skybox; // The cubemap is a uniform! 

void main() {  
    color = texture(skybox, texDirection); // Get the pixel in direction of texDirection! 
}