【问题标题】:Odd OpenGL fragment shader behavior with gl_PointCoord带有 gl_PointCoord 的奇怪 OpenGL 片段着色器行为
【发布时间】:2014-10-05 22:51:37
【问题描述】:

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

我有使用glDrawArrays(GL_LINES, 0, points.size()); 的线图,points 是一个 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;

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

有什么建议吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 现在我觉得自己很傻。没有办法获得我需要的信息,除非传递将线定义为制服的 2 个点(或一个点和长度)?
    • 我不知道你为什么要使用制服。正如我所说,属性很好。您甚至可以在 GPU 上的几何着色器中动态生成数据。
    • 我看不出让 GPU 在重绘时重新计算颜色的危害。可能还是比从 cpu 传输数据要好。
    • 哦,我做了更多的研究,现在我明白了。如果将每个顶点的颜色传递给顶点着色器并作为不同的颜色输出到片段着色器,OpenGL 会自动为每个片段插入这些颜色(提供平滑渐变)。谢谢,这就是我最终要做的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 2017-04-18
    • 2013-02-24
    相关资源
    最近更新 更多