OpenGL 关于立方体贴图优化的疑问

现在我们在渲染场景中的其他物体之前渲染了天空盒。这么做没错,但是不怎么高效。如果我们先渲染了天空盒,那么我们就是在为每一个屏幕上的像素运行片段着色器,即使天空盒只有部分在显示着;fragment可以使用前置深度测试(early depth testing)简单地被丢弃,这样就节省了我们宝贵的带宽。

所以最后渲染天空盒就能够给我们带来轻微的性能提升。采用这种方式,深度缓冲被全部物体的深度值完全填充,所以我们只需要渲染通过前置深度测试的那部分天空的片段就行了,而且能显著减少片段着色器的调用。问题是天空盒是个1×1×1的立方体,极有可能会渲染失败,因为极有可能通不过深度测试。简单地不用深度测试渲染它也不是解决方案,这是因为天空盒会在之后覆盖所有的场景中其他物体。我们需要耍个花招让深度缓冲相信天空盒的深度缓冲有着最大深度值1.0,如此只要有个物体存在深度测试就会失败,看似物体就在它前面了。

在坐标系教程中我们说过,透视除法(perspective division)是在顶点着色器运行之后执行的,把gl_Position的xyz坐标除以w元素。我们从深度测试教程了解到除法结果的z元素等于顶点的深度值。利用这个信息,我们可以把输出位置的z元素设置为它的w元素,这样就会导致z元素等于1.0了,因为,当透视除法应用后,它的z元素转换为w/w = 1.0:

void main()
{
    vec4 pos = projection * view * vec4(position, 1.0);
    gl_Position = pos.xyww;
    TexCoords = position;
}

同时深度方程glDepthFunc(GL_LESS);改变成glDepthFunc(GL_LEQUAL); 

好奇的是

1.设置gl_Position.z = 0.99 * gl_Position.w ;会把立方体完全遮盖。

2.不修改深度缓冲方程glDepthFunc(GL_LESS),会导致天空盒子画不出来

我尝试修改该立方体的shader,显示立方体的深度值

#version 330 core

uniform sampler2D texture_diffuse1;
in vec2 TexCoords;

out vec4 color;

void main()
{
	color = vec4(vec3(gl_FragCoord.z), 1.0f);
}

然后发现立方体变成全白色了,为什么深度值会是1呢?

我的思考:

深度缓冲方程设置glDepthFunc(GL_LESS)是不是默认缓冲区都是1,这样导致天空盒子没有渲染

链接:https://learnopengl-cn.readthedocs.io/zh/latest/04%20Advanced%20OpenGL/06%20Cubemaps/

https://learnopengl-cn.readthedocs.io/zh/latest/04%20Advanced%20OpenGL/01%20Depth%20testing/

猜你喜欢

转载自blog.csdn.net/skillart/article/details/98070998