游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2610|回复: 2

新手请教:顶点可见性判断

[复制链接]

1

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2008-12-4 16:50:00 | 显示全部楼层 |阅读模式

我现在需要判断一个*.3ds模型的各个顶点在当前视角下是否可见?

我的想法是:

1. 计算出模型中某一点的世界坐标 => Vworld(顶点世界坐标(齐次向量))

2. glGetDoublev(GL_MODELVIEW_MATRIX, Mmodelview); => Mmodelview(模型视图矩阵)

3. glGetDoublev(GL_PROJECTION_MATRIX, Mproj); => Mproj(投影矩阵)

4. glGetIntegerv(GL_VIEWPORT, ViewPort); => ViewPort(视口)

5. glReadBuffer(GL_BACK);
   glReadPixels(ViewPort[0], ViewPort[1], ViewPort[2], ViewPort[3], GL_DEPTH_COMPONENT, GL_FLOAT, pBuffer); => pBuffer中是深度信息(倒置存放)

6. 计算出Vproj(投影体内的齐次坐标) = Vworld * Mmodelview * Mproj;

7. 计算出屏幕坐标以及深度信息:
nScreenX = int((Vproj.x/Vproj.w + 1) * ViewPort[2] / 2 + ViewPort[0]);
nScreenY = int((-Vproj.y/Vproj.w + 1) * ViewPort[3] / 2 + ViewPort[1]);
dDepth = (Vproj.z/Vproj.w + 1) / 2;
这样得到了顶点的深度信息,然后dDepth与pBuffer[(ViewPort[3]-1-nScreenY)*ViewPort[2] + nScreenX](由于pBuffer倒置存放深度信息)比较,看它们差的绝对值是否足够小,来判断该顶点是否可见。

但是问题:
1. 结果不正确,很明显看不到的结果是能看到,也有很明显看到的结果看不到。
2. pBuffer中得到的深度值应该是归约到[0, 1]之间吧,所以我计算dDepth也归约到[0, 1],不知道对不对?
3. 我google,baidu查找原因,有种说法说得到的深度值精度不够,当两个面相邻很近时会发生所谓Z-fighting?
4. 我曾尝试用其他方法,比如,对于一个顶点,遍历每个三角面判断是否有被遮挡,但是效率和效果都很差。

请问大侠,顶点可见性判断有什么好方法没?谢谢!

8

主题

122

帖子

122

积分

注册会员

Rank: 2

积分
122
发表于 2008-12-6 22:11:00 | 显示全部楼层

Re: 新手请教:顶点可见性判断

不用这么麻烦,使用OpenGL的遮挡查询功能,同时绘制物体和所有顶点就能回读出被遮挡的点。

不过需要较高版本的OpenGL支持,而且顶点数量不能过多。

1

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2008-12-6 22:50:00 | 显示全部楼层

Re:新手请教:顶点可见性判断

哦,谢谢指点,我查查看,不知道我的显卡支持遮挡查询功能不
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-20 18:51

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表