opengl如何用顶点数组处理多张纹理图

Dloud 2014-09-29 06:48:23
我有一个比较大的模型,有40张纹理图。按照一般的方法来渲染的话效率比较慢,比如下面的代码:

glBindTexture(GL_TEXTURE_2D, texName[texFileNameIdx]); //texFileNameIdx is the indice of different texture
glBegin(GL_TRIANGLES);
glTexCoord2f(...);
glVertex3f(...);
glTexCoord2f(...);
glVertex3f(...);
glTexCoord2f(...);
glVertex3f(...);
glEnd();

因为每一个三角形可能是不同的纹理图来渲染的,所以我调用glBindTexture来绑定不同的纹理到当前纹理单元中。这样如果模型的点数目多的话速度就会比较慢,所以我采用纹理数组的方法,顶点和法向量的顶点数组比较容易,我的代码在下面:

glGenBuffers(3, this->buffers);
glBindBuffer(GL_ARRAY_BUFFER, this->buffers[VERTEXBUFFER]);

glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*3*objInfo->points3d.size(), this->vertexs, GL_STATIC_DRAW);
glVertexPointer(3, GL_FLOAT, 0, BUFFER_OFFSET(0));
glEnableClientState(GL_VERTEX_ARRAY);

glBindBuffer(GL_ARRAY_BUFFER, this->buffers[NORMALBUFFER]);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*3*objInfo->points3d.size(), this->normals, GL_STATIC_DRAW);
glNormalPointer(GL_FLOAT, 0, BUFFER_OFFSET(0));
glEnableClientState(GL_NORMAL_ARRAY);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->buffers[INDICEBUFFER]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint)*3*objInfo->faces.size(), this->indices, GL_STATIC_DRAW);

这个代码是使用缓冲对象来存储顶点数组的。最后使用glDrawElements这个方法来渲染。
一张纹理比较好弄一点,但是如果有多张纹理图的话怎么办呢?
...全文
1231 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lion.Kuo 2016-07-01
  • 打赏
  • 举报
回复
只能一个对象一个对象画,真想不出其他更好的方法
asdln 2016-01-20
  • 打赏
  • 举报
回复
我也遇到这个问题,不知道楼主解决没有
SiGoYi 2014-09-30
  • 打赏
  • 举报
