У меня есть проблема, которая, как я полагаю, связана с ошибками с плавающей запятой в CPU.CPU против точности плавающей запятой GPU матрицы MVP
В настоящее время я работаю над shadowmaps и сначала я имел расчеты MVP на GPU, например
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% уверен, что все правильно там.
Я даю класс контейнера матрицам с заданными функциями и извлекаю их с помощью одного приемника.
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
Достаточно честный. Спасибо за ваш ответ! – Edvin
@duffymo. Хотя ожидается, что поплавковые входы GLSL будут IEEE 754, стандарт утверждает, что операции «не обязательно выполняются в соответствии с требованиями IEEE 754» (раздел 4.1.4) – GuyRT