Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用gl_PointCoord的奇怪OpenGL片段着色器行为_C++_Opengl_Glsl_Vector Graphics_Freeglut - Fatal编程技术网

C++ 使用gl_PointCoord的奇怪OpenGL片段着色器行为

C++ 使用gl_PointCoord的奇怪OpenGL片段着色器行为,c++,opengl,glsl,vector-graphics,freeglut,C++,Opengl,Glsl,Vector Graphics,Freeglut,我试图画一条二维线,在两种颜色之间有一个平滑的渐变。我的应用程序允许我点击和拖动,直线段的第一个点是第一个点击点,直线的第二个点跟随鼠标光标位置 我使用gldrawArray(GL_LINES,0,points.size())绘制线条,点是点的2索引数组 这条线画得很好,单击并拖动可以在作品周围移动这条线,但我的片段着色器有可解释的行为: uniform vec4 color1; //Color at p1 uniform vec4 color2; //Color at p2 out vec4

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

我使用
gldrawArray(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;
它提供了一个稳定的黄色,所以我有一些信心,颜色在重画之间是稳定的


任何提示?

gl_PointCoord
仅为点元素定义。与
GL\u行一起使用它只是未定义的行为,永远不会起作用


如果想要平滑渐变,应向线条顶点添加一个
权重
属性,并分别为起点和终点将其设置为0或1。

gl\u PointCoord
仅为点图元定义。与
GL\u行一起使用它只是未定义的行为,永远不会起作用


如果想要平滑渐变,应向线条顶点添加一个
权重
属性,并分别为起点和终点将其设置为0或1。

gl\u PointCoord
仅为点图元定义。与
GL\u行一起使用它只是未定义的行为,永远不会起作用


如果想要平滑渐变,应向线条顶点添加一个
权重
属性,并分别为起点和终点将其设置为0或1。

gl\u PointCoord
仅为点图元定义。与
GL\u行一起使用它只是未定义的行为,永远不会起作用


如果你想要一个平滑的渐变,你应该给你的线条顶点添加一个
weight
属性,并将起点和终点分别设置为0或1。

现在我觉得很傻。除了通过定义为制服的2个点(或一个点和长度)之外,没有办法获得我需要的信息?我不知道为什么要使用制服。正如我所说,属性是好的。你甚至可以在GPU上用几何体着色器动态生成数据。我看不出让GPU在重画时重新计算颜色有什么害处。可能还是比从cpu传输数据要好。哦,我做了更多的研究,现在我明白了。如果将逐顶点颜色传递给顶点着色器,并将其作为可变颜色输出到片段着色器,则OpenGL会自动为每个片段插值这些颜色(提供平滑渐变)。谢谢,这就是我最终要做的。现在我觉得自己很傻。除了通过定义为制服的2个点(或一个点和长度)之外,没有办法获得我需要的信息?我不知道为什么要使用制服。正如我所说,属性是好的。你甚至可以在GPU上用几何体着色器动态生成数据。我看不出让GPU在重画时重新计算颜色有什么害处。可能还是比从cpu传输数据要好。哦,我做了更多的研究,现在我明白了。如果将逐顶点颜色传递给顶点着色器,并将其作为可变颜色输出到片段着色器,则OpenGL会自动为每个片段插值这些颜色(提供平滑渐变)。谢谢,这就是我最终要做的。现在我觉得自己很傻。除了通过定义为制服的2个点(或一个点和长度)之外,没有办法获得我需要的信息?我不知道为什么要使用制服。正如我所说,属性是好的。你甚至可以在GPU上用几何体着色器动态生成数据。我看不出让GPU在重画时重新计算颜色有什么害处。可能还是比从cpu传输数据要好。哦,我做了更多的研究,现在我明白了。如果将逐顶点颜色传递给顶点着色器,并将其作为可变颜色输出到片段着色器,则OpenGL会自动为每个片段插值这些颜色(提供平滑渐变)。谢谢,这就是我最终要做的。现在我觉得自己很傻。除了通过定义为制服的2个点(或一个点和长度)之外,没有办法获得我需要的信息?我不知道为什么要使用制服。正如我所说,属性是好的。你甚至可以在GPU上用几何体着色器动态生成数据。我看不出让GPU在重画时重新计算颜色有什么害处。可能还是比从cpu传输数据要好。哦,我做了更多的研究,现在我明白了。如果将逐顶点颜色传递给顶点着色器,并将其作为可变颜色输出到片段着色器,则OpenGL会自动为每个片段插值这些颜色(提供平滑渐变)。谢谢,这就是我最终要做的。