Получение минимальных и максимальных визуализированных значений UV (Direct3D) - PullRequest
1 голос
/ 06 сентября 2010

Мне нужно рассчитать минимальное и максимальное значения УФ, назначенные пикселям, полученным, когда данный объект рисуется на экране с определенной точки зрения. Например, если у меня есть куб с UV-отображением, но видима только передняя грань, для min (UV) и max (UV) следует установить минимальные и максимальные координаты UV, назначенные пикселям видимой грани.

Я бы хотел сделать это, используя шейдеры Direct3D 9 (и самую низкую модель шейдеров), чтобы ускорить обработку. Вершинный шейдер может быть таким же простым, как получение UV-координат каждой входной вершины и передача их без изменения в пиксельный шейдер. Пиксельный шейдер, с другой стороны, должен был бы принимать значения, полученные вершинным шейдером, и использовать их для вычисления минимального и максимального значений УФ.

Я бы хотел знать:

  1. Как мне поддерживать состояние (текущие минимальные и максимальные значения) между вызовами пиксельного шейдера?
  2. Как мне получить последние минимальные и максимальные значения, полученные шейдером, в мою программу?

Есть ли способ сделать это в HLSL, или я застрял, делая это вручную? Если HLSL не будет работать, каков будет самый эффективный способ сделать это без использования шейдеров?

1 Ответ

1 голос
/ 06 сентября 2010

1) Вы нет. 2) Вы должны были бы сделать чтение назад в какой-то момент. Это будет довольно медленный процесс и вызовет остановку конвейера.

В общем, я не могу придумать хороший способ сделать это. Что именно вы пытаетесь достичь с этим? Может быть и другой способ достичь желаемого результата.

Вы «можете» что-то добиться, используя несколько целей рендеринга и записывая UV для каждого пикселя в цель рендеринга. Затем вам нужно будет передать цель рендеринга обратно в основную память, а затем проанализировать ее для ваших минимальных и максимальных значений. Это очень медленное и очень уродливое решение.

Если вы можете сделать это за пару отдельных проходов, вы сможете рендериться на очень маленькую цель рендеринга и использовать 1 проход с максимумом и 1 проход с операцией смешивания Min alpha. Опять же ... не очень хорошее решение.

...