在OpenGL ES 2.0中垂直重复像素

时间:2018-10-04 16:08:06

标签: android opengl-es glsl opengl-es-2.0 fragment-shader

使用GLES2.0,我试图创建点精灵,将其转换后根据形状的最低/最高像素值向下或向上“夹紧”纹理。它的形状取决于当前角度(所有精灵的角度均一),半径和深度(顶点属性)。

我已经成功实现了预期的效果,但是效果却很慢,而且我知道必须有更简单的方法来实现。

本质上,我想要的是精灵y值低于阈值(由其形状定义)时,它只是向下复制前一个像素的颜色,直到达到第二个阈值为止。

此shadertoy示例显示了效果以及我目前如何实现(特别是底部函数)

Shadertoy Example. Use the mouse to move the shape

如您所见,无论形状方向如何,像素都向下/向上重复-圆角矩形(或矩形或圆形-取决于'r'常数)底部的任何内容都将被简单复制。 我的方法是使用分段函数,在变换形状后计算形状的边缘。形状将始终是半径为0(矩形)到1(圆形)的圆角矩形。 不幸的是,这需要大量的计算。

我尝试将不依赖于'x'的值更改为顶点着色器中的值,然后将其传递到片段着色器中,以便仅按每个顶点计算它们-但是实际上性能没有变化(支持GL的编译器优化)

作为参考,每次在屏幕上绘制约100个这些点精灵-每个顶点的顶点属性是纹理图集的位置,半径,深度和偏移坐标。在shadertoy示例中,仅使用一种纹理。

如何更有效地实现这种效果? (无论是在着色器本身内部还是使用其他OpenGL功能)将这些底部像素写入然后读取到1D纹理中会更快吗?有什么方法可以操纵颜色缓冲区来向下重复颜色?我觉得将形状更改为矩形而不是圆角矩形可以更快地计算底部边缘,但是我希望可以选择使用正方形,圆形以及介于两者之间的所有内容,而且我个人肯定该查找方法如果没有下面的值或上面的值,则向下或向上复制像素的效率要比某些方法向下或向上复制像素的效率低。

编辑:向上还是向下重复取决于示例中显示的角度,但是过程显然是相同的。

在此先感谢您能提供帮助

0 个答案:

没有答案