OpenGL:线框叠加隐藏线删除
问题描述:
在处理科学3D模型时,我遇到了一个问题。任务是渲染一个填充了颜色和线框覆盖的模型。这适用于具有封闭表面的实体模型。OpenGL:线框叠加隐藏线删除
问题1:
我有几个多边形,而无需渲染之前知道关于它们的可见性/定向什么。为了确保所有多边形都正确显示,我首先顺时针绘制所有多边形,然后逆时针绘制线框叠加。这似乎适用于某些型号,但不适用于所有型号。
我的一些模型最终看起来像this。
问题2:
我不知道这是有关问题#1,但PolygonOffset使得一些边缘看起来很糟糕,模型多边形的混合取向,可能是因为:Wireframe edges
**代码:**
由于受到了我的限制,我必须在Fortran 77中编写代码。但是,OpenGL调用保持不变。这是绘制模型的代码:
c Draw object
do 10 i=1,2
c Select correct orientation
if(ccw) then
call glFrontFace(GL_CCW)
else
call glFrontFace(GL_CW)
endif
c Set object color
call glColor3f(1.0,1.0,1.0)
c Set polygon mode to fill
call glPolygonMode(GL_FRONT_AND_BACK,GL_FILL)
c Set polygon offset and enable offset (float for glPolygonOffset,
c otherwise it won't work)
call glPolygonOffset(1.0,2.0)
call glEnable(GL_POLYGON_OFFSET_FILL)
c Draw object
call glCallList(lindex)
c Disable polygon offset
call glDisable(GL_POLYGON_OFFSET_FILL)
c Reverse orientation
ccw = .not. ccw
10 continue
c Draw Wireframe onto Object
do 20 i=1,2
c Select correct orientation
if(ccw) then
call glFrontFace(GL_CCW)
else
call glFrontFace(GL_CW)
endif
c Set object color
call glColor3f(0.0,0.0,0.0)
c Set polygon mode to wireframe
call glPolygonMode(GL_FRONT_AND_BACK,GL_LINE)
c Draw object
call glCallList(lindex)
c Set polygon mode to fill
call glPolygonMode(GL_FRONT_AND_BACK,GL_FILL)
c Reverse orientation
ccw = .not. ccw
20 continue
其他信息:已启用清除功能,深度功能为GL_LESS。
答
如果使用CW和CCW为什么要使用GL_FRONT_AND_BACK进行渲染。当然只是使用GL_FRONT。 glOffset有它的局限性,所以一些边缘可能会偏移到你的模型中,因此只有一些边缘是不齐的,这一切都取决于它们所在的一面。看着X2d4K,我得到的印象是模型本身可能包含“错误”定向的曲面,所以最好不要使用背面剔除。深度缓冲不应该隐藏任何方向上的变化。
答
我发现我的问题的原因:我用了一个16位深度缓冲区,切换到32位消除了所有的问题。
请稍微编辑一下以便以问题形式提供,以便我们可以更好地回答。 – demongolem 2014-10-20 19:10:19
看起来好像要使用GL_POLYGON_OFFSET_FILL绘制一个实体对象,然后在它上面绘制一个线框。你可以通过在绘制线框之前执行glDisable(GL_DEPTH_TEST)以及之后的glEnable(GL_DEPTH_TEST)来以更简单的方式实现该功能,并且根本不需要该GL_POLYGON_OFFSET_FILL。另外,如果你在绘制之前做了glDisable(GL_CULL_FACE),你可以摆脱这个丑陋的glFrontFace(GL_CCW)/ glFrontFace(GL_CW)玩杂耍。 – pelya 2014-10-20 19:33:24
谢谢你的回答。禁用线框图的深度测试并不能解决问题,因为现在所有的线框线都显示在每个模型上,但我只想看到可见的线框线。 – user3413372 2014-10-20 20:33:25