作者riveranb (River)
看板GameDesign
标题[程式] ABOUT STENCIL BUFFER Question
时间Sat Jul 9 21:22:52 2011
有个问题想请教板上的各位前辈。
小弟我写 MFC & OpenGL 程式,
目前想做一个复杂多边形区域内交集物体之选取功能,
但GOOGLE很久就是没找到相关功能技术讨论文章。
目前先以Tessellation方式画出复杂多边形,
然後接下来我要把复杂多边形的区域纪录到Stencil Buffer中,
但问题来了,
我写了Unit Test Code去检查我的Stencil Buffer纪录情况,
发现结果不是我想像的。
我以全白色的QUAD覆盖在整个绘图区中,
并且透过Stencil Test来只画出复杂多边形区域。
绘图结果如下图连结,黄色Stipple区+白色区便是完整的复杂多边形区域,
各位可以发现,通过Stencil Test区域只有小於绘图区的一个矩形区块。
https://picasaweb.google.com/112165426532756160107/StencilQz#5627339704475169794
我不懂为何会变成如此结果,目前百思不得其解。
是因为Stencil Buffer我必须要在Resize时去同步它的长与宽吗?
但我记得不用呀(Stencil虽然没有很熟但以前做过没碰到这个问题)。
现在先以制作Stencil Mask & 执行Stencil Test时的Projection下手来Debug,
但一样还没找出错误(已确认两个时间点Projection完全一样)。
可否请板上的高手来替我解惑呢?
感谢各位大大不吝分享。
下方是我的相关Test Code
-----------------------------------------------------
// 2d projection
gluOrtho2D(-Ortho2dRange.x, Ortho2dRange.x, -Ortho2dRange.y, Ortho2dRange.y);
....
....
// do polygon tessellation
glColor3f(1.0, 1.0, 0.5);
gluTessBeginPolygon(glTessel, NULL);
gluTessBeginContour(glTessel);
for(size_t i=0 ; i<num ; i++)
gluTessVertex(glTessel, TessPolygon[i].m_Vector, TessPolygon[i].m_Vector);
gluTessEndContour(glTessel);
gluTessEndPolygon(glTessel);
// make mask of the polygon tessellation on the stencil buffer
// write nothing to color buffer
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glEnable(GL_STENCIL_TEST);
glClearStencil(0);
glClear(GL_STENCIL_BUFFER_BIT);
glStencilFunc(GL_ALWAYS, 1, 1);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
// start record to the stencil buffer
gluTessBeginPolygon(glTessel, NULL);
gluTessBeginContour(glTessel);
for(size_t i=0 ; i<num ; i++)
gluTessVertex(glTessel, TessPolygon[i].m_Vector, TessPolygon[i].m_Vector);
gluTessEndContour(glTessel);
gluTessEndPolygon(glTessel);
// reset color buffer writing
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
// draw test quad to find out the area of the stencil mask
glStencilFunc(GL_EQUAL, 1, 1);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
glColor3f(1.0, 1.0, 1.0);
glBegin(GL_QUADS);
glVertex2i(-Ortho2dRange.x, -Ortho2dRange.y);
glVertex2i(Ortho2dRange.x, -Ortho2dRange.y);
glVertex2i(Ortho2dRange.x, Ortho2dRange.y);
glVertex2i(-Ortho2dRange.x, Ortho2dRange.y);
glEnd();
glDisable(GL_STENCIL_TEST);
-----------------------------------------------------
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.230.228.167
1F:推 NDark:为什麽你不用 select buffer 07/09 21:31
2F:→ riveranb:那个我已经做完了..SelectBuffer只能做矩形选取不是吗? 07/09 21:33
3F:→ riveranb:我目前要做的是complex(concave) shape selection 07/09 21:34
※ 编辑: riveranb 来自: 61.230.228.167 (07/09 21:43)
4F:推 NDark:那个天才告诉你他只能做矩形的? 07/09 21:41
5F:→ riveranb:那要如何设定复杂多边形区域? 07/09 21:43
7F:→ riveranb:不好意思该文件看完了,但似乎没找到我要的资讯? 07/09 22:08
8F:→ riveranb:select-buffer由gluPickMatrix 设定选取区.. 07/09 22:08
9F:→ riveranb:因此我一直认为Select-Buffer只能做矩形选取 07/09 22:08
10F:→ riveranb:比较可能用到的技术可能就是unique color render这方面 07/09 22:10
11F:→ riveranb:但这个似乎跟Select Buffer无太多正相关? 07/09 22:10
12F:推 NDark:gluPickMatrix 只是决定点选点大小而已. 07/09 22:11
13F:→ NDark:我通常都设1x1 07/09 22:11
14F:→ riveranb:对..所以gluPickMatrix只能决定mxn的区域不是吗 07/09 22:12
15F:→ riveranb:这跟我要的是arbitrary shape area的定义似乎不相同 07/09 22:12
16F:推 NDark:被选取物又不限一定要MxN 07/09 22:14
17F:→ NDark:你的点选笔触为什麽要是多边形的? 07/09 22:14
18F:→ riveranb:你没弄懂我的意思..我想单一次设定就达到目标 07/09 22:14
19F:→ riveranb:如果要用gluPickMatrix做的话..那不是要做mxn次的1x1点? 07/09 22:15
20F:→ riveranb:如果我误会你的意思那不好意思 07/09 22:15
21F:→ riveranb:客户需求 -__- 我也不想做这种麻烦的功能 07/09 22:15
22F:→ NDark:"复杂多边型选取功能" 目的是 "选一个多边形" 没错吧? 07/09 22:16
23F:→ riveranb:不对..是选取"与复杂形状有交集"的物体 07/09 22:22
※ 编辑: riveranb 来自: 61.230.228.167 (07/09 22:23)
24F:→ riveranb:原文讲的不够清楚, 已更新 07/09 22:24
25F:推 NDark:还是看不懂你的需求XD 07/09 22:26
26F:→ riveranb:那就先想像成可以用圆形来选取形状内交集到的物体..ok吗? 07/09 22:34
27F:推 epephanylo:类似挖冰其林的动作嘛? 07/10 03:06
28F:推 ddavid:他是想说,当他的例如滑鼠游标是可以不规则形状的,而且这 07/10 03:30
29F:→ ddavid:形状上的每一点指着的东西「全部」都要选得到。是这样吧? 07/10 03:30
30F:→ ddavid:而且他是要确实的形状,所以不能使用外切大方框来简化。 07/10 03:33
31F:→ ddavid:总之,他要的不是「被选物可不规则」,而是「选取用的游标 07/10 03:34
32F:→ ddavid:可不规则外形」吧,我想。 07/10 03:34
33F:→ riveranb:楼上正解 07/10 07:03
34F:→ riveranb:其实如果有人知到我的stencil test为什麽错也请告诉我 07/10 07:04
35F:→ riveranb:目前我正苦恼stencil哪里做错了..囧 07/10 07:04