【问题标题】:Geometry shader doesnt work as expected几何着色器无法按预期工作
【发布时间】:2016-03-04 11:12:18
【问题描述】:

我已经编写了一个地理着色器,它获取一条线(2 个顶点),并且应该沿线法线添加宽度(长度)。如果没有地理着色器,一切都会正确显示。我还用铅笔和纸计算了公式(工作)。我用公式计算它们:

N1 = (-(x2 - x1),y2-y1) N2 = (x2 - x1 , -(y2 - y1))

我的代码:

#version 330 core
layout(lines) in;
layout(triangle_strip, max_vertices = 4) out;
uniform float length;

void main()
{
            //A -(x2 - x1) |   y2 - y1
            //B   x2 - x1  | -(y2 - y1)
            vec2 normal = normalize(vec2(gl_in[1].gl_Position.x - gl_in[0].gl_Position.x, gl_in[1].gl_Position.y - gl_in[0].gl_Position.y));
            vec3 normalA = vec3(-normal.x, normal.y, 0);
            vec3 normalB = vec3(normal.x, -normal.y, 0);
            gl_Position = gl_in[0].gl_Position + (vec4(normalB, 0) * length);
            EmitVertex();
            gl_Position = gl_in[0].gl_Position + (vec4(normalA, 0) * length);
            EmitVertex();
            gl_Position = gl_in[1].gl_Position + (vec4(normalA, 0) * length);
            EmitVertex();
            gl_Position = gl_in[1].gl_Position + (vec4(normalB, 0) * length);
            EmitVertex();
            EndPrimitive();
}

P0 [0.3, 0.3] P1 [0.4, 0.3]

【问题讨论】:

  • 几何着色器使用会发生什么?编译着色器时是否检查错误?
  • 是的,当我不应用我的“公式”时它会起作用。

标签: opengl shader render geometry-shader


【解决方案1】:

您的公式显然是错误。您为这些特定的输入点创建一个面积为零的三角形条带。

如果您有一个 2D 向量 (x,y),则与此垂直的两个向量是 (-y, x)(y, -x),而不是您当前使用的 (-x,y) 和 (x,-y)。

对于您的输入点 P0 和 P1 以及您的原始公式,您将得到 normalAnormalB 的 y 分量为 0,所以最后,所有 4 个点都将在 y 上排成一行=0.3,这会产生一个由两个零面积三角形组成的三角形条带,这些三角形永远不会被光栅化。

我会建议以下代码(也稍微简化了语法):

        vec2 direction = normalize(gl_in[1].gl_Position.xy - gl_in[0].gl_Position.xy);
        vec4 offset =v ec4(-direction.y, direction.x, 0, 0) * length;
        gl_Position = gl_in[0].gl_Position - offset;
        EmitVertex();
        gl_Position = gl_in[0].gl_Position + offset;
        EmitVertex();
        gl_Position = gl_in[1].gl_Position + offset;
        EmitVertex();
        gl_Position = gl_in[1].gl_Position - offset;
        EmitVertex();
        EndPrimitive();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 2022-11-17
    • 2019-06-26
    • 2014-05-29
    • 2012-05-19
    相关资源
    最近更新 更多