如何设置GlSurfaceView的Alpha通道

时间:2018-08-06 16:36:56

标签: android view opengl-es alpha glsurfaceview

我无法为func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { switch indexPath.section { case 0 : let cell = tableView.dequeueReusableCell(withIdentifier: "StoriesCell", for: indexPath) as! StoriesCell // Could use cell.storiesCollectionView.reloadData() too, but it flickers then UIView.animate(withDuration: 0, animations: { cell.storiesCollectionView.performBatchUpdates({ cell.storiesCollectionView.reloadSections(IndexSet(0...0)) }) }) cell.setCollectionViewDataSourceDelegate(self, forRow: indexPath.row) cell.collectionViewOffset = storedStoriesCollectionViewOffset[indexPath.row] ?? 0 return cell case 2 : // ... 设置alpha参数。 XML属性GlSurfaceView无效,从代码android:alpha=调用方法也无效。例如,我读过一个类似的问题-如何在此mView.setAlpha()上设置透明背景,但是不幸的是,解决方案并没有解决我的问题-设置alpha通道View的包含。我试图将GlSurfaceView移到GlSurfaceView内,但尚未设置FrameLayout的Alpha,但是此解决方案没有帮助。

现在,我仍然只看到一个变体-将示例视图移至FrameLayout上方并设置示例GlSurfaceView的透明度。这个解决方案对我来说是最后一个案例!

我想问-有什么方法可以不同地解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

问题已解决!

只有一种变体是正确的-在着色器的'gl_FragColor'中设置参数'alpha'!例如:gl_FragColor.a=0.5;

要通过代码访问着色器,需要在着色器中将参数alpha设置为全局('uniform'类型),并通过方法'glGetUniformLocation'将他链接起来em>,'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'

PS 。如果在“视图”中出现透明的工件,则您可能尝试在XML内设置参数setZOrderOnTop(true);和/或android:windowIsTranslucent="true"。但是对我而言,这不是必需的-一切正常!