gpt4 book ai didi

opengl - 这个深度缓冲区可视化应该看起来平滑吗?

转载 作者:行者123 更新时间:2023-12-02 22:06:13 26 4
gpt4 key购买 nike

我正在调试 problem使用 SSAO 并尝试可视化我的深度缓冲区。结果如下: enter image description here我将深度和法线存储在单个 16 位 RGBA 纹理中。这是我的深度 channel 着色器:

// Vertex shader
#version 150 core
#extension GL_ARB_explicit_attrib_location : enable

uniform mat4 _ViewMatrix;
uniform mat4 _ViewProjectionMatrix;
uniform mat4 modelMatrix;

layout (location = 0) in vec4 aPosition;
layout (location = 2) in vec3 aNormal;

out vec4 vPosition;
out vec3 vNormal;

void main()
{
gl_Position = _ViewProjectionMatrix * modelMatrix * aPosition;

mat4 modelViewMatrix = _ViewMatrix * modelMatrix;

vPosition = modelViewMatrix * aPosition;
vNormal = mat3( modelViewMatrix ) * aNormal;
}

// Fragment shader.
#version 150 core

// Calculated as 1.0 / (far - near)
uniform float uLinearDepthConstant;

in vec4 vPosition;
in vec3 vNormal;

out vec4 outDepthNormal;

void main()
{
float linearDepth = -vPosition.z * uLinearDepthConstant;

outDepthNormal = vec4( linearDepth, normalize( vNormal ) );
}

然后,我在渲染纹理的着色器中可视化深度(我对近平面和远平面距离进行了硬编码):

void main()
{
float depth = texture( depthNormalMap, vTexCoord ).r;
fragColor = vec4((2.0 * 1.0) / (200.0 + 1.0 - depth * (200.0 - 1.0)));
}

结果应该看起来很顺利还是可能有什么问题?我正在创建这样的纹理:

glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA16F, width, height, 0, GL_RGBA, GL_HALF_FLOAT, 0 );

最佳答案

如果您考虑到没有硬件真正提供 16 位浮点深度缓冲区这一事实,那么这看起来是正确的。

某些游戏机(例如 Xbox 360)公开 24 位浮点深度缓冲区,但通常为了可移植地执行操作,您必须使用 32 位深度缓冲区才能表示它以浮点形式。如果您需要模板缓冲区和浮点深度缓冲区,则需要丑陋的 64 位打包深度 + 模板格式,这也是 D3D 和 Xbox 360 中的 ATI 硬件提供 24 位浮点 + 的部分原因8 位深度+模板格式在 OpenGL 中不可用。 如果 GL 有这个,它将被称为 GL_DEPTH24F_STENCIL8

现在,虽然 16 位浮点值不足以存储深度,但以这种格式存储法线可能会浪费空间/内存带宽。您应该尝试使用 RGBA 10:10:10:2(定点)或 RGB 11:11:10(浮点)等格式来存储法线(如果 RGBA8 实际上不够),然后使用节省的空间您可以买得起 32 位浮点深度缓冲区。

就目前情况而言,您实际上并没有首先使用浮点深度缓冲区。您正尝试将深度打包到 16 位每组件颜色缓冲区的一个 channel 中。如果您当前的解决方案无法裁剪,我建议您使用实际深度附件并使用 24 位定点或 32 位深度图像格式。无论如何,您已经必须在正常渲染期间将某些内容输出到专用深度缓冲区。

立即使用浮点格式来存储深度会损失 1 位精度,因为它必须存储相当无意义的符号位(定点深度缓冲区则不会)。此外,由于深度值通常已经在 0-1 范围内,因此 float 的增强范围实际上并不适用。在 16 位时,以浮点格式存储深度所带来的损失大于获得的 yield 。当您使用较少的位来存储深度时,定点深度确实是最好的方法。

关于opengl - 这个深度缓冲区可视化应该看起来平滑吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21660130/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com