【发布时间】:2015-10-06 23:00:34
【问题描述】:
我有一个问题,我认为是由于 CPU 上的浮点错误造成的。
我目前正在处理阴影贴图,起初我在 GPU 上进行 MVP 计算,例如
layout(location = 0) in vec3 inPos;
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat4 modelMatrix;
void main(void)
{
gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(inPos, 1.0);
}
这显然不是所有的着色器代码, 但是这些计算得到了以下结果:
然后我想稍微优化一下代码并将 MVP 计算转移到 CPU 并将其作为统一传递给着色器,如下所示:
uniform mat4 MVP;
layout(location = 0) in vec3 inPos;
void main(void)
{
gl_Position = MVP * vec4(inPos, 1.0);
}
这些是结果:
我已经查看 CPU 矩阵乘法几个小时了,所以我 >90% 确定那里的一切都是正确的。
我为容器类提供了带有 set-functions 的矩阵,并使用单个 getter 检索它们。
void setModelMatrix(const glm::mat4& inModelMatrix){mModelMatrix = inModelMatrix;};
void setViewMatrix(const glm::mat4& inVewMatrix) {mViewMatrix = inVewMatrix;};
void setProjectionMatrix(const glm::mat4& inProjectionMatrix){mProjectionMatrix = inProjectionMatrix;};
//Calculates the MVP matrix and returns it
glm::mat4 getMVPMatrix() {
return (mProjectionMatrix * mViewMatrix * mModelMatrix);
}
所以.. 任何关于可能是什么问题的想法?会不会是浮点错误? 感谢您的所有回复!
【问题讨论】:
-
不,我怀疑代码有问题。与您的代码相比,我对浮点表示(> 90%)更有信心。此外,如果 IEEE 浮点数存在缺陷,则无济于事。至少如果你的代码不好,你有机会找到并修复它。
-
很公平。感谢您的回复!
-
@duffymo - 虽然 GLSL 浮点输入应为 IEEE 754,但标准规定操作“不一定按照 IEEE 754 的要求执行”(第 4.1.4 节)
-
阴影中的那些方块指向未设置的阴影贴图或计算方式错误
标签: opengl math floating-accuracy glm-math shadow-mapping