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

时间:2012-12-17 06:35:44

标签: opengl

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

  • 图像仅用于遮蔽2D场景。并使用顶点和纹理来遮蔽3D场景中的场景? (我的意思是OpenGL Programming Guide本书的操作顺序。首先我们有顶点数据和图像数据。我们可以使用图像数据作为纹理。不用作纹理时。它只能使用场景背景。right?)
  • 纹理操作比图像操作更快。

3 个答案:

答案 0 :(得分:4)

就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可以使用纹理。

答案 1 :(得分:2)

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

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

如果你打开一个opengl上下文,你将在default frame buffer(在屏幕上)进行渲染。但是你可以在其他一些帧缓冲区中做一些离屏渲染,比如render buffer。然后你有一些其他缓冲区可以在GPU中将图像存储在一些缓冲区中,可以用作texture

那些opengl缓冲区(渲染缓冲区或纹理)存储在GPU内部(从GPU到CPU的转移或反之亦然)。从GPU到CPU的传输是一个名为pixel transfer的操作。

一些例子:

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

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

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

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

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

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

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

答案 2 :(得分:1)

我也是OpenGL的新手。但我认为artical可以很好地回答这个问题。