2015-07-17 3 views
0

У меня есть проблема, которая, как я полагаю, связана с ошибками с плавающей запятой в 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); 
} 

Это не весь код шейдера, очевидно, но эти расчеты получили следующий результат:

enter image description here

Тогда я хотел оптимизировать код немного и перемещать расчеты MVP в CPU и передать его на шейдерах в мундире, как так:

uniform mat4 MVP; 

layout(location = 0) in vec3 inPos; 

void main(void) 
{ 
gl_Position = MVP * vec4(inPos, 1.0); 
} 

Таковы результаты:

enter image description here

Я смотрел на мои 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); 
} 

Итак, любые идеи о том, что может быть проблемой? Это могут быть ошибки с плавающей запятой? Спасибо за любые ответы!

+0

Нет, я подозреваю, что у кода есть проблема. У меня больше уверенности в представлении с плавающей запятой (> 90%), чем в коде. Кроме того, если числа с плавающей запятой IEEE ошибочны, ничего не поделаешь. По крайней мере, если ваш код плох, есть шанс, что вы его найдете и исправите. – duffymo

+0

Достаточно честный. Спасибо за ваш ответ! – Edvin

+0

@duffymo. Хотя ожидается, что поплавковые входы GLSL будут IEEE 754, стандарт утверждает, что операции «не обязательно выполняются в соответствии с требованиями IEEE 754» (раздел 4.1.4) – GuyRT

ответ

0

Это не точные проблемы с матрицами трансформации; любая проблема, связанная с этим, будет отображаться как несоосность (тени или объектов), а не как артефакты рендеринга.

Это больше похоже на ошибку разрешения выборки буфера; ваши матрицы преобразования могут быть виноваты здесь, но не из-за ограниченной точности матрицы, а потому, что при выполнении светового расстояния передайте матрицу проекции, которую вы выбираете, сжимает всю информацию о глубине в очень маленький диапазон. Обычно вам нужен параметр nearлюбойпроекция матрица должна быть как можно больше; значения глубинных буферов, генерируемые традиционными матрицами проектирования, являются нелинейными (они следуют соотношению 1/x), поэтому, если близко очень мало, большая часть доступного диапазона чисел получает компрессы, очень близкие к плоскости ближнего клипа. Если вы используете такой сгенерированный буфер в теневом отображении, после реверсирования сжимания глубины вы разложили свои биты глубины таким образом, казалось бы, случайным образом.

Два возможных решения:

  • использовать более сбалансированную матрицу проекции для прохождения света.

или

  • Не использовать световой проход (нелинейный) буфер глубины для карты теней, но генерирует линейную глубину изображения с помощью «вручную» писать «абсолютное» расстояние в мировых единицах пространства в теневую карту, явно в шейдере фрагмента света (вы можете также записать эти значения в буфер глубины, но обычно это связано с некоторой пессимистичностью производительности).
+0

Вы, скорее всего, правы. Но я обнаружил, что проблема заключается в том, что я использовал смесь вычисляемых процессором MVP и GPU, рассчитанных MVP. Поскольку в тенях шейдеров мне нужны как матрица P и V света, так и матрица P и V миров, но одна и та же матрица M для обоих вычислений. Я решил использовать GPU для этих вычислений MVP, но во всех других шейдерах, которые использовал процессор. – Edvin

Смежные вопросы