10

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

  • 图像是否仅用于为 2D 场景着色。并使用顶点和纹理在 3D 场景中为场景着色?(我的意思是按照书的操作顺序OpenGL Programming Guide。首先我们有顶点数据和图像数据。我们可以将图像数据用作或不用作纹理。当不用作纹理时。它只能用作场景的背景对。right?)
  • 纹理操作是否比图像操作快。
4

2 回答 2

5

就 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 中的原始图像数据进行 free() 处理。纹理现在可以被 OpenGL 使用。

于 2012-12-17T06:46:59.307 回答
3

我也是 OpenGL 的新手。并且对于低级计算/GPU架构并不是很好。但这是我刚刚学到的东西,我正在向你解释。

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

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

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

一些例子:

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

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

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

GPU 上的操作比 CPU 上的操作更快。我认为(但我不确定)纹理上的操作比渲染缓冲区上的操作要慢一些(因为例如纹理可能具有的 mipmap 缩放而渲染缓冲区没有)。

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

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

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

于 2013-07-19T10:06:34.877 回答