在线等:用glBegin(GL_POLYGON)画多边形时,同一个平面上两个多边形相交的地方闪烁很厉害,什么原因?

Tieren_love 2004-10-14 08:45:55
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

double coord[4][3] = {{-11,-11,0}, {-9,-11,0}, {-9,-9,0}, {-11,-9,0}};

glColor4f(0, 1, 1, 1);
glBegin(GL_QUADS);
for(int i=0; i<4; i++)
glVertex3dv(coord[i]);
glEnd();

glTranslatef(-0.5, -0.5, 0);
glColor4f(1, 0, 0, 1);
glBegin(GL_QUADS);
for(i=0; i<4; i++)
glVertex3dv(coord[i]);
glEnd();

在程序中画了一个红色的和一个蓝色的正方形,这两个正方形在同一个X、Y平面上,在动画浏览的时候两个正方形相交的地方闪烁得很厉害,这是什么原因?

谢谢!
...全文
1601 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
yjh1982 2004-10-15
  • 打赏
  • 举报
回复
那岂不是很麻烦?
如果不是GL_TRIANGLES
而是GL_TRIANGLE_STRIP之类那够受的了.
alphapaopao 2004-10-15
  • 打赏
  • 举报
回复
glEnable(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(1, 16);
绘制其中的一个

glDisable(GL_POLYGON_OFFSET_FILL);
绘制另外一个

这样,就可以保证,他们即便是出于同一个平面,也不会造成斑驳
Tieren_love 2004-10-15
  • 打赏
  • 举报
回复
回 alphapaopao(炮炮):
谢谢你的热心帮助,其实你给的站点我昨天已经看了一整天,因为英语太差,看的不是很明白,我也试过用glPolygonOffset函数调过,可是没成功,为这个问题我花了不少时间!大哥你能不能直接告诉我怎么改上面的程序好吗?
alphapaopao 2004-10-15
  • 打赏
  • 举报
回复
分开偏移
yjh1982 2004-10-15
  • 打赏
  • 举报
回复
所以它们一起偏移,z距离还是一样.
不如你推荐一下参数.反正我调不出
alphapaopao 2004-10-15
  • 打赏
  • 举报
回复
正因为一样,所以才需要 offset
yjh1982 2004-10-15
  • 打赏
  • 举报
回复
glPolygonOffset 解不了.因为两个多边形的z距离完全一样.
alphapaopao 2004-10-15
  • 打赏
  • 举报
回复
都说了半天了

这是由于 z-fighting 造成的。 应该采用 polygon offset 解决。
参见 http://www.opengl.org/resources/faq/technical/depthbuffer.htm 其中的 “12.040 Depth buffering seems to work, but polygons seem to bleed through polygons that are in front of them. What's going on?”
Tieren_love 2004-10-15
  • 打赏
  • 举报
回复
小弟看英文注释看了半天也看不懂,麻烦哪位高手写个例子给我看看好不?
Tieren_love 2004-10-15
  • 打赏
  • 举报
回复
回 syy64(太平洋):

不行啊,深度检测不能取消,如果取消了那么画的三角形多了以后就乱了。
听说用glPolygonOffset可以解决问题,这个函数怎么使用呢?
alphapaopao 2004-10-15
  • 打赏
  • 举报
回复
有三种方法
1、画成相同的颜色,不用任何处理,都不会斑驳
2、将各个立方体的高度做成不尽相同的,有微小的差异即可
3、用体运算,将其形成一个BREP的体。
Tieren_love 2004-10-15
  • 打赏
  • 举报
回复
还有人帮忙吗?在线等的好累呀!!
Tieren_love 2004-10-15
  • 打赏
  • 举报
回复
我做的是在一个平面上画许多个立方体,这些立方体的底面在同一个平面上,而且可能几个底面同时相交,有什么办法解决吗?
alphapaopao 2004-10-15
  • 打赏
  • 举报
回复
看来你的模型数很特殊的模型。怎么会有那么多的三角片处于同一个平面呢?
Tieren_love 2004-10-15
  • 打赏
  • 举报
回复
谢谢 alphapaopao(炮炮),两个三角形在同一个平面的斑驳问题已经解决了,但是有好几个三角形同时共面的时候仍然闪烁,这该怎么办?
alphapaopao 2004-10-15
  • 打赏
  • 举报
回复
只有在贴花,的情况下,才需要这样。比如,在模型表面绘制一些记号,出现了同平面的情况,采用 offset 就可以正确贴花了。

不需要一片一片的处理,而是一堆一堆的处理。不麻烦。
alphapaopao 2004-10-14
  • 打赏
  • 举报
回复
这是由于 z-fighting 造成的。 应该采用 polygon offset 解决。
参见 http://www.opengl.org/resources/faq/technical/depthbuffer.htm 其中的 “12.040 Depth buffering seems to work, but polygons seem to bleed through polygons that are in front of them. What's going on?”
Tieren_love 2004-10-14
  • 打赏
  • 举报
回复
仍在等待中........................
Tieren_love 2004-10-14
  • 打赏
  • 举报
回复
还是不行啊!
各位高手们,麻烦你们抽点时间,建立一个新的工程,并把下面这两个函数放进去看看,再回答我好吗?求你们了!!

// 初始化
void COglsdocView::InitScene()
{
// 设置光源属性
GLfloat lightPos[] = {100, 0.0f, 200, 0.0f};
GLfloat ambientLight[] = {0.3f, 0.3f, 0.3f, 1.0f};
GLfloat diffuseLight[] = {1.0f, 1.0f, 1.0f, 1.0f};
GLfloat specularLight[] = {0.5f, 0.5f, 0.5f, 0.5f};

glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
glLightfv(GL_LIGHT0, GL_SPECULAR, specularLight);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);

glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_POINT_SMOOTH);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
}

