OpenGL入门教程33:加载TGA数据

系列教程索引:OpenGL入门教程索引

tga是由美国Truevision公司为其显示卡开发的一种图像文件格式,已被国际上的图形、图像工业所接受。现已成为数字化图像,以及运用光线跟踪算法所产生的高质量图像的常用格式。TGA文件的扩展名为.tga,该格式支持压缩,使用不失真的压缩算法,可以带通道图,另外还支持行程编码压缩。

TGA(Targa)格式是计算机上应用最广泛的图象格式。在兼顾了BMP的图象质量的同时又兼顾了JPEG的体积优势。并且还有自身的特点:通道效果、方向性。在CG领域常作为影视动画的序列输出格式,因为兼具体积小和效果清晰的特点。
TGA格式(Tagged Graphics)是由美国Truevision公司为其显示卡开发的一种图像文件格式,文件后缀为“.tga”,已被国际上的图形、图像工业所接受。

TGA的结构比较简单,属于一种图形、图像数据的通用格式,在多媒体领域有很大影响,是计算机生成图像向电视转换的一种首选格式。
TGA图像格式最大的特点是可以做出不规则形状的图形、图像文件,一般图形、图像文件都为正方形,若需要有圆形、棱形甚至是镂空的图像文件时,TGA就可以派上用场了。

TGA格式支持压缩,使用不失真的压缩算法。
在工业设计领域,使用三维软件制作出来的图像可以利用TGA格式的优势,在图像内部生成一个Alpha(通道),这个功能方便了在平面软件中的工作。

首先函数基本的架构是:

flow

在main函数中glut*Func()的参数为回调函数,需要在main函数外独立实现。

重要的是四个回调函数:

  • initGL,初始化函数
  • reshapeGL,尺寸调整函数,当窗口的尺寸发生变化时调用此函数重新绘图
  • keyboard,捕获键盘输入并处理
  • displayGL,将想要显示的图像绘制出来的函数

其他函数说明见OpenGL函数功能说明系列

加载纹理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//加载纹理
void loadGLTexture(){
int w,h,c;//图片的宽度高度和通道数

unsigned char *data=stbi_load("Uncompressed.tga",&w,&h,&c,0);

//创建纹理
glGenTextures(1,&texture[0]);
glBindTexture(GL_TEXTURE_2D,texture[0]);//绑定纹理

//纹理过滤
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);

//二位纹理,细节等级,RGB3组件,宽,高,边框,rgb数据,无符号整数,数据
if(c==3){
glTexImage2D(GL_TEXTURE_2D, 0, 3,w,h,0,GL_RGB,GL_UNSIGNED_BYTE,data);
}else if(c==4){
glTexImage2D(GL_TEXTURE_2D, 0, 3,w,h,0,GL_RGBA,GL_UNSIGNED_BYTE,data);
}

data=stbi_load("Compressed.tga",&w,&h,&c,0);

//创建纹理
glGenTextures(1,&texture[1]);
glBindTexture(GL_TEXTURE_2D,texture[1]);//绑定纹理

//纹理过滤
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);

//二位纹理,细节等级,RGB3组件,宽,高,边框,rgb数据,无符号整数,数据
if(c==3){
glTexImage2D(GL_TEXTURE_2D, 0, 3,w,h,0,GL_RGB,GL_UNSIGNED_BYTE,data);
}else if(c==4){
glTexImage2D(GL_TEXTURE_2D, 0, 3,w,h,0,GL_RGBA,GL_UNSIGNED_BYTE,data);
}
}

就是普通的图片数据加载,感谢stb。

绘图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
//OpenGL的主要绘图函数,绘制什么显示什么。
void displayGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清空界面和depth缓冲区
glLoadIdentity();//调整视场
glTranslatef(0.0f,0.0f,-5.0f);//平移三角形位置

spin+=0.05f;

for (int loop=0; loop<20; loop++) // Loop Of 20
{
glPushMatrix(); // Push The Matrix
glRotatef(spin+loop*18.0f,1.0f,0.0f,0.0f); // Rotate On The X-Axis (Up - Down)
glTranslatef(-2.0f,2.0f,-6.0f); // Translate 2 Units Left And 2 Up

glBindTexture(GL_TEXTURE_2D, texture[0]); // ( CHANGE )
glBegin(GL_QUADS); // Draw Our Quad
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, -1.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 0.0f);
glEnd(); // Done Drawing The Quad
glPopMatrix(); // Pop The Matrix

glPushMatrix(); // Push The Matrix
glTranslatef(2.0f,0.0f,-6.0f); // Translate 2 Units To The Right
glRotatef(spin+loop*36.0f,0.0f,1.0f,0.0f); // Rotate On The Y-Axis (Left - Right)
glTranslatef(1.0f,0.0f,0.0f); // Move One Unit Right

glBindTexture(GL_TEXTURE_2D, texture[1]); // ( CHANGE )
glBegin(GL_QUADS); // Draw Our Quad
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, -1.0f, 0.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, -1.0f, 0.0f);
glEnd(); // Done Drawing The Quad
glPopMatrix(); // Pop The Matrix
}
//双缓冲技术,交换缓冲区以显示刚刚绘制的图像
glutSwapBuffers();
}

加载了两张图,第一张绕X旋转20次,第二张图绕Y轴旋转20次。

没有加载图片的效果:

noimage

加载了图片的效果:

default

完整源码在OpenGL下的OpenGLut的33中。


OpenGL入门教程33:加载TGA数据
https://feater.top/opengl/opengl-load-tga/
作者
JackeyLea
发布于
2020年11月18日
许可协议