我正在尝试通过移植在 iOS 上的 OpenGL ES 2.0 中获得一些阴影效果一些代码 http://www.codesampler.com/usersrc/usersrc_8.htm来自标准 GL。示例的一部分涉及将深度缓冲区复制到纹理:
glBindTexture(GL_TEXTURE_2D, g_uiDepthBuffer);
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 0, 0, 800, 600, 0);
然而,ES 似乎不支持 glCopyTexImage2D。读一相关主题 https://stackoverflow.com/questions/2596682/opengl-es-2-0-read-depth-buffer,看来我可以使用帧缓冲区和片段着色器来提取深度数据。所以我尝试将深度分量写入颜色缓冲区,然后复制它:
// 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 的速度执行这一步,这显然是不可接受的。如果我以超过 30 fps 的速度拉出副本。我从 Xcode OpenGLES 分析器关于复制命令的两个建议:
文件:// localhost / Users / xxxx / Documents / Development / xxxx.mm:错误:
验证错误:glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0,
960, 640, 0) : 高度不是2的幂
文件:// localhost / Users / xxxx / Documents / Development / xxxx.mm:警告:
GPU 等待纹理:您的应用更新了当前正在使用的纹理
用于渲染。这导致CPU等待GPU
完成渲染。
我将努力解决上述两个问题(也许它们是问题的症结所在)。与此同时,有人能建议一种更有效的方法来将深度数据提取到纹理中吗?
提前致谢!