安卓OpenGL片段着色器分辨率

3

我有一个片段着色器,大约运行在25fps的速度。如果屏幕分辨率更低,我猜想着色器会运行得更快。有没有办法让我的着色器认为它正在运行在低分辨率的屏幕上?因此可以牺牲细节-输出结果将更加方块化-以获得更好的性能。

2个回答

2

你可以进行其他优化(如渲染更少的基元),但如果想以较低分辨率渲染,则应先在屏幕外缓冲区中以较低分辨率进行渲染,然后将该缓冲区作为纹理重新渲染至全屏分辨率。

编辑:根据您的代码,您可以执行以下操作:

  1. 将代码移动到顶点着色器中,并将结果传递到 varrying vec3 f_color 输出,然后在片段着色器中设置 gl_FragColor

  2. 创建一个均匀网格,其三角形位于 -1,-1 和 1,1 之间,其中三角形数量取决于所需分辨率

  3. 绘制该网格


谢谢。听起来对我来说有点超出范围。希望有一个像“每十个XY处理一次”的解决方案。请看我对Rick77的回复。 - jFort
只是想让您知道,我已经实现了您的顶点建议,并且它完美地运行。谢谢。 - jFort

1
根据请求的语气,我假设您对OpenGL比较新(因为关于分辨率的请求很基础,无意冒犯,我们都是从这样的方式开始的):ratchet freak的回答是正确的(->在低分辨率上渲染纹理,然后只需在屏幕上显示纹理是您关于分辨率的直接答案),然而,正如ratchet freak所暗示的那样,您应该考虑其他方法来解决您的问题(因为降低片段着色器的分辨率会使您的输出看起来非常糟糕™)。
一些提示:
  • 尽可能在顶点着色器中执行计算:许多计算可以在顶点着色器中每个顶点执行,然后使用插值发送到片段着色器。这是一个巨大的优化来源,应该尽可能利用
  • 搜索片段着色器中的循环和条件语句(if / then),特别是无法展开(变量范围)的循环和不依赖于统一变量的条件语句,因为它们在片段着色器级别上都相当繁重
  • 如果可能,尽量渲染较少的基元
  • 如果您使用了许多复杂函数(cos / sin / sqrt等),请尝试缓存结果和/或使用查找表(如果可能)
  • 启用剔除和深度测试以减少光栅化的几何体数量[不确定是否有帮助,但不会有害;-)]
  • 如果结果不会降低,请降低某些计算的精度

您可以尝试在问题中发布片段着色器

希望这能有所帮助


没错,你说得对...我对OpenGL非常陌生。我已经在我的Nexus 7上实现了这个片段着色器-https://www.shadertoy.com/view/ldBGRR-只是作为一个入门者的尝试。它以26帧每秒的速度运行。我知道里面有很多三角函数处理,但我想知道是否需要为每个xy运行它。 - jFort
@jFort openGL会为每个xy运行它,但是您可以通过将场地分成网格并在顶点着色器中每个顶点计算一次颜色,然后让openGL插值到片段着色器中来优化它。 - ratchet freak
@jFort:你的“trig”是指三角函数吗?如果是,那么计算很可能应该移动到顶点着色器中。同样适用于光照模型(除非你要进行超级逼真的光照,否则降低分辨率是不可行的...你可能更适合使用简单的光照模型和全分辨率):法线、光线和视图向量应该在顶点着色器中计算,并通过某些变量“导出”到片段着色器中。只需注意,在插值期间,您可能需要在片段着色器中重新规范化向量。 - Rick77

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接