OpenGL着色器效果

OpenGL着色器效果,opengl,glsl,shader,fbo,Opengl,Glsl,Shader,Fbo,我需要一个高效的openGL管道来实现线段形状的特定外观 这是我的目标: () 这是我在程序中已经拥有的基本体(螺旋体)之一: 在这张照片的gl_FragColor内,我正在输出碎片到相机的距离。用于此操作的管道是通常的VBO->VAO->顶点着色器->片段着色器路径 shadertoy着色器计算到屏幕每个片段中3个点的距离,并根据该距离输出颜色。但在我的例子中,我需要相反的结果。为螺旋的每个碎片计算周围碎片的颜色(在本例中)。是否需要使用FBO将场景渲染到纹理中,或者是否有快捷方式 适用于

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

这是我的目标:

()

这是我在程序中已经拥有的基本体(螺旋体)之一:

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

shadertoy着色器计算到屏幕每个片段中3个点的距离,并根据该距离输出颜色。但在我的例子中,我需要相反的结果。为螺旋的每个碎片计算周围碎片的颜色(在本例中)。是否需要使用FBO将场景渲染到纹理中,或者是否有快捷方式

  • 适用于有限数量的小行

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

  • 用于更多行数

    您需要将几何图形从直线转换为覆盖直线受影响环境的矩形:

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

    您的图像表明灯光影响整个屏幕,因此在这种情况下,您需要调用每行覆盖整个屏幕的四边形覆盖,而不是矩形覆盖

  • 最后我用了:

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

    与:


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

    VBA是什么意思?当你说3点时,你指的是哪一点?我指的是VAO顶点数组对象。我所说的3点是shadertoy示例中的红蓝绿点。您为螺旋建议的方法听起来好像您不了解片段着色器是如何工作的。您对每个片段进行计算,并且只能确定当前片段的颜色。不能更改周围的片段。
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE);  // additive blend