OpenGL glTexImage2D做了什么?

Fra*_*Fra 4 opengl

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

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

Ret*_*adi 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是共享资源.


小智 4

你是对的。

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

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

opengl 红皮书示例中有一个关于此过程的很好的示例

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

你在 VBO 方面走在正确的轨道上,旧的固定管道 GL 的东西已经被废弃,所以你应该从一开始就学习 VBO。

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