图形学基础 | CubeMap 立方体贴图

CubeMap 立方体贴图

  • 一个包含6个2D纹理的贴图
  • 它是通过一个 方向向量 来进行采样的. 访问到正确的face面.

创建立方体贴图

GL_TEXTURE_CUBE_MAP 有六个面,每个面都要绑定.
比如:
GL_TEXUTRE_CUBE_MAP_POSITIVE_X + i;

Shader 采样器中,这么写:
samplerCube cubemap;
进行采样:
FragColor = texture(cubemap,texturedir);
// texturedir 是3D纹理坐标的向量

SkyBox 天空盒

作用:
用立方体才模拟巨大场景.

使用立方体的 位置 进行采样. // 这里的位置是以(0,0,0)为中心.

那么,刚好使用 model 模型坐标系即可. 即 texturedir = apos;

存在一个问题:
作为场景. 天空盒应该不能移动.
需要去除 skybox的位移.
即: view = mat4(mat3(view));

关于SkyBox的优化

为了避免多余的渲染.最后渲染天空盒.
进行 提前深度测试

Texcoords = apos; // 使用模型坐标
vec4 pos = project*view*vec4(aps,1.0f);
gl_position = pos.xyww;

特别注意:
最后使用pos.xyww.在顶点着色器之后会进行透视除法.
那么gl_position各个坐标都会除以w.则w归一化为1.0.而z变成了1.0;
齐次裁剪空间坐标系(范围  -1<=x <=1,-1<=y<=1,-1<=z <=1, )是左手坐标系

最后修改深度测试函数.
默认情况下使用的深度函数是GL_LESS,它将会丢弃深度值大于等于当前深度缓冲值的所有片段。
GL_LESS 变更为 GL_LEQUAL
在片段深度值小于等于缓冲区的深度值时通过测试.

Environment Mapping 环境贴图

将整个环境映射到了一个纹理对象上了
能利用这个信息的不仅仅只有天空盒
通过使用环境的立方体贴图.以给物体反射和折射的属性
这样使用环境立方体贴图的技术叫做环境映射(Environment Mapping)
最流行的两个是反射(Reflection)和折射(Refraction)。

反射

观察方向向量I和物体的法向量N,来计算反射向量R
用R来进行CubeMap纹理采样.

折射

我们有一个观察向量I,一个法向量N,而这次是折射向量R
用R来进行CubeMap纹理采样.

Dynamic Environment Mapping 动态环境贴图

但它有一个很大的缺点:我们需要为使用环境贴图的物体渲染场景6次.

你可能感兴趣的:([图形学基础])