gpt4 book ai didi

opengl-es - 如何有效地将深度缓冲区复制到 OpenGL ES 上的纹理

转载 作者:行者123 更新时间:2023-12-04 23:59:06 29 4
gpt4 key购买 nike

我正在尝试通过移植 some code 在 iOS 上的 OpenGL ES 2.0 中获得一些阴影效果。来自标准 GL。部分示例涉及将深度缓冲区复制到纹理:

glBindTexture(GL_TEXTURE_2D, g_uiDepthBuffer);
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 0, 0, 800, 600, 0);

但是,似乎 ES 不支持 glCopyTexImage2D。正在阅读 related thread ,看来我可以使用帧缓冲区和片段着色器来提取深度数据。所以我试图将深度分量写入颜色缓冲区,然后复制它:
// clear everything
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

// turn on depth rendering
glUseProgram(m_BaseShader.uiId);

// this is a switch to cause the fragment shader to just dump out the depth component
glUniform1i(uiBaseShaderRenderDepth, true);

// and for this, the color buffer needs to be on
glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE);

// and clear it to 1.0, like how the depth buffer starts
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

// draw the scene
DrawScene();

// bind our texture
glBindTexture(GL_TEXTURE_2D, g_uiDepthBuffer);
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, width, height, 0);

这是片段着色器:
uniform sampler2D sTexture;
uniform bool bRenderDepth;

varying lowp float LightIntensity;
varying mediump vec2 TexCoord;

void main()
{
if(bRenderDepth) {
gl_FragColor = vec4(vec3(gl_FragCoord.z), 1.0);
} else {
gl_FragColor = vec4(texture2D(sTexture, TexCoord).rgb * LightIntensity, 1.0);
}
}

我已经尝试过没有“bRenderDepth”分支,但它并没有显着加快速度。

现在几乎只是以 14fps 的速度执行此步骤,这显然是 Not Acceptable 。如果我以高于 30fps 的速度拉出副本。我从 Xcode OpenGLES 分析器关于复制命令得到两个建议:
  • file://localhost/Users/xxxx/Documents/Development/xxxx.mm:错误:
    验证错误:glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0,
    960, 640, 0) : Height<640> 不是 2 的幂
  • file://localhost/Users/xxxx/Documents/Development/xxxx.mm:警告:
    GPU 等待纹理:您的应用更新了当前的纹理
    用于渲染。这导致 CPU 等待 GPU
    完成渲染。

  • 我将努力解决上述两个问题(也许它们是症结所在)。与此同时,有人能提出一种更有效的方法来将深度数据提取到纹理中吗?

    提前致谢!

    最佳答案

    iOS设备普遍支持OES_depth_texture ,因此在存在扩展的设备上,您可以设置一个具有深度纹理的帧缓冲区对象作为其唯一附件:

    GLuint g_uiDepthBuffer;
    glGenTextures(1, &g_uiDepthBuffer);
    glBindTexture(GL_TEXTURE_2D, g_uiDepthBuffer);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL);
    // glTexParameteri calls omitted for brevity

    GLuint g_uiDepthFramebuffer;
    glGenFramebuffers(1, &g_uiDepthFramebuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, g_uiDepthFramebuffer);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, g_uiDepthBuffer, 0);

    然后,当您绘制场景时,您的纹理会接收写入深度缓冲区的所有值(您可以为此使用一个简单的片段着色器),并且您可以直接从中获取纹理,而无需调用 glCopyTexImage2D .

    关于opengl-es - 如何有效地将深度缓冲区复制到 OpenGL ES 上的纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13004616/

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