2016-01-10 5 views
0

В настоящее время, я вычисляю Матрицу прогноза мирового вида в моем приложении вместо графического процессора. Я хочу переместить этот расчет на GPU, но в настоящее время я не могу этого сделать.Матричное умножение не работает в моем вершинном шейдере

Корпус 1 (см. Ниже) работает очень хорошо, но в случае 2 нет, и я понятия не имею, что я сделал неправильно.

В моем классе камеры, я вычислить матрицы Просмотр и Проекционных так:

ViewMatrix = SharpDX.Matrix.LookAtLH(_cameraPosition, _lookAtPosition, SharpDX.Vector3.UnitY); 
ProjectionMatrix = SharpDX.Matrix.PerspectiveFovLH((float)Math.PI/4.0f, renderForm.ClientSize.Width/(float)renderForm.ClientSize.Height, 0.1f, 500.0f); 

Затем рассчитать Всемирную матрицы для каждого из моих моделей в процессе визуализации:

SharpDX.Matrix worldMatrix = SharpDX.Matrix.Translation(_position); 

Случай 1: Расчет матрицы в моем приложении

При визуализации модели, рассчитать миросозерцания матрицы проекции так:

SharpDX.Matrix matrix = SharpDX.Matrix.Multiply(worldMatrix, camera.ViewMatrix); 
matrix = SharpDX.Matrix.Multiply(matrix, camera.ProjectionMatrix); 

matrix.Transpose(); 

И в моем вершинном шейдере, рассчитать конечное положение моих вершин по телефону:

output.pos = mul(input.pos, WVP); 

И все работает отлично!

Случай 2: Расчет матрицы в HLSL

Вместо вычисление ничего в моем приложении, я просто пишу три матрицы мира, Посмотреть и Проекционных в постоянный буфер моих вершинных шейдеров и рассчитать все в HLSL:

matrix mat = mul(World, View); 
mat = mul(mat, Projection); 

mat = transpose(mat); 

output.pos = mul(input.pos, mat); 

Это действительно работает. Я ничего не вижу в своей сцене. Поэтому я предполагаю, что некоторые вычисления были неправильными. Я проверил свой код несколько раз.

Либо я слепой или глупый. Что я сделал не так?

+0

Это могут быть результаты различий в том, обрабатываются ли матрицы как рядовые или столбчатые. Вы пытались удалить транспозицию из шейдера в примере 2? –

+0

Привет, Адам Майлз! Спасибо за ваш ответ. Я уже пробовал это. Когда я удаляю транспонирование в случае 1, я не вижу своих моделей. При удалении транспонирования в случае 2 я все еще не вижу их. – Endgegner85

+0

Вы пытались использовать любые отладчики GPU, например, встроенные в Visual Studio? Возможно, стоит проверить содержимое константного буфера, как и следовало ожидать. –

ответ

0

Я использовал несколько дней, чтобы экспериментировать с HLSL шейдеров и с моими рендеринга функций. Оказалось, что я перенес одну матрицу, которую я не должен был делать. В результате вся моя сцена была испорчена. Было не так весело отлаживать, но теперь это работает! :-)

0

в hlsl вам не нужно вычислять транспонирование. Вы также используете float4x4, поэтому легко увидеть, какие размеры вы используете. Ваши матрицы просто должны выглядеть следующим образом:

float4x4 worldViewProj = mul(world, mul(view, proj)); 
float4 pos = mul(input.pos, worldViewProj); 

Имейте в виду, что точки от типа float4 (х, у, г, 1) и векторы float4 (х, у, г, 0).

В линейной алгебре умножение вектора

'= ⋅

так что вам нужно транспонирование для изменения стороны М

' = pT⋅ (Т означает транспонирование)

HLSL немного отличается. Для простейшего способа просто умножьте все матрицы слева направо, а затем используйте функцию mul с вашим вектором слева, как и в моем примере выше.

Для получения более подробной информации читайте это: HLSL mul()