OpenGL中图像和纹理之间的区别是什么

Sam*_*uel 7 opengl

我刚开始学习OpenGL.我对图像和纹理感到困惑.

  • 图像仅用于遮蔽2D场景.并使用顶点和纹理来遮蔽3D场景中的场景?(我指的是在操作顺序OpenGL Programming Guide书.首先,我们必须顶点数据和图像数据.我们可以使用图像数据作为纹理或不是.当作为质地不要使用.这是唯一可以使用场景的背景正确.right?)
  • 纹理操作比图像操作更快.

Kev*_*vin 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);
Run Code Online (Sandbox Code Playgroud)

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


nki*_*int 4

我也是 OpenGL 新手。对于低级计算/GPU 架构来说并不是很好。但这是我刚刚了解到的事情,我正在向你解释。

在 OpenGL 中,您没有像其他一些框架中那样的“图像”对象(QImage在 Qt 中、BufferedImage在 Java Swing 中、MatOpenCV 中的对象等),但是您有一些缓冲区,您可以在其中通过 OpenGL 渲染管道进行渲染或存储图像。

如果您打开 opengl 上下文,您将在默认帧缓冲区(在屏幕上)中进行渲染。但是您可以在其他一些帧缓冲区中进行一些离屏渲染,例如在render buffer中。然后你还有一些其他缓冲区可以将GPU中的图像存储在一些可以用作纹理的缓冲区中。

这些 OpenGL 缓冲区(渲染缓冲区或纹理)存储在 GPU 内部(从 GPU 到 CPU 的传输或反之亦然)。从GPU到CPU的传输是一种称为像素传输的操作。

一些例子:

  • 您可以加载图像(例如文件中的位图)并将其用作纹理。你在这里做什么?从磁盘(像素矩阵)将图像加载到 CPU 上,然后将其传递到 GPU 并将其存储在纹理缓冲区中。然后你可以让 OpenGL 用该纹理渲染一个立方体。

  • 您可以将一些复杂的场景渲染到 GPU 中的渲染缓冲区(离屏渲染),通过传输像素操作将其加载到 CPU 中,并将其保存到文件中。

  • 您可以将场景渲染为纹理(渲染到纹理),然后更改相机参数,渲染到屏幕,并使用先前渲染为镜像对象中的纹理的纹理。

GPU 上的运算速度比 CPU 上的运算速度快。我认为(但我不确定)纹理上的操作比渲染缓冲区上的操作稍微慢一些(因为例如纹理可以具有的 mipmap 缩放,而渲染缓冲区则没有)。

我认为对于场景的背景,您必须使用纹理(或一些从缓冲区加载像素的着色器)。

所以,最终,OpenGL 中没有图像对象。你有缓冲。您可以在其中存储数据(从 CPU 传输到 GPU),可以在其中渲染(离屏渲染),可以读取像素(从 GPU 到 CPU 的像素传输)。其中一些可以用作纹理。这意味着更多的事情,比如它们可以通过 mipmap 缩放以不同的分辨率进行缩放,并通过一些高斯操作进行缩放,它们可以以某些不同的方式进行抗锯齿、夹紧等。

希望这会有所帮助。抱歉,如果有一些错误,但我也在学习 OpenGL。

  • 由于现代 OpenGL 有一个名为“图像”的对象,问题和答案都不完整,您应该已经解释了它与 GL 纹理对象的区别和用例。 (4认同)