首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在GPU中创建纹理

如何在GPU中创建纹理
EN

Stack Overflow用户
提问于 2009-07-26 13:33:22
回答 3查看 5.3K关注 0票数 1

谁能告诉我如何在OpenGL中使用硬件内存来创建纹理?目前我在窗口模式下运行游戏,是否需要切换到全屏模式才能使用硬件?

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

EN

回答 3

Stack Overflow用户

发布于 2009-07-26 20:24:03

几乎所有的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检查纹理当前的位置。

票数 3
EN

Stack Overflow用户

发布于 2009-07-26 14:45:03

通常,当您谈论在GPU上生成纹理时,您实际上并不是在创建纹理图像并像应用普通纹理一样应用它们。更简单、更常见的方法是使用片段着色器从每个单独的帧从零开始实时计算每个像素的颜色。

典型的例子是在物体表面生成一个Mandelbrot图案,比如一个茶壶。应用程序使用其多边形和纹理坐标渲染茶壶。在渲染管道的某个阶段,茶壶的每个像素都会通过片段着色器,这是一个由应用程序发送到GPU的小程序。片段着色器读取2D纹理坐标,计算2D坐标的Mandelbrot集颜色,并将其应用于像素。

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

如果你在谷歌中搜索"GLSL“- OpenGL着色语言,你可以了解更多关于它的信息。

This somewhat dated tutorial展示了如何创建一个简单的片段着色器来绘制Mandelbrot集(第4页)。

如果你能拿到"OpenGL Shading Language,第二版“这本书,你会发现它包含了一些简单的例子,在应用程序的外部3Dperlin噪波纹理的帮助下生成天空,火和木头纹理。

票数 1
EN

Stack Overflow用户

发布于 2010-12-01 08:48:22

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

你也不需要切换到“全屏”模式来让OpenGL被硬件加速。事实上,OpenGL对windows一无所知。一个全屏OpenGL窗口就是这样:一个位于所有其他窗口之上的上移窗口,没有任何装饰,并且抓取了输入焦点。一些驱动程序绕过窗口屏蔽和裁剪代码,并且如果具有活动OpenGL上下文的窗口覆盖整个屏幕,则采用更简单、更快的缓冲区交换方法,从而获得一些性能,但是与其他影响相比,对于当前的硬件和软件,其影响非常小。

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

https://stackoverflow.com/questions/1184608

复制
相关文章

相似问题

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