[英]How to force openGL to draw a non-convex filled polygon
將多邊形繪制為凸形似乎是標准做法。 請參閱stackoverflow.com/questions/15556929/open-gl-polygon但是,如果我選擇填充它不是我的事情。 如何在保持定義的形狀的同時填充多邊形?
void drawFloor(){
// White
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); // GL_LINE works the way I want it too
//glDisable(GL_POLYGON_SMOOTH); // has no effect :(
glBegin(GL_POLYGON);
glColor3f(1.0, 1.0, 1.0);
glVertex3f(0, 0, 0); //0
glVertex3f(2*boxSize, 0, 0); //1
glVertex3f(2 * boxSize, -boxSize, 0); //2
glVertex3f(5 * boxSize, -boxSize, 0); //3
glVertex3f(5 * boxSize, 4 * boxSize, 0); //4
glVertex3f(6 * boxSize, 4 * boxSize, 0); //5
glVertex3f(6 * boxSize, 6 * boxSize, 0); //6
glVertex3f(0 * boxSize, 6 * boxSize, 0); //7
glVertex3f(0 * boxSize, 2 * boxSize, 0); //8
glVertex3f(1 * boxSize, 2 * boxSize, 0); //9
glVertex3f(1 * boxSize, 4 * boxSize, 0); //10
glVertex3f(2 * boxSize, 4 * boxSize, 0); //11
glVertex3f(2 * boxSize, 3 * boxSize, 0); //12
glVertex3f(3 * boxSize, 3 * boxSize, 0); //13
glVertex3f(3 * boxSize, 2 * boxSize, 0); //14
glVertex3f(2 * boxSize, 2 * boxSize, 0); //15
glVertex3f(2 * boxSize, 1 * boxSize, 0); //16
glVertex3f(0, 1 * boxSize, 0); //17
glEnd();
}
此代碼導致:
http://postimg.org/image/o4wt9ij33/與GL_LINE http://postimg.org/image/l31fltgkf/與GL_FILL
我只希望填充多邊形的內部,並使用GL_LINE保持版本的形狀。 我沒想到GL_FILL的輸出會如此不同。
我想要的(用MS paint創建):http:// postimg.org/image/d3gbf613d/
我正在使用Win7 + Visula studio express2013 +渲染器Intel HD Graphics版本:3.1.0-Bulid 8.15.10.2509+ GLSL版本1.40
注意:此答案與我最近對以下類似問題的答案的內容相同: 塗黑多邊形外的所有內容 。 我沒有將這些問題提名為重復項,因為它們聽起來不同,並且可能會有不同的答案,即使這個問題恰好是相同的。
繪制非凸多邊形的一種方法是將其分解為三角形。 有許多算法可以做到這一點,可以通過搜索諸如“多邊形三角剖分”之類的關鍵字來找到它們。
OpenGL還有另一種機制對此非常有用:模板緩沖區。 《紅皮書》中的“ 使用模板緩沖區繪制填充的凹多邊形 ”中對此方法進行了解釋。 主要思想是可以繪制具有任意原點和多邊形頂點的三角形扇。 多邊形內部的像素將被繪制奇數次,而多邊形外部的像素將被繪制偶數次。 模板緩沖區用於跟蹤奇數/偶數。
概述主要步驟:
在繪制過程中,清除模板緩沖區以及顏色緩沖區,然后啟用模板測試。
glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); glEnable(GL_STENCIL_TEST);
設置渲染通道的狀態,該狀態計算是否將像素渲染為奇數/偶數次。 請注意,這只能寫入模板緩沖區,因此顏色寫操作被禁用。 關鍵部分是模板op的GL_INVERT
,每次渲染像素時都會翻轉模板值,最終將奇數/偶數存儲在模板緩沖區中。
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); glStencilFunc(GL_ALWAYS, 0, 1); glStencilOp(GL_KEEP, GL_KEEP, GL_INVERT); glStencilMask(1);
渲染三角形扇形,將任意點(例如(0.0,0.0))作為第一個頂點,並將多邊形角作為剩余的頂點。 多邊形必須是封閉的,因此第一個和最后一個多邊形角必須相同。 如果p1,p2,...,pN是多邊形角,則GL_TRIANGLE_FAN
繪制調用的頂點序列為:
(0.0f, 0.0f), p1, p2, ... , pN, p1
普通着色器可用於此過程,因為甚至沒有寫入顏色值。
再次啟用顏色寫入,並設置模板測試屬性以僅渲染在上一遍中渲染了奇數次的像素。
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glStencilFunc(GL_EQUAL, 1, 1); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
繪制覆蓋多邊形整個區域甚至更多區域的幾何圖形。 例如,這可以是步驟4中的三角形扇形,也可以是多邊形的邊界框。 僅將繪制多邊形輪廓內的零件,其余的將通過模具測試消除。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.