繁体   English   中英

OpenGL着色器效果

[英]OpenGL shader effect

我需要一个高效的openGL管道来实现线段形状的特定外观。

我的目标是:
在此处输入图片说明
https://www.shadertoy.com/view/XdX3WN

这是我的程序中已有的原始元素(螺旋形):

螺旋

在这张图片的gl_FragColor内部,我正在输出片段到相机的距离。 用于此的管道是通常的VBO-> VAO->顶点着色器->片段着色器路径。

shadertoy着色器计算到屏幕每个片段中3个点的距离,并据此输出颜色。 但是在我的示例中,我需要相反的方法。 计算周围的碎片的颜色,以获得螺旋的任何碎片(在这种情况下)。 是否有必要使用FBO将场景渲染为纹理,还是有捷径?

  1. 对于少量的行

    使用覆盖该区域或屏幕的单个四边形作为几何体,并将线点坐标和颜色作为一维纹理或uniform发送到着色器。 然后,您可以一次在每行所有像素的片段着色器中进行计算。 较高的行数会大大降低速度。

  2. 对于更多的行

    您需要将几何形状从直线转换为覆盖直线周围环境的矩形:

    四边形示例

    使用透明度正确地合并线并从距线的垂直距离计算颜色。 从端点到端点的距离添加点(可以用纹理代替着色器完成)。

    您的图像表明光线会影响整个屏幕,因此在这种情况下,您需要调用Quad以每行覆盖整个屏幕,而不是矩形覆盖范围

最后,我使用了:

  • CatmullRom样条插值可从控制点获取点数据
  • 从以上几点构建VBO
  • 涡流着色器:通过点位置数据
  • 几何着色器:为每个点发射精灵大小四边形
  • 片段着色器:使用exp函数从子画面四边形的中心获取平滑的渐变颜色

结果是这样的:

在此处输入图片说明

有:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);  // additive blend

它使用GL_RGBA16渲染到FBO,以获得更高的平滑度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM