如何设置 GlSurfaceView 的 alpha 通道
How to set alpha channel of GlSurfaceView
我无法为 GlSurfaceView
设置 alpha 参数。 XML-属性 android:alpha=
无效,从代码 mView.setAlpha()
调用方法也无效。我读到过一个类似的问题,例如,如何在此 View
上制作透明背景,但不幸的是,解决方案并没有帮助解决我的问题 - 将 alpha 通道设置为 GlSurfaceView
的包含。我试图将 GlSurfaceView
移到 FrameLayout
内,但尚未设置 FrameLayout
的 alpha,但此解决方案没有帮助。
现在我仍然只看到一个变体 - 将示例视图移到 GlSurfaceView
上方并设置示例的透明 View
。这个解决方案对我来说是最后一个案例!
我想问一下 - 有什么不同的方法可以解决这个问题吗?
问题解决!
只有一个变体是正确的 - 在着色器的 'gl_FragColor' 中设置参数 'alpha'!例如:gl_FragColor.a=0.5;
要从代码访问您的着色器 - 需要将着色器中的参数 alpha 设置为全局('uniform' 类型),然后 link他跨方法 'glGetUniformLocation', 'glUniform1f'。例如:
// View-code
int mAlpha;
float alpha = 0.5f;
mAlpha = GLES20.glGetUniformLocation(mProgrammerHandle, "u_alpha");
GLES20.glUniform1f(mAlpha, alpha);
// Shader-code
...
uniform float u_alpha;
...
gl_FragColor = vec4(rgb,u_alpha);
但这还不是全部!
需要设置参数GlSurfaceView 和Render。初始化GlSurfaceView后应该允许透明绘图:
setEGLConfigChooser(8, 8, 8, 8, 16, 0);
getHolder().setFormat(PixelFormat.RGBA_8888);
在渲染对象中也必须设置透明颜色清洁和正确的颜色混合。
GLES20.glClearColor ( 0.0f, 0.0f, 0.0f, 0.0f );
GLES20.glEnable(GL_BLEND);
混色可以不一样。默认 - 颜色混合即 GLES20.glBlendEquation(GL_FUNC_ADD);
- 不需要写。
但还有其他混合选项:
- GL_FUNC_SUBTRACT
- GL_FUNC_REVERSE_SUBTRACT
我的代码里没有写'glBlendEquation'。
下一个重要时刻 - alpha 混合。方法 'glBlendFunc' 或 'glBlendFuncSeparate'。您可以在 OpenGL 教程中阅读更多信息。为了正确的 alpha 混合,我利用了更详细的设置:
GLES20.glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO);
最后要做的事情 - 在 GlSurfaceView 中覆盖方法 'setAlpa' 和 'getAlpa'。
P.S. 如果你的View中出现透明神器,那么你可以尝试设置参数 setZOrderOnTop(true);
and/or android:windowIsTranslucent="true"
里面 XML。但对我来说这不是必需的 - 一切正常!
我无法为 GlSurfaceView
设置 alpha 参数。 XML-属性 android:alpha=
无效,从代码 mView.setAlpha()
调用方法也无效。我读到过一个类似的问题,例如,如何在此 View
上制作透明背景,但不幸的是,解决方案并没有帮助解决我的问题 - 将 alpha 通道设置为 GlSurfaceView
的包含。我试图将 GlSurfaceView
移到 FrameLayout
内,但尚未设置 FrameLayout
的 alpha,但此解决方案没有帮助。
现在我仍然只看到一个变体 - 将示例视图移到 GlSurfaceView
上方并设置示例的透明 View
。这个解决方案对我来说是最后一个案例!
我想问一下 - 有什么不同的方法可以解决这个问题吗?
问题解决!
只有一个变体是正确的 - 在着色器的 'gl_FragColor' 中设置参数 'alpha'!例如:gl_FragColor.a=0.5;
要从代码访问您的着色器 - 需要将着色器中的参数 alpha 设置为全局('uniform' 类型),然后 link他跨方法 'glGetUniformLocation', 'glUniform1f'。例如:
// View-code
int mAlpha;
float alpha = 0.5f;
mAlpha = GLES20.glGetUniformLocation(mProgrammerHandle, "u_alpha");
GLES20.glUniform1f(mAlpha, alpha);
// Shader-code
...
uniform float u_alpha;
...
gl_FragColor = vec4(rgb,u_alpha);
但这还不是全部! 需要设置参数GlSurfaceView 和Render。初始化GlSurfaceView后应该允许透明绘图:
setEGLConfigChooser(8, 8, 8, 8, 16, 0);
getHolder().setFormat(PixelFormat.RGBA_8888);
在渲染对象中也必须设置透明颜色清洁和正确的颜色混合。
GLES20.glClearColor ( 0.0f, 0.0f, 0.0f, 0.0f );
GLES20.glEnable(GL_BLEND);
混色可以不一样。默认 - 颜色混合即 GLES20.glBlendEquation(GL_FUNC_ADD);
- 不需要写。
但还有其他混合选项:
- GL_FUNC_SUBTRACT
- GL_FUNC_REVERSE_SUBTRACT
我的代码里没有写'glBlendEquation'。
下一个重要时刻 - alpha 混合。方法 'glBlendFunc' 或 'glBlendFuncSeparate'。您可以在 OpenGL 教程中阅读更多信息。为了正确的 alpha 混合,我利用了更详细的设置:
GLES20.glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO);
最后要做的事情 - 在 GlSurfaceView 中覆盖方法 'setAlpa' 和 'getAlpa'。
P.S. 如果你的View中出现透明神器,那么你可以尝试设置参数 setZOrderOnTop(true);
and/or android:windowIsTranslucent="true"
里面 XML。但对我来说这不是必需的 - 一切正常!