Có ba phần để giải quyết điều này;
chia các đa giác lõm thành hình tam giác (opengl không thể vẽ các polys lõm). Đây sẽ là bề mặt 'trên cùng'
thay thế (đùn) tập hợp các hình tam giác dọc theo một vectơ thích hợp, điều này sẽ trở thành bề mặt 'dưới cùng'
tạo ra các 'cạnh' của âm lượng, bằng cách nối các
cạnh bên ngoài của các bề mặt trên cùng và dưới cùng
Phần 1 - Tessname của bề mặt trên cùng
Câu trả lời đơn giản nhất cho việc xử lý đa giác lõm không có lỗ là cắt EAR.

{v3, v0, v1} & {v1, v2, v3} là tai, {v0, v1, v2} không phải là tai (v3 nằm bên trong {v0, v1, v2}), {v2, v3, v0) là không phải là tai (góc trong tại v3 là> π). EAR của đa giác là một tam giác được hình thành bởi ba đỉnh V0, V1 và V2 liên tiếp, trong đó V1 là một đỉnh lồi (góc trong của đỉnh nhỏ hơn rad rad), đoạn thẳng từ Vi0 đến Vi2 nằm hoàn toàn bên trong đa giác, và không có đỉnh nào của đa giác được chứa trong tam giác ngoài ba đỉnh của tam giác. Một đa giác có 4 đỉnh trở lên luôn có tai. Vì vậy, cách tiếp cận của chúng tôi là tìm một tai, cắt nó ra, lặp lại cho đến khi chỉ còn một tai (hình tam giác);
do until num vertices of P is 3
find an ear vq,vr,vs
add vq,vr,vs to list of triangles
remove vr from polygon
end do
add last 3 vertices to triangle list
Vẽ danh sách này dưới dạng GL_TRIANGLE_LIST
Có nhiều cách tiếp cận hiệu quả hơn đối với tam giác đa giác ( https://en.wikipedia.org/wiki/Polygon_triangulation ), nhưng phương pháp tai là đơn giản nhất.
Phần 2 - Tạo bề mặt đáy
Sao chép tất cả các đỉnh được tìm thấy trong phần một và thêm vectơ đùn của bạn vào từng đỉnh. Điều này trở thành bề mặt 'dưới cùng' của bạn. Vectơ đùn là một vectơ (thường) ở góc vuông với đa giác ban đầu của bạn. Độ dài của vectơ đùn phụ thuộc vào thời gian đùn của bạn cần.
Phần 3 - Tạo các mặt đùn
Lấy mỗi cạnh của đa giác lõm ban đầu của bạn. Thêm vectơ đùn vào hai điểm cuối của cạnh. Điều này tạo ra 4 điểm (2 điểm kết thúc ban đầu và 2 điểm cuối 'đùn') Đây tạo thành một hình chữ nhật *, đây sẽ là một trong những cạnh của hình đùn. Chúng có thể được vẽ dưới dạng GL_QUADS hoặc GL_TRIANGLE_STRIP tùy theo đơn đặt hàng.
* giả sử một vector đùn góc phải.