gpt4 book ai didi

opengl - 如何实现两次 channel 之间的深度值不变?

转载 作者:行者123 更新时间:2023-12-02 09:46:28 25 4
gpt4 key购买 nike

我有两个几何 channel 。在第一遍中,我使用 glBlendEquation(GL_MIN) 将片段的深度值写入浮点纹理,类似于双深度剥离。在第二遍中,我使用它在片段着色器中进行早期深度测试。

但是,对于某些片段,深度测试会失败,除非我稍微偏移最小深度值(下面的eps):

enter image description here

设置纹理:

glBindTexture(GL_TEXTURE_2D, offscreenDepthMapTextureId);
glTexStorage2D(GL_TEXTURE_2D, 1, GL_RG32F, screenWidth, screenHeight);

glBindFramebuffer(GL_DRAW_FRAMEBUFFER, offscreenDepthMapFboId);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
offscreenDepthMapTextureId, 0);

请注意,纹理用作颜色附件,而不是深度附件。我在两次传递中都禁用了 GL_DEPTH_TEST,因为我无法在最后一次传递中使用它。

顶点着色器,在两个 channel 中使用:

#version 430

layout(location = 0) in vec4 position;

uniform mat4 mvp;
invariant gl_Position;

void main()
{
gl_Position = mvp * position;
}

第一个 channel 片段着色器,与 offscreenDepthMapFboId 绑定(bind),因此它将深度作为颜色写入纹理。混合可确保只有最小值最终出现在红色分量中。

#version 430

out vec4 outputColor;

void main()
{
outputColor.rg = vec2(gl_FragCoord.z, -gl_FragCoord.z);
}

第二遍,写入默认帧缓冲区。纹理用作深度Tex

#version 430

out vec4 outputColor;

uniform sampler2D depthTex;

void main()
{
vec2 zwMinMax = texelFetch(depthTex, ivec2(gl_FragCoord.xy), 0).rg;
float zwMin = zwMinMax.r;
float zwMax = -zwMinMax.g;
float eps = 0;// doesn't work
//float eps = 0.0000001; // works
if (gl_FragCoord.z > zwMin + eps)
discard;
outputColor = vec4(1, 0, 0, 1);
}

顶点着色器中的不变限定符没有帮助。使用 eps = 0.0000001 似乎是一个粗略的解决方法,因为我无法确定这个特定值是否始终有效。如何让两个着色器生成完全相同的 gl_FragCoord.z?或者是深度纹理的问题?格式错误?是否发生了我不知道的转化?

最佳答案

您是否尝试过 glDepthFunc(GL_EQUAL) 而不是着色器内比较方法?您是否在同一 channel 中读取和写入相同的深度纹理?

我不确定 gl_FragCoord 的格式和精度是否与深度缓冲区相关。另外,这可能是驱动程序故障,但 glDepthFunc(GL_EQUAL) 应该按预期工作。

关于opengl - 如何实现两次 channel 之间的深度值不变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17252058/

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