如何设置 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。但对我来说这不是必需的 - 一切正常!