在OpenGL中,图像和纹理有什么区别?

10

我刚开始学习OpenGL。在理解图像和纹理时感到困惑。

  • 图像只用于给2D场景着色吗?在3D场景中使用顶点和纹理来进行着色吗?(我的意思是在OpenGL编程指南书的操作顺序中,首先有顶点数据和图像数据。我们可以将图像数据用作纹理,也可以不用。当不用作纹理时,它只能用作场景的背景,对吗?)
  • 纹理操作比图像操作更快吗?

2
请添加更多描述。通常,已加载的图像文件是一种纹理。 - mda
2个回答

6

在OpenGL中,图像是RAM中的像素数据数组。例如,您可以使用标准C函数在RAM中加载一个smiley.tga文件,这就是一张图像。当图像数据由OpenGL加载到视频内存中时,就形成了一种纹理。可以通过以下方式完成此操作:

GLuint *texID;
glGenTextures(1, (GLuint*)&texID);
glBindTexture(GL_TEXTURE_2D, texID);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, imagedata);

当图像被加载到视频内存中后,RAM中的原始图像数据可以被释放。现在,OpenGL可以使用这个纹理。


@ Kevin:对不起,我的表达不好。我已经编辑了我的问题。实际上,我想知道当图像不用作纹理时它能做什么。 - Samuel
据我所知,OpenGL无法仅使用RAM中的像素数据,您必须将其制作成纹理才能在OpenGL中使用。但是,您可以通过自己的代码对这些像素进行任何操作。例如,您可以模糊图像,然后将其制作成纹理,在屏幕上绘制一个模糊的纹理。 - Kevin

4
我也是OpenGL的新手,对于低级计算/GPU架构也不是很擅长。但这是我刚学到的一件事情,我现在向您解释。
在OpenGL中,您没有像其他框架(Qt中的QImage,Java Swing中的BufferedImage,OpenCV中的Mat对象等)那样的“图像”对象,但您有一些缓冲区,可以通过OpenGL渲染管线进行渲染或存储图像。
如果您打开一个OpenGL上下文,则会在默认帧缓冲区(屏幕上)中进行渲染。但是,您可以在其他帧缓冲区中进行一些离屏渲染,例如在渲染缓冲区中。然后,您还有一些可以在GPU中存储图像的缓冲区,可以用作纹理
那些OpenGL缓冲区(渲染缓冲区或纹理)存储在GPU内部(从GPU到CPU或反之间的传输有一些成本)。从GPU到CPU的传输是一种称为像素传输的操作。
一些例子:
- 您可以加载图像(例如从文件中加载位图),并将其用作纹理。这里你在做什么?在CPU上从磁盘加载图像(像素矩阵),然后将其传递到GPU并存储在纹理缓冲区中。然后,您可以告诉OpenGL使用该纹理来渲染一个立方体。 - 您可以将一些复杂场景渲染到GPU中的渲染缓冲区(离屏渲染),通过传输像素操作在CPU中加载它,并将其保存到文件中。 - 您可以将场景渲染到纹理中(渲染到纹理),然后更改相机参数,呈现到屏幕上,并在镜像对象中使用先前呈现的纹理作为纹理。
GPU上的操作比CPU上的操作快。我认为(但不确定)纹理操作比渲染缓冲区操作略慢(例如,纹理可能具有的mipmap缩放和渲染缓冲区没有)。
我认为对于场景的背景,您必须使用纹理(或一些从缓冲区加载像素的着色器)。
因此,在OpenGL中,您没有图像对象。您有缓冲区。您可以在其中存储数据(从CPU传输到GPU),您可以在其中进行渲染(屏幕外渲染),您可以读取像素(从GPU传输到CPU的像素传输)。其中一些可以用作纹理。这意味着还有其他一些事情,例如它们可以通过mipmap缩放以不同的分辨率进行缩放,并且可以通过一些高斯操作进行缩放,可以以不同方式进行抗锯齿处理,可以被夹紧等等。
希望这能有所帮助。如果有错误,请原谅,因为我也在学习OpenGL。

4
问题和答案都不完整,因为现代OpenGL有一个叫做“图像”的对象,你应该已经了解它与GL纹理对象的区别和用例。 - Michael IV

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接