位置: 编程技术 - 正文
推荐整理分享OpenGL教程翻译 第十课 索引绘制(opengl perspective),希望有所帮助,仅作参考,欢迎阅读内容。
文章相关热门搜索词:opengl中文教程,opengl transform,opengl learning中文,opengl语言,opengl gltranslatef,opengl learning中文,opengl learning中文,opengl translate,内容如对您有帮助,希望把文章链接给更多的朋友!
如果我们绘制三角形,GPU将产生如下设置:V0/ 1/2,V3/4/5,V6/7/8等。
这是一个索引绘制的例子:在此情况下,GPU将产生下列三角形:V4/ 0/1,V5/ 2/1,V6/ 1/7等。
使用OpenGL中的索引绘制要求生成并填充一个索引缓冲区,而且它必须在调用绘制命令之前使用不同于绑定顶点缓存区的API将其绑定。Code WalkthruGLuint IBO;
我们为索引缓冲区增加了另一个对象句柄。
Vertices[0] = Vector3f(-1.0f, -1.0f,0.0f);Vertices[1] = Vector3f(0.0f, -1.0f, 1.0f);Vertices[2] = Vector3f(1.0f, -1.0f, 0.0f);Vertices[3] = Vector3f(0.0f, 1.0f, 0.0f);
为了展示顶点共享,我们需要一个稍微更复杂的网模型。为此很多教程使用著名的旋转立方体。这需要8个顶点和个三角形。鄙人稍懒就用旋转的锥体来代替。它仅需要4个顶点和4个三角形,并且更易于手动生成……
当从顶部(沿着Y轴)看这些顶点,我们得到下面的布局:
unsigned intIndices[] = { 0, 3, 1, 1, 3, 2, 2, 3, 0, 0, 1, 2 };
这个索引缓冲区使用索引数组来填充。索引与顶点缓冲区中顶点的位置相匹配。从数组和上面的图形你能看出,最后一个三角形是角锥底座而其它三个是面。角锥不是对称的,但很容易指定说明。
glGenBuffers(1, &IBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices),
Indices, GL_STATIC_DRAW);
我们创建并用索引数组填充索引缓冲区。你可以看到,创建顶点缓冲区和索引缓冲区唯一的区别是,顶点缓冲将GL_ARRAY_BUFFER作为缓冲类型,而索引缓冲将GL_ELEMENT_ARRAY_BUFFER作为缓冲类型。
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
除了绑定顶点缓冲,我们还必须在绘制之前绑定索引缓存。再一次,我们使用GL_ELEMENT_ARRAY_BUFFER作为缓冲类型。
glDrawElements(GL_TRIANGLES, , GL_UNSIGNED_INT, 0);
我们用glDrawElements而不是glDrawArrays。第一个参数是要绘制的图元的类型(与glDrawArrays相同)。第二个参数是图元生成所要用到的索引缓冲区中索引的数量。第三个参数是每个索引的类型。GPU必须被告知每个索引的大小,否则就不知道如何解析缓冲区。这里可能的取有GL_UNSIGNED_BYTE,GL_UNSIGNED_SHORT和GL_UNSIGNED_INT。如果索引范围小,那么你会想用较小的节省空间的类型;如果索引范围大,你会想用较大的类型。最后一个参数告诉GPU要扫描的第一个索引的位置对于索引缓冲区起始位置的偏移量的字节数。当相同的索引缓冲区包含多个对象的索引时,这是很有用的。通过指定偏移量和偏移数,你能告诉GPU要渲染哪个对象。本例中我们要从头开始,所以我们指定为0。请注意,最后一个参数的类型是GLvoid*的,因此如果您指定0以外的其他,你需要将它转换为这种类型。
OpenGL教程翻译 第九课 插值 OpenGL教程翻译第九课插原文地址:
视锥裁剪 转自:
[置顶] 什么是OpenGL中的深度、深度缓存、深度测试? 1)直观理解深度其实就是该象素点在3d世界中距离摄象机的距离,深度缓存中存储着每个象素点(绘制在屏幕上的)的深度!深度测试决定了是否绘制
下一篇:OpenGL教程翻译 第九课 插值(opengl transform)
友情链接: 武汉网站建设