游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3186|回复: 8

刚学OGL,问一个关于VBO的简单问题

[复制链接]

6

主题

24

帖子

36

积分

注册会员

Rank: 2

积分
36
发表于 2009-3-28 11:21:00 | 显示全部楼层 |阅读模式
搜了很多关于VBO的文章,已经有点了解了,但一直有个问题没找到答案,请各位大大指点一二,谢谢:

顶点缓冲可以把法线、顶点坐标、纹理坐标分别创建缓冲进行索引,但这里有个问题就是一个模型通常顶点坐标、法线和纹理坐标并不是一样多,也就是说一个顶点有一个顶点坐标,但可能有多个法线或纹理坐标,这种情况如何索引呢?

不知道我有没有说明白,呵呵,下面是OPENGL超级宝典里的代码,为一个模型创建了4个缓冲区,有一个是索引缓冲,其它的三个缓冲点数是相同的,我想问的是如果点数不同的时候如何处理?也就是一个顶点坐标对应多个纹理坐标或法线的情况。

void CVBOMesh::EndMesh(void)
{
 // Create the buffer objects
 glGenBuffers(4, bufferObjects);
 // Copy data to video memory
 // Vertex data
 glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[VERTEX_DATA]);
 glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*nNumVerts*3,pVerts, GL_STATIC_DRAW);
 // Normal data
 glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[NORMAL_DATA]);
 glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*nNumVerts*3, pNorms, GL_STATIC_DRAW);
 // Texture coordinates
 glBindBuffer(GL_ARRAY_BUFFER, bufferObjects[TEXTURE_DATA]);
 glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*nNumVerts*2, pTexCoords, GL_STATIC_DRAW);
 // Indexes
 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, bufferObjects[INDEX_DATA]);
 glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLushort)*nNumIndexes, pIndexes, GL_STATIC_DRAW);
 // Free older, larger arrays
 delete [] pIndexes;
 delete [] pVerts;
 delete [] pNorms;
 delete [] pTexCoords;
 // Reassign pointers so they are marked as unused
 pIndexes = NULL;
 pVerts = NULL;
 pNorms = NULL;
 pTexCoords = NULL;
}

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
发表于 2009-3-28 11:49:00 | 显示全部楼层

Re:刚学OGL,问一个关于VBO的简单问题

不一样多并没有关系!

绘制前指定到你要的那个就可以了。

6

主题

24

帖子

36

积分

注册会员

Rank: 2

积分
36
 楼主| 发表于 2009-3-28 19:48:00 | 显示全部楼层

Re:刚学OGL,问一个关于VBO的简单问题

感谢楼上的回复,但我还是不太明白

按我的想法,如果三个缓冲区的点数不一样多,就应该存在多个索引缓冲来分别索引每个点的顶点坐标、纹理坐标和法线向量,是不是?

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
发表于 2009-3-30 09:42:00 | 显示全部楼层

Re:刚学OGL,问一个关于VBO的简单问题

索引和数据没什么关系!一个索引缓冲区不一定就要把坐标点用尽!

6

主题

24

帖子

36

积分

注册会员

Rank: 2

积分
36
 楼主| 发表于 2009-3-30 11:38:00 | 显示全部楼层

Re:刚学OGL,问一个关于VBO的简单问题

嘿嘿,看了opengl super bible 的示例,终于明白了,谢谢楼上的兄弟,原来把索引全放在一起即可。

随便把OpenGL超级宝典第四版的示例代码下载地址贴出来,有需要的朋友就下吧
http://www.starstonesoftware.com/files/SB-AllSource.zip

6

主题

24

帖子

36

积分

注册会员

Rank: 2

积分
36
 楼主| 发表于 2009-4-8 12:37:00 | 显示全部楼层

Re:刚学OGL,问一个关于VBO的简单问题

我晕,那天没看认真,超级宝典中的VBO例子仍然是把顶点坐标、纹理坐标和法线这些数据解开,重新进行了组合

结果是这三个缓冲区相同大小,也就是说缓冲区中存在重复的数据。太奇怪了,没有新手有和我相同的问题吗?那位大大能详细说明一下吗?

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
发表于 2009-4-8 16:35:00 | 显示全部楼层

Re:刚学OGL,问一个关于VBO的简单问题

可以放一起,也可以不放一起。

5

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2009-4-8 21:34:00 | 显示全部楼层

Re:刚学OGL,问一个关于VBO的简单问题

Buffer为什么用这个???
难道会提高速度???
是不是硬件实现的?

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
发表于 2009-4-9 11:30:00 | 显示全部楼层

Re:刚学OGL,问一个关于VBO的简单问题

VBO的作用就是把数据放在显存中,这样每次渲染时就不需要再从内存向显存传输数据了。

系统整体性能会得到提升。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-20 14:13

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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