【问题标题】:OpenGL depth buffer to texture (for various image sizes)OpenGL 深度缓冲区到纹理(适用于各种图像尺寸)
【发布时间】:2012-08-30 19:31:54
【问题描述】:

我的深度缓冲区有问题。我想放入纹理。但这似乎不起作用。

所以,这是我在渲染对象后执行的一段代码:

  glGenTextures(1, (GLuint*)&_depthTexture);
  glBindTexture(GL_TEXTURE_2D, _depthTexture);

  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

  const pair<int, int> &img_size = getImageSize();
  glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, img_size.first, img_size.second, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);
  glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, img_size.first, img_size.second);

  glClear( GL_DEPTH_BUFFER_BIT );

问题是(我使用的是 OpenGL 3.2+),用于渲染的图像大小不同。大多数时候,它不会是 2^i x 2^j 的大小。那么,这是一个问题吗?

另外,问题的另一部分可能出在片段着色器之后:

#version 140

uniform sampler2D depthTexture;
uniform ivec2 screenSize;

out vec4 outColor;

void main()
{
    vec2 depthCoord = gl_FragCoord.xy / screenSize.xy;
    float d = texture2D(depthTexture, depthCoord).x;
    outColor =  vec4(d, d, d, 1.0);
}

之后,当我第二次渲染一些形状时,我想使用之前的深度(纹理深度缓冲区)来做一些效果。

但是说真的……谁能给我看一段代码,你可以在其中将深度缓冲区转换为纹理?我不在乎它是渲染到纹理还是渲染后提取纹理!只要我有一个具有深度值的纹理来进行第二次传递......这就是重要的!

【问题讨论】:

  • “它不接缝工作。”在什么情况下它不起作用?
  • 我的图片是黑色的!根据其他网站,深度缓冲区在远处和黑色近处时应该看起来是白色的......但我的图像的一半应该是白色的!......至少是新三角形覆盖的部分!
  • "深度缓冲区在远处应该看起来是白色的,而黑色靠近时应该是白色的" 这取决于那里存储的内容。如果您使用默认深度范围,那么这将是正确的。
  • 但是我的代码,可以吗?将深度缓冲区放入纹理中?
  • 试试 glEnable(GL_DEPTH_TEST);为什么不使用 FBO 进行渲染深度并避免复制操作和纹理大小问题?

标签: opengl texture2d depth-buffer


【解决方案1】:

http://www.joeforte.net/projects/soft-particles/

这可能是一个很好的解决方案!

至少,它是完整的代码......也许能够得到所有不同的部分!

【讨论】:

    【解决方案2】:

    您可能需要一个glReadBuffer 电话。如果你的上下文是双缓冲的,那就是glReadBuffer( GL_BACK )

    另外,试试GL_DEPTH_COMPONENT24,因为我认为 32 位深度缓冲区是不寻常的。

    【讨论】:

    • 32 位深度并不少见,它是一个常规大小的浮点数(尽管也存在 32 位 int 缓冲区格式)。 24 位实际上不太常见,这是卡速度不足以完成 32 位整数,但 16 位不够准确以进行渲染的时代的残余。那时,一些驱动程序会使用 24 位代替 32 位;现在往往是相反的。
    • @peachykeen:32 位浮点深度缓冲区不寻常的。此外,DEPTH_COMPONENT32标准化整数 深度缓冲区,而不是浮点数(即 DEPTH_COMPONENT32F
    • 这是一个很好的问题......但它可能是双缓冲的!我只是不确定。
    • 那么,我应该把 glReadBuffer 放在我的代码哪里?我在 glTexImage2D 之前尝试过,但在这两种情况下,当我输入 GL_FRONT 或 GL_BACK 时,我都会收到 INVALID_ENUM 错误!这有点奇怪!有什么想法吗?
    • 好吧...找到了...它是 GL_COLOR_ATTACHMENT0_EXT...不管那是什么!
    猜你喜欢
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多