簡體   English   中英

如何強制openGL繪制非凸填充多邊形

[英]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還有另一種機制對此非常有用:模板緩沖區。 《紅皮書》中的“ 使用模板緩沖區繪制填充的凹多邊形 ”中對此方法進行了解釋。 主要思想是可以繪制具有任意原點和多邊形頂點的三角形扇。 多邊形內部的像素將被繪制奇數次,而多邊形外部的像素將被繪制偶數次。 模板緩沖區用於跟蹤奇數/偶數。

概述主要步驟:

  1. 在設置上下文和繪圖表面時,請確保請求使用模板緩沖區的配置。
  2. 在繪制過程中,清除模板緩沖區以及顏色緩沖區,然后啟用模板測試。

     glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); glEnable(GL_STENCIL_TEST); 
  3. 設置渲染通道的狀態,該狀態計算是否將像素渲染為奇數/偶數次。 請注意,這只能寫入模板緩沖區,因此顏色寫操作被禁用。 關鍵部分是模板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); 
  4. 渲染三角形扇形,將任意點(例如(0.0,0.0))作為第一個頂點,並將多邊形角作為剩余的頂點。 多邊形必須是封閉的,因此第一個和最后一個多邊形角必須相同。 如果p1,p2,...,pN是多邊形角,則GL_TRIANGLE_FAN繪制調用的頂點序列為:

     (0.0f, 0.0f), p1, p2, ... , pN, p1 

    普通着色器可用於此過程,因為甚至沒有寫入顏色值。

  5. 再次啟用顏色寫入,並設置模板測試屬性以僅渲染在上一遍中渲染了奇數次的像素。

     glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glStencilFunc(GL_EQUAL, 1, 1); glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); 
  6. 繪制覆蓋多邊形整個區域甚至更多區域的幾何圖形。 例如,這可以是步驟4中的三角形扇形,也可以是多邊形的邊界框。 僅將繪制多邊形輪廓內的零件,其余的將通過模具測試消除。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM