【发布时间】:2017-07-12 15:58:58
【问题描述】:
使用 OpenGLES 1.1(此时别无选择)。目标操作系统是 Android。
渲染到主帧缓冲区和渲染到纹理时出现一些不一致。
当我渲染到正常屏幕时,一切都很好。当我渲染到纹理时,无论 alpha 是半透明的,我的图形周围都会出现一个深色边缘。
这是我的辅助函数:
void RenderNormal()
{
if (!gIsRenderToTexture)
{
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glBlendEquationOES(GL_FUNC_ADD_OES);
}
else
{
glBlendFuncSeparateOES(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA,GL_ONE,GL_ONE_MINUS_SRC_ALPHA);
glBlendEquationSeparateOES(GL_FUNC_ADD_OES,GL_FUNC_ADD_OES);
}
}
void RenderAdditive()
{
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
}
void RenderMultiply()
{
glBlendFunc(GL_ZERO, GL_SRC_COLOR);
}
所以,一些数据:
- 在较新的系统上,这工作得很好(也适用于 iOS、OSX 和 Linux)
- 在 Kindle Fire 上,我仍然得到黑框。
- 在运行 KitKat 的较旧 Android 设备上,我的加法/乘法函数不会关闭(我假设是因为 glBlendFunc 和 glBlendFuncSeparate 之间的杂耍...我没有关闭某些东西,但无论我尝试做什么来修复它使情况变得更糟)
我正在寻找一种方法来对这三个函数求平方,以便它们既可以渲染到纹理,又可以渲染到正常的 ol' 屏幕。你能帮忙吗?
【问题讨论】:
-
是的...问题似乎在于绘制零 alpha(而不是正常帧缓冲区的 1 alpha)。我在我正在开发的游戏中使用渲染目标作为“层”。另外,请注意,在较新的设备上,它可以工作......所以我怀疑在需要在旧设备上执行的新设备上不需要一些内务管理。
-
为什么不直接清空到 1.0 alpha?
-
因为我把它当做透明层……不画的地方我要透明的。
标签: android opengl-es framebuffer render-to-texture opengl-es-1.1