Ну, если вы хотите просто визуализировать это (визуализировать), то, возможно, вам вообще не нужно менять сгенерированные сетки.Вместо этого используйте буфер трафарета, чтобы визуализировать сферу с отверстиями.Например я рендеринг диска (тонкий цилиндр) с круглыми отверстиями вблизи его внешнего края (в качестве опорной пластины для машин) с комбинацией твердых и прозрачных объекты вокруг так, мне нужно отверстие действительно отверстие.Поскольку мне было лень триангулировать фигуру, которая генерируется во время выполнения, я выбрал для этого трафарет.
Создание контекста OpenGL с буфером трафарета
IЯ использую 8 бит для трафарета, но этот метод использует только один бит.
Очистить трафарет с помощью 0
и отключить маски глубины и цвета
Thisдолжно быть сделано до рендеринга вашей сетки с трафаретом.Поэтому, если у вас есть больше объектов, отрисованных таким способом, вам нужно сделать это перед каждым из них.
Установите трафарет с 1
для сплошной сетки
- Очистить трафарет с
0
для сеток с отверстиями - Включить маски глубины и цвета и отобразить сплошную сетку с трафаретом
1
В коде это выглядит так:
// [stencil]
glEnable(GL_STENCIL_TEST);
// whole stencil=0
glClearStencil(0);
glClear(GL_STENCIL_BUFFER_BIT);
// turn off color,depth
glStencilMask(0xFF);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glDepthMask(GL_FALSE);
// stencil=1 for solid mesh
glStencilFunc(GL_ALWAYS,1,0xFF);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
glCylinderxz(0.0,y,0.0,r,qh);
// stencil=0 for hole meshes
glStencilFunc(GL_ALWAYS,0,0xFF);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
for(b=0.0,j=0;j<12;j++,b+=db)
{
x=dev_R*cos(b);
z=dev_R*sin(b);
glCylinderxz(x,y-0.1,z,dev_r,qh+0.2);
}
// turn on color,depth
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glDepthMask(GL_TRUE);
// render solid mesh the holes will be created by the stencil test
glStencilFunc(GL_NOTEQUAL,0,0xFF);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
glColor3f(0.1,0.3,0.4);
glCylinderxz(0.0,y,0.0,r,qh);
glDisable(GL_STENCIL_TEST);
где glCylinderxz(x,y,z,r,h)
- это просто функция, которая отображает цилиндр на (x,y,z)
с радиусом r
с осью y
ось вращенияdb
- это шаг по углу (2*Pi/12)
.Радиусы: r
- большие, dev_r
- радиус отверстия, dev_R
- центры отверстий И qh
- толщина пластины.
Результат выглядит следующим образом (каждая из 2 пластин имеет видс этим):
Этот подход больше подходит для тонких объектов.Если ваши порезы приводят к достаточно толстым сторонам, вам нужно добавить рендеринг срезанной стороны, иначе освещение на этих деталях может быть неправильным.