// 更新场景
BOOL COglsdocView::RenderScene()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
static float ang = 0.0;
ang++;
glTranslatef(0, 0, -20);
glRotatef(ang, 1.0, 1.0, 1.0);

glBegin(GL_TRIANGLES);
glColor3f(255, 0, 0);
glVertex3f(0, 0, 0);
glVertex3f(2, 0, 0);
glVertex3f(2, 2, 0);
glColor3f(0, 255, 0);
glVertex3f(1,1,0);
glVertex3f(3,0,0);
glVertex3f(3,1,0);
glEnd();

return TRUE;
}
程序里两个不同颜色的三角形在重合的时候,重合的地方到底为什么会闪烁?
等待中!
syy64 2004-10-14
  • 打赏
  • 举报
回复
用泰森多边形
gluTessBeginPolygon, gluTessEndPolygon
The gluTessBeginPolygon and gluTessEndPolygon functions delimit a polygon description.

void gluTessBeginPolygon(
GLUtesselator * tess,
void * polygon_data
);

void gluTessEndPolygon(
GLUtesselator * tess
);

Parameters
tess
The tessellation object (created with gluNewTess).
polygon_data
A pointer to user-defined polygon data.
Remarks
The gluTessBeginPolygon and gluTessEndPolygon functions delimit the definition of a nonconvex polygon. Within each gluTessBeginPolygon/gluTessEndPolygon pair, include one or more calls to gluTessBeginContour/gluTessEndContour. Within each contour, there are zero or more calls to gluTessVertex. The vertices specify a closed contour (the last vertex of each contour is automatically linked to the first).

The polygon_data parameter is a pointer to a user-defined data structure. If the appropriate callbacks are specified (see gluTessCallback), this pointer is returned to the callback function or functions, making it a convenient way to store per-polygon information.

When you call gluTessEndPolygon, the polygon is tessellated, and the resulting triangles are described through callbacks. For descriptions of the callback functions, see gluTessCallback.

Example
The following describes a quadrilateral with a triangular hole:

gluTessBeginPolygon(tobj, NULL);
gluTessBeginContour(tobj);
gluTessVertex(tobj, v1, v1);
gluTessVertex(tobj, v2, v2);
gluTessVertex(tobj, v3, v3);
gluTessVertex(tobj, v4, v4);
gluTessEndContour(tobj);
gluTessBeginContour(tobj);
gluTessVertex(tobj, v5, v5);
gluTessVertex(tobj, v6, v6);
gluTessVertex(tobj, v7, v7);
gluTessEndContour(tobj);
gluTessEndPolygon(tobj);

QuickInfo
Windows NT: Use version 3.5 and later.
Windows: Use Windows 95 and later.
Windows CE: Unsupported.
Header: Declared in glu.h.
Import Library: Link with glu32.lib.

See Also
gluNewTess, gluTessBeginContour, gluTessCallback, gluTessEndContour, gluTessNormal, gluTessProperty, gluTessVertex


加载更多回复(14)

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