回复
先帮顶一下! 然后,想问一下楼主,你的模型建模后会得到很多三角面片的数组和法向量的数组,之后你在画一个三角面片时想给一个三角面片加上纹理。由于三角面片和纹理都很多,所以你不知道有什么办法把这些纹理画到三角面片上是这样么?请回复!
内容简介: 《OpenGL编程指南(原书第7版)》对OpenGL以及OpenGL实用函数库进行了全面而又权威的介绍,素有“OpenGL红宝书”之誉。《OpenGL编程指南(原书第7版)》的上一个版本覆盖了到OpenGL 2.1版的内容。本版涵盖了OpenGL 3.0和3.1的最新特性。本书以清晰的语言描述了OpenGL的功能以及许多基本的计算机形技巧,例如创建和渲染3d模型、从不同的透视角度观察物体、使用着色、光照和纹理使场景更加逼真等。另外,本书还深入探讨了许多高级技巧,包括纹理、抗锯齿、雾和大气效果、nurbs、处理子集等。此外,《OpenGL编程指南(原书第7版)》还对一些重要的主题进行了讨论,例如提高性能、OpenGL扩展以及跨平台技术等。本书内容详实,讲解生动,文并茂,是OpenGL程序员的绝佳编程指南。 OpenGL是一种功能强大的软件接口,既可以用于生成高质量的计算机像,也可以用于编写使用2d和3d物体、位和彩色像的交互式应用程序。 《OpenGL编程指南(原书第7版)》对OpenGL以及OpenGL实用函数库进行了全面而又权威的介绍,素有“OpenGL红宝书”之誉。《OpenGL编程指南(原书第7版)》的上一个版本覆盖了截止OpenGL 2.1版的内容。这一版涵盖了OpenGL 3.0和3.1的最新特性。《OpenGL编程指南(原书第7版)》清晰的语言描述了OpenGL的功能以及许多基本的计算机形技巧,例如创建和渲染3d模型、从不同的透视角度观察物体、使用着色、光照和纹理使场景更加逼真等。本书还深入探讨了许多高级技巧,包括纹理、抗锯齿、雾和大气效果、nurbs、处理等。另外,《OpenGL编程指南(原书第7版)》还对一些重要的主题进行了讨论,例如提高性能、OpenGL扩展以及跨平台技术等。 《OpenGL编程指南(原书第7版)》进行了一些更新,涵盖了OpenGL 3.0和3.1的最新特性,包括: 使用帧缓冲区对象进行离屏渲染和纹理更新。 各种新的缓冲区对象类型的示例,包括uniform缓冲区对象、变换反馈缓冲区和顶点数组对象。 使用纹理数组提高使用众多纹理的性能。 使用元重启和条件渲染来高效地进行渲染。 介绍OpenGL的废弃机制,以及如何针对OpenGL未来版本验证程序。 《OpenGL编程指南(原书第7版)》继续对OpenGL着色语言(glsl)展开讨论,并解释了使用这种语言创建复杂形效果并提升OpenGL计算威力的机制。OpenGL技术资料库(OpenGL technical library)提供了大量的OpenGL教程和参考书籍,它可以帮助程序员深入理解OpenGL,完全释放OpenGL的潜力。这个资料库最初由sgi开发,目前由khronos OpenGL体系结构审核委员会(arb)工作组维护,这是负责指导OpenGL以及相关技术发展和演变的行业协会。 作者简介: Dave Shreiner是ARM公司的形技术总监,长期担任SGI核心OpenGL组的成员。他首次开设了OpenGL的商业培训课程,拥有二十多年的计算机形应用开发经验。Dava定期参加SIGGRAPH和其他全球性的形工作会议。他是《OpenGL ES 2.0 Programming Guide》和《OpenGL Reference Manual》的作者,也是Addison-Wesley的OpenGL系列的编辑。
最新版OpenGL 2.1 Reference 函数速查手册CHM格式 ------------ 1992年7月,SGI公司发布了OpenGL的1.0版本,随后又与微软公司共同开发了Windows NT版本的OpenGL,从而使一些原来必须在高档形工作站上运行的大型3D处理软件也可以在微机上运用。1995年OpenGL的1.1版本面市,该版本比1.0的性能有许多提高,并加入了一些新的功能。其中包括改进打印机支持,在增强元文件中包含OpenGL的调用,顶点数组的新特性,提高顶点位置、法线、颜色、色彩指数、纹理坐标、多边形边缘标识的传输速度,引入了新的纹理特性等等。OpenGL 1.5又新增了“OpenGL Shading Language”,该语言是“OpenGL 2.0”的底核,用于着色对象、顶点着色以及片断着色技术的扩展功能。   OpenGL 2.0标准的主要制订者并非原来的SGI,而是逐渐在ARB中占据主动地位的3DLabs。2.0版本首先要做的是与旧版本之间的完整兼容性,同时在顶点与像素及内存管理上与DirectX共同合作以维持均势。OpenGL 2.0将由OpenGL 1.3的现有功能加上与之完全兼容的新功能所组成(如一)。借此可以对在ARB停滞不前时代各家推出的各种纠缠不清的扩展指令集做一次彻底的精简。此外,硬件可编程能力的实现也提供了一个更好的方法以整合现有的扩展指令。 OpenGL 2.1版相比2.0版主要的更新包括: 1. GLSL升级至1.2版 2. 支持非正方形的矩阵. UniformMatrix {2x3,3x2,2x4,4x2,3x4,4x3}fv 3. 象素缓冲对象(Pixel Buffer Object). 它扩充了缓冲对象的接口.现在缓冲区对象可以支持顶点数组和象素数据了.象素缓冲对象能加速在GPU内存中进行的缓冲区之间的数据拷贝及其他象素操作. 4. sRGB纹理. 遵循IEC 61966-2-1.标准的sRGB颜色空间的纹理格式(包括压缩和非压缩格式).

19,468

社区成员

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

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