OpenGL着色器效果

时间:2015-07-09 12:39:29

标签: opengl glsl shader fbo

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

这是我的目标:
enter image description here
https://www.shadertoy.com/view/XdX3WN

这是我在程序中已经拥有的原型之一(螺旋形):

spiral

对于这张图片,我在gl_FragColor里面输出从片段到相机的距离。用于此的流水线是通常的VBO-> VAO-> Vertex着色器 - >片段着色器路径。

shadertoy着色器计算屏幕每个片段中3个点的距离,并根据该值输出颜色。但在我的例子中,我需要反过来。为永远的螺旋碎片计算周围碎片的颜色(在这种情况下)。是否有必要使用FBO将场景渲染到纹理中,或者是否有快捷方式?

2 个答案:

答案 0 :(得分:1)

  1. 适用于数量有限的行

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

  2. 行数越多

    您需要将几何图形从线条转换为覆盖受影响的线条周围的矩形:

    quad example

    使用透明度正确合并线条,并从线条的垂直距离计算颜色。添加距端点距离的点(可以使用纹理而不是着色器完成)。

    您的图片显示光线会影响整个屏幕,因此在这种情况下,您需要调用每行覆盖整个屏幕的Quad而不是矩形覆盖

答案 1 :(得分:1)

最后我使用了:

  • CatmullRom样条插值以从控制点获取点数据
  • 从以上几点构建VBO
  • Vortex着色器:传递点位置数据
  • 几何着色器:为每个点发出精灵大小四边形
  • 片段着色器:使用exp函数从精灵四边形的中心获得平滑的渐变颜色

结果是这样的:

enter image description here

使用:

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

使用GL_RGBA16向FBO呈现更平滑。