gpt4 book ai didi

opengl - GLSL 几何着色器替换 glLineWidth

转载 作者:行者123 更新时间:2023-12-03 23:13:37 32 4
gpt4 key购买 nike

我正在尝试编写一个几何着色器来替换 glLineWidth行为。我想绘制具有可自定义宽度的线条(现在使用统一的宽度就足够了)。无论相机投影或与线条的距离如何,线条都应始终具有相同的粗细。

基于大量的谷歌搜索,我想出了以下几何着色器:

#version 330

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

uniform mat4 u_model_matrix;
uniform mat4 u_view_matrix;
uniform mat4 u_projection_matrix;
uniform float u_thickness = 4; // just a test default

void main()
{
float r = u_thickness / 2;

mat4 mv = u_view_matrix * u_model_matrix;
vec4 p1 = mv * gl_in[0].gl_Position;
vec4 p2 = mv * gl_in[1].gl_Position;

vec2 dir = normalize(p2.xy - p1.xy);
vec2 normal = vec2(dir.y, -dir.x);

vec4 offset1, offset2;
offset1 = vec4(normal * r, 0, 0);
offset2 = vec4(normal * r, 0, 0);

vec4 coords[4];
coords[0] = p1 + offset1;
coords[1] = p1 - offset1;
coords[2] = p2 + offset2;
coords[3] = p2 - offset2;

for (int i = 0; i < 4; ++i) {
coords[i] = u_projection_matrix * coords[i];
gl_Position = coords[i];
EmitVertex();
}
EndPrimitive();
}

为了完整起见,这里是顶点着色器:
#version 330

in vec4 a_position;

void main() {
gl_Position = a_position;
}

...和我的片段着色器:
#version 330

uniform vec4 u_color = vec4(1, 0, 1, 1);
out vec4 fragColor;

void main() {
fragColor = u_color;
}

我无法让数学在所有情况下都适用。使用正交相机,以上工作正常:

Orthogonal camera, close by

但是对于透视相机,问题在于线不是固定的尺寸。相对于物体的距离,它变得越来越小。

Perspective camera, close by

Perspective camera, far away

我也希望使用透视相机的线条大小相同。我究竟做错了什么?

最佳答案

我不是专家,但之前做过这个,我会提供我的见解。

我假设你的 gl_Position s 直接来自使用投影矩阵计算的顶点着色器。这意味着他们的 w组件是点的“剪辑空间位置”;这是管道用来给投影效果的东西(更远的东西更小)。所以需要考虑到这一点。

幸运的是,您唯一需要做的就是乘以它的偏移量。

coords[0] = p1 + offset1 * p1.w;
coords[1] = p1 - offset1 * p1.w;
coords[2] = p2 + offset2 * p2.w;
coords[3] = p2 - offset2 * p2.w;

这应该给你你想要的效果。

关于opengl - GLSL 几何着色器替换 glLineWidth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54686818/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com