gpt4 book ai didi

opengl-es - 渲染到深度纹理 - 关于 GL_OES_depth_texture 用法的不明确

转载 作者:行者123 更新时间:2023-12-02 04:58:06 24 4
gpt4 key购买 nike

我正在尝试替换 OpenGL ES 2.0 中缺少的 OpenGL 的 gl_FragDepth 功能。

我需要一种在片段着色器中设置深度的方法,因为在顶点着色器中设置深度对于我的目的而言不够准确。 AFAIK 做到这一点的唯一方法是拥有一个渲染到纹理的帧缓冲区,在该缓冲区上完成第一个渲染过程。此深度纹理 存储屏幕上每个像素的深度值。然后,在最终渲染过程中附加深度纹理,因此最终渲染器知道每个像素的深度。

由于 iOS >= 4.1 支持 GL_OES_depth_texture,我尝试使用 GL_DEPTH_COMPONENT24GL_DEPTH_COMPONENT16 作为深度纹理。我正在使用以下调用来创建纹理:

glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, textureId, 0);

帧缓冲区创建成功,但我不知道如何进行。我缺乏对附加到帧缓冲区的深度纹理的一些基本了解。

  • 我应该在片段着色器中输出什么值?我的意思是,gl_FragColor 仍然是 RGBA 值,即使纹理是深度纹理。我无法在片段着色器中设置深度,因为 OpenGL ES 2.0 中缺少 gl_FragDepth
  • 我如何在最终渲染过程中读取深度纹理,其中深度纹理附加为 sampler2D
  • 如果我将 glTexImage2D 的第三个参数设置为 GL_DEPTH_COMPONENT16GL_DEPTH_COMPONENT16_OES,为什么我得到一个不完整的帧缓冲区GL_DEPTH_COMPONENT24_OES
  • 将纹理附加到 GL_DEPTH_ATTACHMENT 是否正确?如果我将其更改为 GL_COLOR_ATTACHMENT0,我得到的是不完整的帧缓冲区。

最佳答案

深度纹理不影响片段着色器的输出。渲染到深度纹理时最终出现在深度纹理中的值将是固定函数深度值。

因此,如果没有 gl_FragDepth,您就无法真正“在片段着色器中设置深度”。但是,您可以按照您的描述进行操作,即在一次传递中渲染纹理的深度,然后在稍后的传递中读取访问该值。

您可以使用 texture2D 内置函数从深度纹理中读取,就像读取常规颜色纹理一样。您得到的值将是 (d, d, d, 1.0)。

根据深度纹理扩展specification , GL_DEPTH_COMPONENT16_OES 和 GL_DEPTH_COMPONENT24_OES 不支持作为深度纹理的内部格式。我希望这会产生错误。您得到的不完整的帧缓冲区状态可能与此有关。

将纹理附加到 GL_DEPTH_ATTACHMENT 是正确的。

关于opengl-es - 渲染到深度纹理 - 关于 GL_OES_depth_texture 用法的不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17598789/

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