2016-03-07 4 views
1

Есть ли общая мудрость о том, сколько математической матрицы должно быть выполнено на процессоре и графическом процессоре для обычных 3D-операций?Матричная математика на процессоре или графическом процессоре для обычных 3D-операций

Типичный трехмерный шейдер может потребовать нескольких матриц. Мировая матрица для вычисления вычислений поверхности на свет. Мировая обратная матрица транспонирования для нормальных вычислений. Матрица проекции мировоззрения для 3D-проекции. И т. Д.

Есть два основных способа приблизиться к этому.

  1. Вычислить матрицы на CPU и загрузить вычисленные матрицы в ГПУ

    В некотором языке CPU

    worldViewProjection = world * view * projection 
    worldInverseTranspose = transpose(inverse(world)); 
    
    upload world, worldViewProjection, worldInverseProjection to GPU 
    

    на использовании графического процессора world, worldViewProjection, worldInverseProjection, где это необходимо.

  2. Pass различных компонентов матрицы к GPU (мир, вид, проекции) и вычислить необходимые матрицы на GPU

    В некотором языке CPU

    upload world, view, projection to GPU 
    

    На GPU

    worldViewProjection = world * view * projection 
    worldInverseTranspose = transpose(inverse(world)); 
    

Я понимаю, что на каком-то уровне я, вероятно, просто должен профилировать на diffe арендные машины и графические процессоры, и для рисования миллиона вершин в 1 обратном вызове могут быть разные потребности, чем рисование 4 вершин в 1 призыве на рисование, но ... Мне интересно ...

Есть ли общая мудрость о том, когда делать математика на графическом процессоре и процессоре для матричных вычислений.

Другой способ задать этот вопрос: каким должен быть мой номер по умолчанию: # 1 или # 2, после чего позже я смогу профилировать те случаи, когда по умолчанию это не лучшая производительность.

+0

Это, как правило, не так много узкого места, потому что одна матрица (если она предоставлена ​​предварительно умноженной) может служить миллионам точек, но отправка готовых материалов в шейдеры должна быть намного более эффективной.Кроме того, если у вас есть буквально тысячи экземпляров для рендеринга, то наиболее экономичным методом будет Hardware Instancing и единая матрица предварительного умножения проекции *. Также хорошо держать все вычисления в одном и том же пространстве. Например, обеспечьте представление X proj и мир отдельно. Обеспечить световые координаты непосредственно в поле зрения X proj X world и т. Д. –

+1

Imho есть хороший ответ в [этом очень подобном вопросе] (http://stackoverflow.com/questions/16620013/should-i-calculate-matrices-on- заместитель ГПА-или-на-CPU). –

+0

Когда вы делаете это на GPU, вы будете делать это для каждой вершины, пикселя, ... снова и снова. CPU вычисляет его один раз. Для меня я делаю все, что предсказывает процессор. – kaiser

ответ

2

При принятии решения о CPU/GPU вычислений, проблема не расчет, но потокового.

Расчет графического процессора очень дешевый. Поскольку ваш расчет world * view * projection предполагает униформу, вполне вероятно, что это будет оптимизировано.

Однако, если вы решите вычислить на графическом процессоре, то worldview и projection должны быть переданы как индивидуальные однородные матрицы. Это занимает больше времени, чем потоковая передача одной матрицы, а также использует более однородные компоненты в вашем шейдере.

Обратите внимание, что время течения для униформ минимально по сравнению с данными текстуры или данными буфера. Из-за этого вы вряд ли ударите ограничения производительности, и если вы это сделаете, это легко оптимизировать.

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