从着色器中的深度缓冲区进行采样,返回0到1之间的值,如预期的那样.给定相机的近平面和远平面平面,如何计算此时的真实z值,即距相机的距离?
我正在尝试将LearnOpenGL SSAO教程用作资源时复制Sascha Willems SSAO示例。但是我的SSAO代码仅部分覆盖了特定角度/距离的模型,并且在靠近对象时也具有非常强的自我遮挡效果。
左侧是我的渲染器,右侧是Sascha Willems SSAO示例:
编辑:从RenderDoc的正确图像上有一些奇怪的伪像。对于那个很抱歉。
有关渲染器变量的一些注意事项:
SSAO噪音
// Random Generator
std::default_random_engine rndEngine(static_cast<unsigned>(glfwGetTime()));
std::uniform_real_distribution<float> rndDist(0.0f, 1.0f);
// SSAO random noise
std::vector<glm::vec4> ssaoNoise(SSAO_NOISE_DIM * SSAO_NOISE_DIM);
for (uint32_t i = 0; i < static_cast<uint32_t>(ssaoNoise.size()); i++)
{
ssaoNoise[i] = glm::vec4(rndDist(rndEngine) * 2.0f - 1.0f, rndDist(rndEngine) * …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用OpenGL为iOS应用程序渲染一个阿甘场景。为了使它更好一点,我想在场景中实现深度效果。但是,我需要从OpenGL深度缓冲区获得线性化的深度值。目前,我正在片段着色器(在此处找到)中使用计算。
因此,我的地形片段着色器如下所示:
#version 300 es
precision mediump float;
layout(location = 0) out lowp vec4 out_color;
float linearizeDepth(float depth) {
return 2.0 * nearz / (farz + nearz - depth * (farz - nearz));
}
void main(void) {
float depth = gl_FragCoord.z;
float linearized = (linearizeDepth(depth));
out_color = vec4(linearized, linearized, linearized, 1.0);
}
Run Code Online (Sandbox Code Playgroud)
但是,这将导致以下输出:
如您所见,越远,您得到的深度值越“条纹”(尤其是在船后)。如果地形图块靠近相机,那么输出就可以了。
我什至尝试了另一种计算:
float linearizeDepth(float depth) {
return 2.0 * nearz * farz / (farz + nearz - (2.0 * depth - 1.0) * (farz - …Run Code Online (Sandbox Code Playgroud)