【问题标题】:Projection matrix OpenGL/GLSL issue投影矩阵 OpenGL/GLSL 问题
【发布时间】:2014-09-22 17:05:33
【问题描述】:

我在尝试将投影矩阵应用于 GLSL 中的对象时遇到问题。

这是 GLSL 代码:

#version 330

layout (location = 0) in vec3 pos;

uniform mat4 transformationMatrix;
uniform mat4 projectionMatrix;

out vec4 originalPos;
out vec4 transformedPos;
out vec4 col;

void main(){

    col = vec4(pos, 1);
    originalPos = (projectionMatrix / transformationMatrix) * vec4(pos, 1);

    vec4 newPos = projectionMatrix * vec4(pos, 1);

    transformedPos = newPos;
    gl_Position = newPos;
}   

它在 Windows 上运行良好:

但它不适用于 Linux:

我肯定知道与投影矩阵有关的某种问题,因为如果我省略矩阵应用程序,它就可以正常工作。

代码和着色器完全相同。

使用 lwjgl 和 Java。

【问题讨论】:

  • 你在检查你的着色器编译/链接日志吗?你在 Linux 上使用 Mesa 吗?如果是这样,您是否正在创建核心上下文?如果没有,那么您将受限于 OpenGL 3.0 功能。其中包括#version 330
  • 在运行着色器之前检查过代码是否存在 OpenGL 错误?也许您正在使用一些在 Linux 中无法正常工作的特定于 Windows 的代码?
  • 我正在创建一个核心上下文,并且在每个渲染操作结束时执行 glGetError()。只是没有错误

标签: java opengl matrix lwjgl projection


【解决方案1】:

这个

originalPos = (projectionMatrix / transformationMatrix) * vec4(pos,1);

对于矢量转换来说毫无意义。 '/' 运算符在 GLSL 中应用于矩阵时会进行组件范围的除法。您可能想要通过的是反转,这是一个完全不同的操作。

【讨论】:

  • 这是添加颜色的代码,不是真正的渲染
  • @mcat:没关系。仅在某些情况下才允许对两个矩阵进行除法。任何因为事情发生在组件方面,给定典型的转换矩阵,你会得到很多除以零,这可能导致矩阵元素变为 NAN 或错误条件。无论哪种方式,这都不明智(在大多数情况下)。
【解决方案2】:

解决办法:

听起来很奇怪,但删除:

originalPos = (projectionMatrix / transformationMatrix) * vec4(pos,1);

还有transformationMatrix,它工作得很好。该代码是对闪电的测试。

【讨论】:

  • 您可能遇到了除以零的错误情况,导致着色器无法完成,留下一个空白屏幕。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-22
  • 2015-04-11
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多