2014-10-20 179 views
1

到目前为止,在学习Open GL(着色器版本)时,我已经通过将物体坐标映射到纹理坐标来纹理立方体。所以我将一个顶点缓冲区和一个UV缓冲区传递给我的着色器代码。OpenGL:立方体贴图纹理,没有UV贴图

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

有没有很好的解释立方体贴图纹理是如何实现的?

回答

4

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

  • 相反采样2D纹理通过使UV 坐标和获取当前的像素的颜色在纹理UV位置 工作简单。
  • 虽然立方贴图使用从 中心立方体的开始,直到它碰到侧 允许它从采样该侧的像素在该特定纹理中的一个沿行进的3D方向矢量。

为天空盒设置单独着色器的原因可能很方便。您可能希望在未来某个时候进行特殊修改。但是我们也可以这样做:pos.xyww;忽略写入深度缓冲区。

现在注意在顶点着色器中我们设置纹理方向矢量(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。它碰到其中一边并返回一个颜色,我们将其存储在输出变量颜色中。

片段着色器:

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