如何使用片元着色器画一条直线或曲线?
我有一个程序,它会根据用户指定的一组顶点计算贝塞尔曲线。早期,处理每个顶点以生成基于此三次贝塞尔曲线方程的一组插值点非常简单:
...然后将所有处理过的顶点存储到GL_VERTEX_ARRAY中,以便使用glDrawArrays(GL_LINE_STRIP, 0, myArraySize)进行绘制。虽然解决方案很简单,但这种实现的时间复杂度为O(n^2)。问题出现在我开始增加步骤计数时,比如每次迭代我的循环都将t增加0.01,再加上用户生成尽可能多的顶点。
所以那时我开始研究着色器,特别是片段着色器。据我所知,我们的片段着色器程序为GPU正在处理的当前片段分配一种颜色。我还没有认真研究过着色器编程,但我目前的线条着色器实现如下:
#version 120
uniform vec2 resolution;
uniform vec2 ptA;
uniform vec2 ptB;
uniform vec2 ptC;
uniform vec2 ptD;
uniform float stepTotal;
void main()
{
vec2 uv = gl_FragCoord.xy / resolution.xy;
vec2 curvePts[int(stepTotal)];
float t = stepTotal;
for(float i = 0.; i < 1.0; i += 1./t)
{
# Courtesy to: https://yalantis.com/blog/how-we-created-visualization-for-horizon-our-open-source-library-for-sound-visualization/
vec2 q0 = mix(ptA, ptB, i);
vec2 q1 = mix(ptB, ptC, i);
vec2 q2 = mix(ptC, ptD, i);
vec2 r0 = mix(q0, q1, i);
vec2 r1 = mix(q1, q2, i);
vec2 p_int = mix(r0, r1, i);
curvePts[int(i) * int(stepTotal)] = p_int;
}
// TO DO:
// Check if current fragment is within the curve. Not sure how
// to proceed from here...
}
如您所见,我目前卡在了如何检查当前片段是否在曲线内以及如何为该特定片段分配颜色的问题,最终在显示时成为一条曲线。