gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:43:03 25 4
gpt4 key购买 nike

我正在尝试在 3d 环境中绘制 2d 角色。我正在使用面向相机的飞机。只有在与墙壁没有深度相交的情况下,这才会给我正确的结果。关闭深度测试不是答案,因为飞机仍然需要在其他墙壁、门和物体后面。

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

然后我使平面垂直,这给了我想要的深度测试相交结果。然而,现在 2d 角色由于透视而变形,并且似乎给了他一个大头和/或较短的 body 。不是我追求的结果。

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

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

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

更新

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

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

  • 更新

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

    最佳答案

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

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

    gl_Position = projModelViewMatrix * vec4(position, 1.0);

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

    最终获得正确的值可能会很复杂,但假设您的模型矩阵是 Sprite 底部中间的点,然后将您的世界空间 Z,X 归零并仅保留每个顶点的 Y 轴,将为您提供一个不错的位置进行 z 测试。
    gl_Position = projModelViewMatrix * vec4(position, 1.0);
    gl_Position.z = projModelViewMatrix * vec4(0.0, position, 0.0, 1.0);

    *警告:未经测试,有一段时间没有接触过 glsl,只是在我的脑海中输入了这个。

    祝你好运!

    关于opengl - 如何使用OpenGL着色器在平面上绘制没有透视的纹理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45895057/

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