gpt4 book ai didi

android - OpenGL ES 2.0 中的抗锯齿?

转载 作者:可可西里 更新时间:2023-11-01 04:05:41 58 4
gpt4 key购买 nike

有没有办法在 OpenGL ES 2.0 中实现抗锯齿技术?我用眼镜发现了一些方法,但输出没有变化。

在最坏的情况下,我计划实现多 channel 渲染,通过显示每个像素周围像素的平均颜色来平滑 fragment 着色器中的边缘,但它会消耗更多 GPU 性能。

有什么建议吗?

最佳答案

许多设备都支持 MSAA(多样本抗锯齿)。要利用此功能,您必须选择具有多重采样的 EGLConfig

在 Android 上,如果您使用 GLSurfaceView,则必须实现您自己的 EGLConfigChooser。然后,您可以使用 EGL 函数,尤其是 eglChooseConfig() 来查找您喜欢的配置。

以下代码未经测试,但至少应该勾勒出如何实现它。在 GLSurfaceView 派生类的构造函数中,调用 setRenderer() 之前,添加:

setEGLConfigChooser(new MyConfigChooser());

然后实现MyConfigChooser。您可以将其作为 GLSurfaceView 中的嵌套类:

class MyConfigChooser implements GLSurfaceView.EGLConfigChooser {
@Override
public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) {
int attribs[] = {
EGL10.EGL_LEVEL, 0,
EGL10.EGL_RENDERABLE_TYPE, 4, // EGL_OPENGL_ES2_BIT
EGL10.EGL_COLOR_BUFFER_TYPE, EGL10.EGL_RGB_BUFFER,
EGL10.EGL_RED_SIZE, 8,
EGL10.EGL_GREEN_SIZE, 8,
EGL10.EGL_BLUE_SIZE, 8,
EGL10.EGL_DEPTH_SIZE, 16,
EGL10.EGL_SAMPLE_BUFFERS, 1,
EGL10.EGL_SAMPLES, 4, // This is for 4x MSAA.
EGL10.EGL_NONE
};
EGLConfig[] configs = new EGLConfig[1];
int[] configCounts = new int[1];
egl.eglChooseConfig(display, attribs, configs, 1, configCounts);

if (configCounts[0] == 0) {
// Failed! Error handling.
return null;
} else {
return configs[0];
}
}
}

您显然想要替换配置所需的特定值。实际上,使用一小组严格必要的属性调用 eglChooseConfig() 会更加健壮,让它枚举所有匹配这些属性的配置,然后实现您自己的逻辑以从中选择最佳的. eglChooseConfig() 的定义行为已经有点奇怪了(参见 documentation ),并且没有说明 GPU 供应商如何实现它。

在 iOS 上,您可以在 GLKView 上设置此属性以启用 4x MSAA:

[view setDrawableMultisample: GLKViewDrawableMultisample4X];

您可以考虑其他抗锯齿方法:

  • super 采样:渲染到每个方向上最终渲染表面大小的倍数(通常是两倍)的纹理,然后对其进行缩减采样。这会使用大量内存,并且开销很大。但如果它满足您的性能要求,那么质量将非常出色。
  • 守旧派:多次渲染帧并稍微偏移,然后对帧进行平均。在 OpenGL 的早期,这通常是通过累积缓冲区来完成的。累积缓冲区已过时,但您可以对 FBO 做同样的事情。请参阅原文中“帧缓冲区”下的“场景抗锯齿”部分 Red Book获取方法说明。

关于android - OpenGL ES 2.0 中的抗锯齿?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27035893/

58 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com