我正在尝试使用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();
}
1条答案
按热度按时间dpiehjr41#
要获得规格化设备空间中线的方向,必须将剪辑空间的x和y分量除以w分量(透视分割):
vec2 dir = normalize((p2.xy - p1.xy) * u_viewportSize);