Я должен поддержать некоторый унаследованный код, который рисует облака точек, используя следующий код:
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();
Этот код отображает все вершины независимо от угла между нормалью и «прямой видимости». Что мне нужно, так это нарисовать только вершины, нормали которых направлены к нам.
Для граней это можно назвать «отбраковкой», но я не знаю, как включить эту опцию для простых вершин. Пожалуйста, предложите.
Вы можете попробовать использовать систему освещения (если она вам не нужна для затенения). Установите окружающий цвет альфа на ноль, а затем просто используйте альфа-тест, чтобы отбросить точки с нулевой альфа. Вероятно, вам потребуется установить довольно высокий альфа в диффузном цвете, чтобы избежать полупрозрачных точек, в случае, если альфа-смешение требуется для сглаживания точек (для рендеринга дисков вместо квадратов).
Это предполагает, что у вершин есть нормали (но поскольку вы говорите о «обращении в сторону», я предполагаю, что они есть).
РЕДАКТИРОВАТЬ:
Как правильно указал @derhass, это не будет работать.
Если у вас есть текстуры кубической карты, возможно, вы можете скопировать нормаль в texcoord и выполнить поиск альфа из кубической карты (также в сочетании с текстурной матрицей, чтобы учесть преобразования камеры и облака точек).
На самом деле, если ваши нормали нормализованы, вы можете масштабировать их, используя матрицу текстуры для [-0.49, +0.49]
и затем используйте простую 1D (или 2D) текстуру полосы (наполовину белый, наполовину черный — включая альфа). Обратите внимание, что нелогично, для этого требуется оставить режим обтекания текстур по умолчанию GL_REPEAT
(не зажим).
Если ваши облака точек имеют форму некоторых закрытых объектов, вы все равно можете получить подобное поведение даже без текстур кубической карты, нарисовав фиктивную сетку с glColorMask(0, 0, 0, 0)
(только напишет глубину), которая будет «покрывать» точки, которые направлены в сторону. Вы можете сгенерировать эту сетку также как группу квадов, которые расположены за точками в противоположном направлении от их нормали и видны только с другой стороны, чем точки, которые должны быть видимыми, таким образом покрывая их.
Обратите внимание, что это приведет только к визуальному улучшению (это будет выглядеть как отбракованные точки), а не к улучшению производительности.
Просто из любопытства — какое у вас приложение и зачем вам избегать шейдеров?