Opengl 如何绘制具有世界空间宽度的点基本体?

Opengl 如何绘制具有世界空间宽度的点基本体?,opengl,3d,shader,point,primitive,Opengl,3d,Shader,Point,Primitive,我想画一个点来模拟光源的位置,但是我现在面临的问题是,无论距离有多远,它的大小都是一样的: 我将一个顶点按入GPU,我的代码: point.vs.glsl #version 440 core layout(location = 0) in vec4 position; layout(location = 0) uniform mat4 model_matrix; layout(location = 1) uniform mat4 view_matrix; layout(location =

我想画一个点来模拟光源的位置,但是我现在面临的问题是,无论距离有多远,它的大小都是一样的:

我将一个顶点按入GPU,我的代码:

point.vs.glsl

#version 440 core

layout(location = 0) in vec4 position;

layout(location = 0) uniform mat4 model_matrix;
layout(location = 1) uniform mat4 view_matrix;
layout(location = 2) uniform mat4 proj_matrix;

void main(void) {
    gl_PointSize = 100.0;
    gl_Position = proj_matrix * view_matrix * model_matrix * position;
}
#version 440 core

out vec4 color;

void main(void) {
    //create round point
    vec2 p = gl_PointCoord * 2.0 - vec2(1.0);
    if (dot(p, p) > 1.0) {
        discard;
    }

    color = vec4(0.5, 0.0, 0.0, 1.0);
}
point.fs.glsl

#version 440 core

layout(location = 0) in vec4 position;

layout(location = 0) uniform mat4 model_matrix;
layout(location = 1) uniform mat4 view_matrix;
layout(location = 2) uniform mat4 proj_matrix;

void main(void) {
    gl_PointSize = 100.0;
    gl_Position = proj_matrix * view_matrix * model_matrix * position;
}
#version 440 core

out vec4 color;

void main(void) {
    //create round point
    vec2 p = gl_PointCoord * 2.0 - vec2(1.0);
    if (dot(p, p) > 1.0) {
        discard;
    }

    color = vec4(0.5, 0.0, 0.0, 1.0);
}
另外,创建圆点的代码在3D中是否也有效?如果我没弄错的话,我相信它来自2D教程


关于点的大小,我知道我做错了什么,但是如何正确计算点的大小?我有可用的信息,我想,通过
查看\u矩阵
,我需要获得到点的距离,并根据该距离进行缩放。

如果启用
GL\u点平滑
或多重采样,圆点会自动出现。但在许多实现中,它们的最大大小约为63.5
gl_PointSize
是在屏幕空间中定义的,这就是为什么无论点离得有多远,它的大小都是恒定的。@AndonM.Coleman感谢您的解释,但是我如何分别缩放点,使它们看起来像来自世界大小?还有
glEnable(gl_point_SMOOTH)
给出了一个无效的枚举错误,我是否遗漏了什么?否,
GL\u POINT\u SMOOTH
在预期的核心配置文件中被弃用。是否希望此点大致接近灯光的体积?或者只是一个简单的点,它越远越小?如果你有一个透视投影,你可以试试像
gl_PointSize=100.0*gl_Position.w
这样的东西。@AndonM.Coleman我使用的是第一人称视图,它最终会转换成一个平截头体,所以我认为这仍然是透视投影?我还建议除以
gl.Position.w