【问题标题】:Can't get 2D transformation to work无法进行 2D 转换
【发布时间】:2026-01-26 23:15:02
【问题描述】:

我和我的伙伴正在尝试创建一个 2D 引擎,但我们无法让转换工作,这就是它现在的样子。我们为每个元素创建了矩阵,例如缩放、平移等。但是我们无法让四边形移动或做任何事情,我们是否犯了任何数学错误?这就是我们现在得到的,我们只是渲染 vbo 而不是使用着色器。对于着色器,我的意思是我们是 GLSL。

http://imgur.com/T0jDSTO

变换

http://pastebin.com/dKRW244e

矩阵3f

http://pastebin.com/GY0872k6

Matrix4f

http://pastebin.com/f1YNuM09

VBO

http://pastebin.com/5zVgWYtK

基本着色器

http://pastebin.com/RyeSxibQ

着色器

http://pastebin.com/68tJTswq

顶点着色器

http://pastebin.com/ffDvsL2Y

片段着色器

http://pastebin.com/SWT5EKAi

我们从哪里渲染和更新

http://pastebin.com/dTG6HHDX

我认为我搞砸了将着色器绑定到 vbo,对吗?如果是这样,我该如何解决它...

另外,我只想用现代 opengl 回答,所以没有 glBegin() 和 glEnd() 谢谢!

【问题讨论】:

  • 我很好奇,因为这可能会有所帮助,但是在您开始的课程中,您是否确保在每帧之前清除屏幕?这通常在主游戏循环中使用 glClear(GL_COLOR_BUFFER_BIT); 来完成。
  • 我在调用渲染方法之前正在执行此操作。来自一个名为 Engine 的类。
  • 无论glClear() 在哪里,都可以把它放到你的主游戏循环中。为了模拟任何类型的运动,无论是平移、变换还是反射,都需要每帧清除一次屏幕。
  • 我有,我什至测试将它放在 vbo 渲染之前。你能看看它的转换是否正确吗?

标签: opengl matrix glsl lwjgl linear-algebra


【解决方案1】:

在你的顶点着色器中,你写了gl_Position = in_Position * transform;

这应该返回一个矩阵,而不是一个向量。鉴于您的矩形是纯白色的并且您已经为颜色做出了规定,我会冒险您的着色器根本无法编译。

gl_Position = transform * in_Position; 是用矩阵变换向量的正确顺序。

【讨论】:

  • 我会在修复着色器错误后进行测试。
  • 你能看看我的矩阵是否正确完成了吗?如果我在变换中应该将每个矩阵相乘以获得变换矩阵?
  • 矩阵*向量没有错(这实际上是旧的固定函数管道遵循的约定)。 GLSL 将根据乘法的阶数将向量视为行向量或列向量,因此 M * v 与 v * transpose(M) 相同