OpenGL线宽几何体着色器

guykilcj  于 2022-09-26  发布在  其他
关注(0)|答案(1)|浏览(262)

我正在尝试使用OpenGL 4.3实现线条粗细的几何着色器。

我遵循了公认的答案和其他给定的堆栈溢出解决方案,但根据屏幕截图,它是错误的。有什么合适的方法可以让我得到正常的屏幕吗?这在第一帧中似乎是正确的,但当我移动鼠标的那一刻,相机发生了变化,偏移方向不正确。着色器由While循环中的摄影机矩阵更新。

GLSL Geometry shader to replace glLineWidth

顶点着色器


# version 330 core

layout (location = 0) in vec3 aPos;
uniform mat4 projection_view_model;

void main()
{
    gl_Position = projection_view_model * vec4(aPos, 1.0); 
}

片段着色器


# version 330 core

//resources:
//https://stackoverflow.com/questions/6017176/gllinestipple-deprecated-in-opengl-3-1
out vec4 FragColor;

uniform vec4 uniform_fragment_color;

void main()
{
       FragColor = uniform_fragment_color;
}

几何体着色器


# version 330 core

layout (lines) in;
layout(triangle_strip, max_vertices = 4) out;

uniform float u_thickness ;
uniform   vec2    u_viewportSize ;

in gl_PerVertex
{
  vec4 gl_Position;
  //float gl_PointSize;
  //float gl_ClipDistance[];
} gl_in[];

void main() {   

 //https://stackoverflow.com/questions/54686818/glsl-geometry-shader-to-replace-gllinewidth

   vec4 p1 = gl_in[0].gl_Position;
    vec4 p2 = gl_in[1].gl_Position;

    vec2 dir    = normalize((p2.xy - p1.xy) * u_viewportSize);
    vec2 offset = vec2(-dir.y, dir.x) * u_thickness*100 / u_viewportSize;

    gl_Position = p1 + vec4(offset.xy * p1.w, 0.0, 0.0);
    EmitVertex();
    gl_Position = p1 - vec4(offset.xy * p1.w, 0.0, 0.0);
    EmitVertex();
    gl_Position = p2 + vec4(offset.xy * p2.w, 0.0, 0.0);
    EmitVertex();
    gl_Position = p2 - vec4(offset.xy * p2.w, 0.0, 0.0);
    EmitVertex();

    EndPrimitive();
}
dpiehjr4

dpiehjr41#

要获得规格化设备空间中线的方向,必须将剪辑空间的xy分量除以w分量(透视分割):

vec2 dir = normalize((p2.xy - p1.xy) * u_viewportSize);

vec2 dir = normalize((p2.xy / p2.w - p1.xy / p1.w) * u_viewportSize);

相关问题