使用gl_PointCoord的奇数OpenGL片段着色器行为

时间:2014-10-05 22:51:37

标签: c++ opengl glsl vector-graphics freeglut

我试图画一条二维线,两种颜色之间有一个平滑的渐变。我的应用程序允许我单击并拖动,线段的第一个点是第一个点击点,线的第二个点跟随鼠标光标位置。

我使用glDrawArrays(GL_LINES, 0, points.size());绘制线条图,点是2个点的索引数组。

该行绘制精细,单击并拖动以围绕作品移动线条,但我的片段着色器具有可解释的行为:

uniform vec4 color1; //Color at p1
uniform vec4 color2; //Color at p2

out vec4 fragColor;      
void main() 
{
    //Average the fragment positions
    float weight = (gl_PointCoord.s + gl_PointCoord.t) * 0.5f; 

    //Weight the first and second color
    fragColor = (color1 * weight) + (color2 * (1.0f - weight));
}

color1为红色,color2为绿色。

当我拖动它的线时,它会在完全红色,完全绿色,我想要的渐变之间反弹,或者在每个屏幕上重新绘制一些红色和绿色的固体混合物。

我怀疑我错误地使用了gl_PointCoord,但我无法在着色器中检查这些值。我在着色器中尝试了以下内容:

fragColor = (color1 + color2) * 0.5f;

它提供稳定的黄色,所以我有信心在重绘之间颜色是稳定的。

任何提示?

1 个答案:

答案 0 :(得分:3)

gl_PointCoord仅为 point 原始定义。将它与GL_LINES一起使用只是未定义的行为,永远不会起作用。

如果想要平滑渐变,则应在行顶点添加weight属性,并分别为起点和终点设置为0或1。