游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4472|回复: 7

哪位大侠能帮忙解决一下这个问题,万分感谢!!!(关

[复制链接]

2

主题

7

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2008-8-26 14:28:00 | 显示全部楼层 |阅读模式
OPENGL中采用顶点数组索引方式绘制对象时,碰到下面的问题;
GLint face_indicies[6][9] = {
{2,0,3 ,0,0,0 ,0,1,2 }, {1,3,0 ,0,0,0 ,3,2,1 }
, {6,4,7 ,1,1,1 ,0,1,2 }, {5,7,4 ,1,1,1 ,3,2,1 }
, {10,8,11 ,2,2,2 ,0,1,2 }, {9,11,8 ,2,2,2 ,3,2,1 }
};
GLfloat vertices[12][3] = {
{-252.866f,200.469f,-2.1247e-07f},{-246.616f,211.294f,2.1247e-07f},{-252.866f,200.469f,15.0f},
{-246.616f,211.294f,15.0f},{-246.616f,200.469f,-7.30884e-07f},{-252.866f,211.294f,7.30884e-07f},
{-246.616f,200.469f,15.0f},{-252.866f,211.294f,15.0f},{-255.991f,205.881f,-7.10543e-15f},
{-243.491f,205.881f,-7.10543e-15f},{-255.991f,205.881f,15.0f},{-243.491f,205.881f,15.0f}
};
GLfloat normals[3][3] = {
{0.866025f,-0.5f,0.0f},{0.866025f,0.5f,0.0f},{0.0f,-1.0f,0.0f}
};
GLfloat textures[4][2] = {
{0.0f,2.0f},{0.0f,1.0f},{1.0f,2.0f},
{1.0f,1.0f}
};
face_indicies[n]-----第n个三角形
face_indicies[][0-2]----顶点索引
face_indicies[][3-5]----法向索引
face_indicies[][6-8]----体贴坐标索引
采用顶点数组绘图:
glNormalPointer(GL_FLOAT, 0, m_pNormals);
glTexCoordPointer(.....);
glVertexPointer(.....);
glEnableClientState( GL_NORMAL_ARRAY);
glEnableClientState( GL_TEXTURE_COORD_ARRAY);
glEnableClientState( GL_VERTEX_ARRAY );
glDrawElements( GL_TRIANGLES, number_face, GL_UNSIGNED_INT, indices );
glDisableClientState( GL_NORMAL_ARRAY);
glDisableClientState( GL_TEXTURE_COORD_ARRAY);
glDisableClientState( GL_VERTEX_ARRAY );
目前glDrawElements函数只接受一组索引,比如,接受了顶点坐标的索引,那其他两个就无效,如果想绘制出完整的图形(包括顶点、贴图坐标、法向),该怎么处理。我查阅了相关资料,glDrawElements所接受的索引应该是一个顶点对应一个法向量、一个贴图坐标,上面的各个数据倒是可以拆分成只需要一个索引的形式(如用交叉数组,一个顶点属性包含:顶点、法向、贴图),但是那样向绘制函数传送的数据量就会大很多,失去了索引的意义。有哪位兄弟姐妹能给些建议。万分感谢!!!

29

主题

157

帖子

163

积分

注册会员

Rank: 2

积分
163
发表于 2008-8-26 17:54:00 | 显示全部楼层

Re: 哪位大侠能帮忙解决一下这个问题,万分感谢!!!(

很遗憾的告诉你,只能将其拆分成只需要一个索引的形式。

以数量最多的索引为准,将其他数组都按照这个索引存储,这样有些数据量就会增大。

在楼主的例子中,只好以face_indicies为准,将其他的数组都按照这个索引存储。

至于数据量增大,这个没办法避免,不过可以把数据放到VBO中去。

2

主题

7

帖子

7

积分

新手上路

Rank: 1

积分
7
 楼主| 发表于 2008-8-27 10:11:00 | 显示全部楼层

Re:哪位大侠能帮忙解决一下这个问题,万分感谢!!!(

郁闷啊,算了一下,顶点、贴图坐标、法向量总的数据量最少增大了三倍以上,虽然也使用了VBO,但是基本在性能上没有什么变化,跟以前采用glvertex3f()的方式相比,fps反而下降了一些。难道就没有其他的办法了吗?
还是要谢谢cO_olWinD!!!

29

主题

157

帖子

163

积分

注册会员

Rank: 2

积分
163
发表于 2008-8-27 10:40:00 | 显示全部楼层

Re:哪位大侠能帮忙解决一下这个问题,万分感谢!!!(

模型制作的有问题,既然一个模型中法线的数量比顶点的数量少,那么说明一个平面上被划分了多个网格,你可以试着将网格合并起来,让顶点数量向法线数量看齐。

还有就是把索引数组也存到VBO中。
或者更狠的就是把所有数据按照最大的索引的排成数组,然后放到VBO中,然后直接用glDrawArrays渲染,不用传索引了。

而且你所说的FPS下降也不用在意,在不同的情况下,效率不同很正常,比如你就画几个点,那么glVertex不一定就比用定点数组或顶点缓存慢。 你可以画几十万个三角形试一试。

2

主题

7

帖子

7

积分

新手上路

Rank: 1

积分
7
 楼主| 发表于 2008-8-27 15:05:00 | 显示全部楼层

Re:哪位大侠能帮忙解决一下这个问题,万分感谢!!!(

模型我用的是3dmax导出的建筑模型,基本上已经精简到了不可精简的地步,由于经常需要在墙上开窗等(我用的是建筑细模,主要就是为了测试大数据量场景),所以导致一个平面上会有很多不可精简的三角面。

目前我就是把索引数组也存到了VBO中,呵呵,象你说得最狠的办法也试过。但结果基本上比较类似。

我测试了一个百万三角面的场景,在用(最大索引数组并用VBO)的情况跟用(索引和glvertex)的情况相比。在一台256M显存的NV7800GT的机器上,运行速度由12帧上升到15帧,而在一台512M显存的NV8600GT的机器上却由20帧降到了15帧,不知道是什么原因。

2

主题

7

帖子

7

积分

新手上路

Rank: 1

积分
7
 楼主| 发表于 2008-8-27 15:11:00 | 显示全部楼层

Re: 哪位大侠能帮忙解决一下这个问题,万分感谢!!!(

这个是我用的模型;
sf_2008827151031.jpg

29

主题

157

帖子

163

积分

注册会员

Rank: 2

积分
163
发表于 2008-8-27 21:11:00 | 显示全部楼层

Re: Re:哪位大侠能帮忙解决一下这个问题,万分感谢!!

xyg_wu: Re:哪位大侠能帮忙解决一下这个问题,万分感谢!!!(关于glDrawElements索引的问题)

在一台256M显存的NV7800GT的机器上,运行速度由12帧上升到15帧,而在一台512M显存的NV8600GT的机器上却由20帧降到了15帧,不知道是什么原因。


有可能和CPU有关,NV8600GT的机器CPU可能比较强悍。使用glVertex主要是增加了函数调用的开支,而函数调用占的是CPU的资源。如果CPU很强悍,处理几万个函数调用只是小case的话,那么使用glVertex反而有可能比较快,毕竟glVertex比较灵活,可以减少CPU到GPU的数据传输量。


2

主题

7

帖子

7

积分

新手上路

Rank: 1

积分
7
 楼主| 发表于 2008-8-28 13:56:00 | 显示全部楼层

Re:哪位大侠能帮忙解决一下这个问题,万分感谢!!!(

恩,我想应该也是跟CPU有关,7800的机器用的是奔腾D的CPU,8600的机器用的是酷睿 E8400的cpu。不过,用glDrawElements并用最简索引方式绘图,性能的确提高了将近1/5,只是法向和体贴读的也是顶点索引,贴图全乱了,看来是OPENGL不支持多个索引,只能拆开。好可惜啊。眼睁睁看着损失1/5的性能。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-21 11:48

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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