OpenGL glTexImage2D做了什么?

时间:2014-10-22 02:20:25

标签: opengl

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

是的,我在这里使用错误的方式。我的意思是携带一个2D坐标的2D阵列和一个2D模型阵列,以便将更大的PNG图像(在纹理存储器中)采样到单个图块模型上。我的困惑在于不知道这些取物的速度有多快。可以说我有5000x5000像素的图像。我把它作为纹理加载。然后我创建自己的算法来获取部分绘制。我在哪里可以节省绘制这些瓷砖的带宽?如果我实现一个LOD算法来确定哪些瓷砖是接近的,哪些是远的,哪些是相机视锥,那么如何管理内存中的每个瓷砖呢?加载的问题我知道,但我很难找到最好的实施入门。我正在为使用OpenGL ES 2.0的移动设备开发。

2 个答案:

答案 0 :(得分:6)

当您致电glTexImage2D()时,究竟发生什么事情取决于系统,除非您拥有可以跟踪GPU和内存使用情况的开发人员工具,否则您无法知道。

唯一保证的是,传递给调用的数据在调用返回时已被消耗(因为API定义允许您在调用后修改/释放数据),并且数据可供访问GPU用于渲染时。在那之间,任何事情都是公平的。请记住,OpenGL是一个非常异步的API。当您进行API调用时,相应的工作大部分排队等待GPU稍后执行,并且通常在调用返回时不会完成。这可能包括上传数据的要求。

此外,并非所有GPU都具有“GPU内存”。事实上,如果你按数量来看待它们,那么它们很少。移动GPU具有缓存,但在传统的分立GPU意义上,大多数情况下不是VRAM。如何管理VRAM和缓存是高度依赖系统的。

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

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

答案 1 :(得分:1)

你是对的。

glteximage2d是实际将纹理数据移动到gpu的函数。

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

在opengl红皮书中有一个很好的例子 example

然后您可以将此纹理与VBO一起使用。有很多方法可以实现这一点,但是交错你的顶点坐标,纹理坐标和顶点法线然后告诉GPU如何通过几次调用glVertexAttribPointer来解压缩它们是最好的选择。

你在VBO的正确轨道上,旧的固定管道GL的东西被贬低,所以你应该从一开始就学习VBO。

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