【问题标题】:Drawing tessallated LineLoops in OpenGL/GLSL在 OpenGL/GLSL 中绘制镶嵌的 LineLoop
【发布时间】:2016-04-27 19:31:48
【问题描述】:

我在球体(行星的边界)上渲染一些 LineLoop,并希望将它们镶嵌成较短的线,以防止长线剪裁到球体中。 例子:

这是我当前的源代码: C++ 绘图调用:

void Border::Draw() const
{
    glBindVertexArray(_vao);

    glPatchParameteri(GL_PATCH_VERTICES, 2);
    glDrawArrays(GL_PATCHES, 0, _size);

    glBindVertexArray(0);
}

顶点着色器:

#version 400

in layout(location = 0) vec3 position;

void main()
{
    gl_Position = vec4(position, 1.0);
}

镶嵌控制着色器:

#version 400

layout (vertices = 2) out;

void main()
{
    if(gl_InvocationID == 0)
    {
        //get the distance between two points
        float dist = length(gl_in[0].gl_Position - gl_in[1].gl_Position);
        gl_TessLevelOuter[0] = 1;
        //divide line in segments of size 1.0
        gl_TessLevelOuter[1] = abs(dist);
    }

    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
}

镶嵌评估着色器

#version 400

layout (isolines, equal_spacing) in;

uniform float planetRadius;
uniform mat4 view;
uniform mat4 projection;

void main()
{
    vec4 p = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x);

    //offset point so it is on the spheres surface
    p = normalize(p);
    p *= planetRadius;

    gl_Position = projection * view * p;
}

片段着色器:

#version 400

out vec4 outColor;

void main()
{
    outColor = vec4(1.0, 1.0, 1.0, 1.0);
}

镶嵌似乎不像我期望的那样工作(关于等值线的文档也很糟糕)。

这是我用 LineLoops 和只有顶点/片段着色器绘制它时的样子:

这就是我实施镶嵌后的样子:

线条看起来也没有镶嵌,并且长度与以前相同。

你好,乔尼

编辑: 自己找到了解决方案。查看下面的答案部分以查看它。

【问题讨论】:

标签: c++ opengl glsl tessellation


【解决方案1】:

我找到了解决方案。问题在于镶嵌着色器无法绘制线条。因此,如果您有一个由点 @​​987654321@ 定义的线带,它会在以下之间绘制线:
p1 -​​> p2
p3 -> p4
p5 -> p6

我通过给每个点 2 次着色器来修复它,所以我的列表如下所示:
{p1, p2, p2, p3, p3, p4, p4, p5, p5, p6, p6, p1}
镶嵌着色器创建以下行:
p1 -​​> p2
p2 -> p3
p3 -> p4
p4 -> p5
p5 -> p6
p6 -> p1

我的着色器现在看起来像这样:

苔丝控制:

#version 430

layout (vertices = 2) out;

void main()
{
    if(gl_InvocationID == 0)
    {
        float dist = length(gl_in[0].gl_Position.xyz - gl_in[1].gl_Position.xyz);

        gl_TessLevelOuter[0] = 1;
        gl_TessLevelOuter[1] = dist;
    }

    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
}

苔丝评估:

#version 430

layout (isolines, equal_spacing) in;

uniform float planetRadius;
uniform mat4 view;
uniform mat4 projection;

void main()
{
    //only interpolate and normalize xyz coordinates. Thanks to @aslg
    vec3 p = mix(gl_in[0].gl_Position.xyz, gl_in[1].gl_Position.xyz, gl_TessCoord.x);

    p = normalize(p);
    p *= planetRadius;

    gl_Position = projection * view * vec4(p, 1.0);
}

【讨论】:

    猜你喜欢
    • 2015-08-24
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多