到目前为止,在学习Open GL(着色器版本)时,我一直通过将对象坐标UV映射到纹理坐标来对立方体进行纹理化。所以我将顶点缓冲区和UV缓冲区传递给我的着色器代码。
但是现在当我从各种教程中阅读天空盒时,这个过程看起来非常不同,而且非常令人困惑。首先,他们使用Cube Map纹理。我理解Cube Map纹理应该做什么,但我不明白教程是如何实现它的。例如,这些教程中的大多数都为Skybox编写了一个单独的片段着色器。为什么我不能使用我用于所有其他立方体对象的相同片段着色器?而且,没有明确的UV映射。
是否可以很好地解释如何实现立方体贴图纹理?
答案 0 :(得分:4)
就教程而言,我只会推荐this one。
为天空盒设置单独着色器的原因可能是方便。您可能希望将来某个时间进行特殊修改。但事实上我们可以这样做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!
}