如何在GPU中创建纹理

时间:2009-07-26 13:33:22

标签: opengl textures

任何人都可以告诉我如何使用硬件内存在OpenGL中创建纹理?目前我在窗口模式下运行我的游戏,是否需要切换到全屏以获得硬件的使用?

如果我可以在硬件中创建纹理,是否有没有纹理(硬件内存除外)的限制?然后我如何将纹理缓存到硬件中?谢谢。

3 个答案:

答案 0 :(得分:3)

几乎所有适用于OpenGL的纹理教程都应该涵盖这一点。例如hereherehere

对于每个纹理,首先需要纹理名称。纹理名称就像单个纹理的唯一索引。每个名称都指向一个纹理对象,该对象可以有自己的参数,数据等。glGenTextures用于获取新名称。我不知道除了uint范围(2 ^ 32)之外是否有任何限制。如果有,那么你可能会得到0所有新的纹理名称(和gl错误)。

下一步是绑定纹理(请参阅glBindTexture)。之后,使用或影响纹理的所有操作都将使用由您用作glBindTexture参数的纹理名称指定的纹理。您现在可以设置纹理的参数(glTexParameter)并使用glTexImage2D上传纹理数据(对于2D纹理)。调用glTexImage后,您还可以使用纹理数据释放系统内存。

对于静态纹理,所有这些只需要完成一次。如果你想使用纹理,你只需要再次绑定它并启用纹理(glEnable(GL_TEXTURE_2D))。

单个纹理的大小(宽度/高度)受GL_MAX_TEXTURE_SIZE限制。这通常是4096,8192或16384.它也受可用图形内存的限制,因为它必须与其他一些资源(如帧缓冲区或顶点缓冲区)一起装入。所有纹理在一起可能比可用内存大,但随后它们将被交换。

在大多数情况下,图形驱动程序应决定哪些纹理存储在系统内存中以及哪些纹理存储在图形内存中。但是,您可以使用glPrioritizeTextures或glTexParameter为某些纹理赋予更高的优先级。

修改 我不会太担心纹理的存储位置,因为驱动程序通常可以很好地处理它。经常使用的纹理也更可能存储在图形存储器中。如果你设置的优先级只是驱动程序的“提示”,指示纹理留在显卡上的重要性。也可能完全忽略优先级。您还可以使用glAreTexturesResident检查纹理的当前位置。

答案 1 :(得分:1)

通常当你谈到在 GPU 上生成纹理时,你实际上并没有创建纹理图像并像普通纹理那样应用它们。更简单和更常见的方法是使用片段着色器在每个帧中从头开始实时计算每个像素的颜色。
对此的规范示例是在对象的表面上生成Mandelbrot图案,例如茶壶。应用程序使用其多边形和纹理坐标渲染茶壶。在渲染管线的某个阶段,茶壶的每个像素都通过片段着色器,片段着色器是由应用程序发送到GPU的小程序。片段着色器读取2D纹理坐标并计算2D坐标的Mandelbrot设置颜色并将其应用于像素。

全屏模式与此无关。即使您处于窗口模式,也可以使用着色器并生成纹理。正如我所提到的,你创建的纹理实际上从不占用纹理内存中的空间,它们是在运行中创建的。人们可能会想到一种捕获和缓存生成的纹理的方法,但这可能有点复杂,需要多次渲染过程。

如果你在google中查找“GLSL” - OpenGL着色语言,你可以了解更多相关信息 This somewhat dated tutorial显示了如何创建一个绘制Mandelbrot集的简单片段着色器(第4页) 如果您可以阅读“OpenGL着色语言,第2版”这本书,您会发现它包含了许多关于在应用程序中使用外部3D Perlin噪声纹理生成天空,火焰和木材纹理的简单示例

答案 2 :(得分:1)

要在GPU上创建纹理,请查看“渲染到纹理”教程。有两种常用方法:将PBuffer上下文绑定为纹理,或使用帧缓冲对象。 PBuffer渲染到纹理是较旧的方法,并且具有更广泛的支持。帧缓冲区对象更易于使用。

此外,您无需切换到“全屏”模式即可使OpenGL进行硬件加速。事实上,OpenGL根本不了解Windows。全屏OpenGL窗口就是:所有其他窗口顶部的顶层窗口,没有装饰,输入焦点被抓住。一些驱动程序绕过窗口屏蔽和剪切代码,并且如果具有活动OpenGL上下文的窗口覆盖整个屏幕,则采用更简单,更快速的缓冲交换方法,从而获得一点性能,但是使用当前的硬件和软件,效果非常小对其他影响。