[GLSL] Как сравнить значение z всех вершин в мировой координате? - PullRequest
2 голосов
/ 22 сентября 2011

Это может быть простой вопрос.Как новичок в GLSL, я бы хотел спросить здесь.Теперь, в вершинном шейдере, я могу получить положение в мировой системе координат следующим образом:

    gl_Position = ftransform();
    posWorld = gl_ModelViewMatrix * gl_Vertex;

Вопрос: теперь я могу узнать максимальное / минимальное значение posWorld среди всех вершин?Чтобы я мог получить диапазон глубины вершины, но не буфер глубины.

Если это невозможно, как я могу получить значение z для ближней / дальней плоскости в мировой системе координат?

с наилучшими пожеланиями,

Jian

Ответы [ 2 ]

2 голосов
/ 24 сентября 2011

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

  1. Организовать буфер рендеринга размером 1x1 типа RGBA_32F в своем собственном FBO.Установить в качестве цели рендеринга (без глубины / трафарета, только одна цветовая плоскость).Это может быть пиксель большей текстуры, в этом случае вам нужно будет правильно настроить область просмотра.
  2. Очистить с базовым значением.Для 'min' это будет какое-то огромное число, для 'max' - отрицательное огромное.
  3. Установите функцию смешивания 'min' или 'max' соответственно с коэффициентами (1,1).
  4. Нарисуйте вашу сетку с помощью шейдера, который создает точку с координатой (0,0,0,1).Выведите цвет, содержащий вашу исходную позицию в мире вершин.

Здесь вы можете продолжить дальнейшую оптимизацию.Например, вы можете получить как min, так и max за один вызов отрисовки, используя геометрический шейдер и отрицая положение для одного из выходных пикселей.

1 голос
/ 22 сентября 2011

Из того, что я знаю, я думаю, что это нужно сделать вручную с помощью алгоритма, основанного на параллельном сокращении.Я хотел бы, чтобы кто-нибудь подтвердил, существует ли или нет функция OpenGL или GLSL, которая уже делает это.

С другой стороны, вы можете иметь доступ к нормализованным ближним / дальним плоскостям внутри фрагментного шейдера http://www.opengl.org/wiki/GLSL_Predefined_Variables#Fragment_shader_uniforms.
и с помощью некоторых равномерных переменных вы можете получить мир далеко / близко.

...