【问题标题】:OpenGL : Cube Map texture, no UV mappingOpenGL:立方体贴图纹理,没有UV贴图
【发布时间】:2014-12-15 23:06:47
【问题描述】:

到目前为止,在学习 Open GL(着色器版本)时,我一直在通过 UV 将对象坐标映射到纹理坐标来对立方体进行纹理处理。所以我将一个顶点缓冲区和一个 UV 缓冲区传递给我的着色器代码。

但是现在当我从各种教程中阅读天空盒时,这个过程似乎非常不同,而且相当混乱。首先,他们使用立方体贴图纹理。我了解立方体贴图纹理应该做什么,但我不明白教程是如何实现它的。例如,这些教程中的大多数都为 Skybox 编写了单独的片段着色器。为什么我不能使用与所有其他立方体对象相同的片段着色器?而且,没有进行明确的 UV 映射。

对于如何实现立方体贴图纹理有很好的解释吗?

【问题讨论】:

    标签: opengl


    【解决方案1】:

    就教程而言,我只推荐this one

    • 相比之下,2D 纹理 的采样只需通过 UV 坐标并获取该 UV 位置的当前像素颜色 在纹理中。
    • cubemaps 使用从 立方体的中心并一直移动直到它碰到其中一个侧面 允许它从该特定纹理的那一侧对像素进行采样。

    为天空盒设置单独的着色器的原因可能是方便。您可能希望在将来的某个时间进行特殊修改。但事实上我们可以这样做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!
    }
    

    【讨论】:

      猜你喜欢
      • 2019-08-12
      • 2015-10-12
      • 1970-01-01
      • 1970-01-01
      • 2014-05-06
      • 2018-07-29
      • 2016-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多