& Quot; & Quot Выбраковка; для отдельных вершин — glDrawArrays (GL_POINTS)

Я должен поддержать некоторый унаследованный код, который рисует облака точек, используя следующий код:

glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, (float*)cloudGlobal.data());

glEnableClientState(GL_NORMAL_ARRAY);
glNormalPointer(GL_FLOAT, 0, (float*)normals.data());

glDrawArrays(GL_POINTS, 0, (int)cloudGlobal.size());
glFinish();

Этот код отображает все вершины независимо от угла между нормалью и «прямой видимости». Что мне нужно, так это нарисовать только вершины, нормали которых направлены к нам.

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

2

Решение

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

Это предполагает, что у вершин есть нормали (но поскольку вы говорите о «обращении в сторону», я предполагаю, что они есть).

РЕДАКТИРОВАТЬ:

Как правильно указал @derhass, это не будет работать.

Если у вас есть текстуры кубической карты, возможно, вы можете скопировать нормаль в texcoord и выполнить поиск альфа из кубической карты (также в сочетании с текстурной матрицей, чтобы учесть преобразования камеры и облака точек).

На самом деле, если ваши нормали нормализованы, вы можете масштабировать их, используя матрицу текстуры для [-0.49, +0.49] и затем используйте простую 1D (или 2D) текстуру полосы (наполовину белый, наполовину черный — включая альфа). Обратите внимание, что нелогично, для этого требуется оставить режим обтекания текстур по умолчанию GL_REPEAT (не зажим).

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

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

Просто из любопытства — какое у вас приложение и зачем вам избегать шейдеров?

4

Другие решения


По вопросам рекламы [email protected]