【问题标题】:Creating a 2D game with modern opengl使用现代 opengl 创建 2D 游戏
【发布时间】:2013-11-16 17:49:47
【问题描述】:

我已经尝试了一段时间用现代 opengl 创建一个简单的 2D 引擎,用现代 opengl 我的意思是我不会使用这个:

glBegin(); glEnd(); glVertex2i(); glOrtho();

等等, 我正在使用 GLSL。

我遇到了一些问题。这里有一些问题

  • 我正在尝试不使用 glOrtho() 和 glViewport() 等旧方法创建 2D 坐标系,我知道我应该在这里和那里使用矩阵,但如何?如何创建坐标系?
  • 如何在 GLSL 中使用 texCoords 在 2D 空间中加载纹理。
  • 如果有人可以解释或指出如何设置纹理大小的来源,现在我必须使用从 -1 到 1 的位置,但我想说的是大小为 16 * 16例子。
  • 有没有办法从 GLSL 打印出错误?当我遇到错误时,它只是打印出找不到制服。因为位置是 == -1
  • 如何使用和创建矩阵在2D空间中移动、缩放和旋转。
  • 我可以使用 Matrix2f 代替 Matrix4f 吗?

如果可以的话,请用 Java 发布代码,谢谢

【问题讨论】:

  • glViewport 未被弃用,并且必须在现代 OpenGL 中使用。事实上,调用它很重要,以便 OpenGL 知道如何将 NDC 坐标映射到窗口坐标。

标签: java opengl 2d lwjgl


【解决方案1】:

免责声明:我对现代 OpenGL 没有太多经验,但我使用过最近的 DirectX。这里大部分的一般概念应该是一样的。

如何创建坐标系?

现在没有固定的功能管道,因此必须在顶点着色器中手动进行所有坐标转换。它消耗一个顶点,然后产生一个转换到屏幕空间的顶点。在 2D 图形的情况下,甚至不需要使用投影矩阵。

考虑由二维向量组成的输入流。因此使用 3D 矩阵实现旋转、缩放和平移。但输出向量应该是 4D。伪代码:

input = getInputVertex();
transformed = view * world * vec3(input, 1.0f);
output = vec4(transformed, 1.0f);

其中“world”是精灵的世界矩阵,“view”是相机的矩阵。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多