簡體   English   中英

OpenGL:立方體貼圖紋理,無UV貼圖

[英]OpenGL : Cube Map texture, no UV mapping

到目前為止,當學習Open GL(着色器版本)時,我一直在通過UV將對象坐標映射到紋理坐標來對多維數據集進行紋理處理。 因此,我將頂點緩沖區和UV緩沖區傳遞給着色器代碼。

但是現在,當我從各種教程中閱讀skybox時,該過程似乎非常不同,並且非常混亂。 首先,他們使用多維數據集貼圖紋理。 我了解了“多維數據集貼圖”紋理應該做什么,但我不了解教程如何實現它。 例如,大多數這些教程都為Skybox編寫了單獨的片段着色器。 為什么不能使用與所有其他多維數據集對象相同的片段着色器? 並且,沒有明確的UV映射完成。

關於如何實現立方體貼圖紋理有很好的解釋嗎?

就教程而言,我只會推薦這一本

  • 相比之下,采樣2D紋理僅通過傳遞UV坐標並在紋理中該UV位置獲取當前像素顏色即可。
  • 立方體貼圖使用3D方向矢量,該矢量從立方體的中心開始並一直傳播,直到撞到其中一側為止,從而允許它從該特定紋理的那一側采樣像素。

為Skybox使用單獨的着色器的原因可能是方便。 您可能希望在將來的某個時間進行特殊修改。 但事實上,我們可以做到這一點pos.xyww; 忽略寫入深度緩沖區。

現在注意,在頂點着色器中,我們將紋理方向矢量(texDirection)設置為等於當前頂點的位置。 請記住,所有向量在到達片段着色器時都會進行插值,因此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方向拍攝,從天空盒中采樣像素。 它碰到一側,並返回一種我們存儲在輸出變量color中的顏色

片段着色器:

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!
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM