[英]OpenGL : Cube Map texture, no UV mapping
到目前為止,當學習Open GL(着色器版本)時,我一直在通過UV將對象坐標映射到紋理坐標來對多維數據集進行紋理處理。 因此,我將頂點緩沖區和UV緩沖區傳遞給着色器代碼。
但是現在,當我從各種教程中閱讀skybox時,該過程似乎非常不同,並且非常混亂。 首先,他們使用多維數據集貼圖紋理。 我了解了“多維數據集貼圖”紋理應該做什么,但我不了解教程如何實現它。 例如,大多數這些教程都為Skybox編寫了單獨的片段着色器。 為什么不能使用與所有其他多維數據集對象相同的片段着色器? 並且,沒有明確的UV映射完成。
關於如何實現立方體貼圖紋理有很好的解釋嗎?
就教程而言,我只會推薦這一本 。
為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.