如何使用OpenGL着色器在平面上绘制没有透视的纹理?

时间:2017-08-26 11:53:32

标签: opengl 3d glsl

我试图在3d环境中绘制一个二维角色。我正在使用一架面向相机的飞机。只有在没有与墙壁的深度交叉时,才能给出正确的结果。关闭深度测试不是答案,因为飞机仍然需要在其他墙壁,门和物体后面。

A.) Plane facing camera - Plane intersects with wall and objects

然后,我使平面垂直,这为深度测试交叉点提供了所需的结果。然而现在由于透视,2D角色变形,并且看起来给他一个大头和/或更短的身体。不是我追求的结果。

B.) Plane is perpendicular - Perspective deforms 2d character

理想情况下,我希望能够绘制垂直平面以使用所需的深度测试相交,并使用着色器绘制没有透视(和缩放)的纹理。这样可以保持深度测试与平面相交(对于墙壁,门,物体等),并为我提供2d字符的正确比例。

C.) Plane is perpendicular - Texture is drawn without perspective

更新

也许另一种方法是使用模板?理想情况下不使用它们会很好。

  • 启用模板测试并设置测试功能和操作,将1写入所有模板。
  • 垂直绘制平面。
  • 如果模板值等于1,则设置模板功能。
  • 绘制面向相机的2d角色。
  • 禁用模板测试。

更新

可能在不使用法线的情况下在平面上绘制平面反射?像立方体反射,或球形反射,但只是平坦。有任何想法吗?

1 个答案:

答案 0 :(得分:0)

您可以使用A)中的解决方案,但更改您的Z值(用于深度测试)以获得更好的位置。

所以在你的顶点着色器结束时,你会得到类似的东西:

gl_Position = projModelViewMatrix * vec4(position, 1.0);

将3d位置转换为屏幕空间位置。更改gl_Position.z将更改用于深度测试的值。在这种情况下,您希望此值稍微靠近相机。

最好让这个值变得复杂但是假设你的模型矩阵是精灵底部中间的点然后将你的世界空间Z,X归零并保持每个顶点的Y轴,它会给你一个体面的位置,用z进行测试。

gl_Position = projModelViewMatrix * vec4(position, 1.0);
gl_Position.z = projModelViewMatrix * vec4(0.0, position, 0.0, 1.0);

*警告:未经测试,有一段时间没有碰到过glsl,只是在我头顶打字。

祝你好运!