OpenGL:Cube Map纹理,无UV映射

时间:2014-10-20 20:43:55

标签: opengl

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

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

是否可以很好地解释如何实现立方体贴图纹理?

1 个答案:

答案 0 :(得分:4)

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

  • 相比之下, 2D纹理只需通过UV即可 坐标并获取该UV位置的当前像素颜色 在纹理中。
  • 虽然立方体贴图使用从...开始的3D方向向量 立方体的中心并一直向前移动,直到撞到其中一侧 允许它从该特定纹理中的那一侧采样像素。

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