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

时间:2017-01-20 15:46:47

标签: opengl 3d shader vertex-shader geometry-shader

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

Billboard in which the size is preserved despite the camera being far away Billboard in which the rotation is fixed despite rotating the camera

在我的情况下唯一的区别是,我想要一个3D对象而不是二维条。

为此,我试图按照this tutorial中的替代3(与拍摄图像的位置相同),但我无法弄清楚他们做出的许多假设(可能是由于我缺乏图形和OpenGL的经验。

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

gl_Position = project * view * model * position;

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

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

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

但我得到的是一种形状,当靠近相机时尺寸更大,否则更小。我忘记了什么吗?

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

1 个答案:

答案 0 :(得分:3)

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深度)并且您不必跟踪屏幕的宽高比(如链接教程所做的那样)。但它取决于投影矩阵。

相关问题