如何在顶点着色器中转换顶点以获得 3D 广告牌

How to transform vertices in vertex shader to get a 3D billboard

我正在尝试实现顶点着色器代码以在给定的顶点网格上实现 "billboard" 行为。我想要的是正常定义网格(如 3D 对象),然后让它始终面向相机。我还需要它始终具有相同的大小(屏幕方面)。这两个 "effects" 应该发生:

我的情况唯一不同的是,我想要一个 3D 对象而不是 2-D 条。

为此,我尝试遵循 this tutorial 中的备选方案 3(与拍摄图像的位置相同),但我无法弄清楚他们所做的许多假设(可能是由于我缺乏图形和 OpenGL 方面的经验)。

我的着色器将公共变换堆栈应用于顶点,即:

gl_Position = project * view * model * position;

其中position是顶点位置在world-space中的输入属性。我希望能够应用模型转换(例如平移、缩放和旋转)来修改对象 相对于相机 的方向。我理解教程中解释的概念,但我似乎无法理解如何将它们应用到我的案例中。

我试过的是以下内容(摘自此 ,与教程类似):

uniform vec4 billbrd_pos;
...
gl_Position = project * (view * model * billbrd_pos + vec4(position.xy, 0, 0));

但我得到的是一个形状,离相机越近尺寸越大,反之越小。我是不是忘记了什么?

是否可以在顶点着色器中执行此操作?

uniform vec4 billbrd_pos;
...
vec4 view_pos = view * model * billbrd_pos;
float dist = -view_pos.z;
gl_Position = project * (view_pos + vec4(position.xy*dist,0,0));

这样片段深度仍然正确(在 billbrd_pos 深度)并且您不必跟踪屏幕的纵横比(如链接教程那样)。不过这取决于投影矩阵。