在3D游戏中渲染固定纹理的天空时,人们通常会先在立方体贴图中创建6个纹理,然后在相机周围渲染一个立方体。在 GLSL 中,您可以使用法线而不是纹理坐标来访问纹理中的像素,并且可以通过标准化相对于相机的片段位置轻松获得该法线。然而,这个过程可以用相机周围的任何形状来完成,因为当你标准化每个位置时,它总是会产生一个球体。现在我想知道:为什么它总是立方体而不是四面体?渲染立方体需要 12 个三角形,四面体只需要 4 个。正如我已经说过的,相机周围的任何形状都可以。那么四面体需要更少的 VRAM 并且渲染速度更快,没有任何缺点?为什么不使用它们呢?
您根本不需要一些环境几何图形。您所需要做的就是画一个四屏全屏,并为其计算正确的纹理坐标。现在有了现代 GL,我们甚至不需要为此提供顶点数据,我们可以使用无属性渲染:
顶点着色器:
#version 330 core
out vec3 dir;
uniform mat4 invPV;
void main()
{
vec2 pos = vec2( (gl_VertexID & 2)>>1, 1 - (gl_VertexID & 1)) * 2.0 - 1.0;
vec4 front= invPV * vec4(pos, -1.0, 1.0);
vec4 back = invPV * vec4(pos, 1.0, 1.0);
dir=back.xyz / back.w - front.xyz / front.w;
gl_Position = vec4(pos,1.0,1.0);
}
where invPV
is inverse(Projection*View)
,因此它将考虑您的相机方向以及投影。原则上,这可以进一步简化,具体取决于您可以对投影矩阵施加多少约束。
片段着色器:
#version 330 core
in vec3 dir;
out color;
uniform samplerCube uTexEnv;
void main()
{
color=texture(uTexEnv, dir);
}
要使用它,您只需绑定一个空的 VAO 和您的纹理,上传您的invPV
矩阵和调用glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)
.
这种方法当然可以用于球形纹理映射而不是立方体贴图
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)