首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL glTexImage2D做什么?

OpenGL glTexImage2D做什么?
EN

Stack Overflow用户
提问于 2014-10-22 10:20:25
回答 2查看 4.5K关注 0票数 5

gl.glTexImage2D是做什么的?文档说它“上传纹理数据”。但这是否意味着整个图像都在GPU内存中?我想使用一个大的图像文件来进行纹理映射。此外:我可以简单地使用VBO的uv和位置坐标来绘制纹理吗?

是的,我在这里用错了词。我的意思是携带UV坐标的2D数组和模型的2D数组,以将较大的PNG图像(在纹理内存中)子采样到各个瓷砖模型上。我在这里的困惑在于不知道这些抓取可以有多快。假设我有一张5000x5000像素的图像。我将其作为纹理加载。然后,我创建了自己的算法来获取它的一部分来绘制。我在哪里可以节省绘制这些瓷砖的带宽呢?如果我实现了一个LOD算法来确定哪些磁贴是近的,哪些是远的,哪些是在相机截体之外的,如何在内存中管理每个这些磁贴?我知道加载的问题,但我正在努力寻找最好的实现来开始。我正在使用OpenGL ES 2.0为移动设备进行开发。

EN

回答 2

Stack Overflow用户

发布于 2014-10-22 12:45:03

当你调用glTexImage2D()时到底发生了什么是系统相关的,你没有办法知道,除非你有允许你跟踪GPU和内存使用的开发工具。

唯一能保证的是,传递给调用的数据在调用返回时已被使用(因为API定义允许您在调用后修改/释放数据),并且当数据用于呈现时,GPU可以访问该数据。在这两者之间,任何事情都是公平的。请记住,OpenGL是一种非常异步的应用编程接口。当您进行API调用时,相应的工作主要由GPU排队等待稍后执行,并且通常在调用返回时未完成。这可能包括对上传数据的调用。

而且,并不是所有的GPU都有"GPU内存“。事实上,如果你按数量来看,他们中很少有人这样做。移动GPU具有缓存,但在传统离散GPU的意义上,大多数没有VRAM。VRAM和缓存的管理方式与系统高度相关。

有了以上所有的警告,并描绘了一个具有VRAM的图形处理器:虽然他们可以在glTexImage2D()调用中将数据加载到VRAM中,但如果这是常见的做法,我会感到惊讶。这对我来说没有多大意义。加载纹理时,您不知道它将在多长时间内用于渲染。由于您不知道是否所有纹理都适合VRAM (通常不会),因此您可能必须在使用它之前将其从VRAM中逐出。这显然是非常浪费的。作为一般策略,我认为只有当您有使用纹理数据的绘制调用时,才将纹理数据加载到VRAM中会更有效率。

如果驱动程序可以非常确信所有纹理数据都可以放入VRAM中,情况将有所不同。但是对于OpenGL,确实没有合理的方法来提前知道这一点。而且事情变得更加复杂,因为至少在台式计算机上,您可以同时运行多个应用程序,而VRAM是一个共享资源。

票数 8
EN

Stack Overflow用户

发布于 2014-10-22 10:38:12

你是对的。

glteximage2d是将纹理数据实际移动到图形处理器的函数。

您需要首先使用glGenTextures()创建纹理对象,然后使用glBindTexture()绑定它。

opengl红皮书example中有一个很好的例子说明了这一过程

然后可以将此纹理与VBO一起使用。有许多方法可以实现这一点,但交错顶点坐标、纹理坐标和顶点法线,然后告诉GPU如何通过多次调用glVertexAttribPointer将它们解包,是目前性能最好的选择。

你在VBO的正确轨道上,旧的固定管道GL的东西已经过时了,所以你应该从一开始就学习VBO。

这本书不是100%更新,但它是完整的和免费的,应该作为一个很好的地方开始学习VBO Open GL Book

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26499361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档