游戏开发论坛

 找回密码
 立即注册
搜索
查看: 11307|回复: 12

关于.TGA文件.

[复制链接]

30

主题

126

帖子

126

积分

注册会员

Rank: 2

积分
126
发表于 2007-1-21 18:06:00 | 显示全部楼层 |阅读模式
找了好多书,在讲2D的图片文件格式中只看见讲bmp文件的,在实际应用中,很少用bmp吧.TGA文件在做纹理的时侯好像比bmp方便得很多.请大家讲讲对bmp与TGA文件的看法.如能赐教,感激不尽.

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20732
发表于 2007-1-22 09:59:00 | 显示全部楼层

Re:关于.TGA文件.

tga可以带通道图,另外还支持行程编码压缩,虽然后来的bmp也可以了,可能大家都习惯用tga了。

30

主题

126

帖子

126

积分

注册会员

Rank: 2

积分
126
 楼主| 发表于 2007-1-22 10:49:00 | 显示全部楼层

Re:关于.TGA文件.

请问如何制作TGA文件?昨天我用PS用另存为的方法制了几个TGA,呵呵,可是使用起来和BMP文件没什么两样.请赐教.

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20732
发表于 2007-1-22 12:17:00 | 显示全部楼层

Re:关于.TGA文件.

如果你不使用alpha通道,那基本上和bmp没有区别。

95

主题

1089

帖子

3301

积分

论坛元老

Rank: 8Rank: 8

积分
3301
QQ
发表于 2007-1-22 17:48:00 | 显示全部楼层

Re:关于.TGA文件.

有时候我会想做点好事,现在就做:
tag是什么并不重要,重要的是你能使用它,只要知道它是图片就行不用理会太多,学会从读文件到写入到opengl你就算学会了,请看代码:
                        FILE *pF=fopen(pName,"rb");
                        if(pF)
                        {
                                fseek(pF,12,SEEK_SET);
                                UCHAR header[6];
                                fread(header, sizeof(header), 1,pF);
                                m_Texture.wh[0]=header[1] * 256 +header[0];                                        // Determine The TGA Width        (highbyte*256+lowbyte)
                                m_Texture.wh[1]= header[3] * 256 +header[2];                                        // Determine The TGA Height        (highbyte*256+lowbyte)
                                if((m_Texture.wh[0]<= 0) || (m_Texture.wh[1] <= 0) || ((header[4]!= 24) && (header[4] !=32)))        // Make sure all information is valid
                                {
                                        fclose(pF);
                                        return false;
                                }

                                if(header[4]==24) m_Texture.type=GL_RGB;
                                else  m_Texture.type=GL_RGBA;
                                m_Texture.bytesPerPixel=header[4]/ 8;
                                int imageSize=(m_Texture.bytesPerPixel*m_Texture.wh[0]*m_Texture.wh[1]);
                                m_Texture.imageData=new UCHAR[imageSize];
                                fread(m_Texture.imageData,sizeof(char),imageSize,pF);
                                fclose(pF);
                                char temp=0;
                                for(GLuint cswap = 0;  cswap < imageSize; cswap += m_Texture.bytesPerPixel)        // Swap color bytes from BGR to RGB
                                {
                                        temp= m_Texture.imageData[cswap];
                                        m_Texture.imageData[cswap]= m_Texture.imageData[cswap + 2];
                                        m_Texture.imageData[cswap + 2]        = temp;
                                }
                        }
上面那么多废话就是为了填这个:
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB8,wh[0],wh[1],type, GL_UNSIGNED_BYTE,imageData);

30

主题

126

帖子

126

积分

注册会员

Rank: 2

积分
126
 楼主| 发表于 2007-1-22 19:49:00 | 显示全部楼层

Re:关于.TGA文件.

呵呵,好人哪,你的代码我会好好收藏的,thx,very thx!

35

主题

141

帖子

157

积分

注册会员

Rank: 2

积分
157
发表于 2008-12-17 11:07:00 | 显示全部楼层

Re:关于.TGA文件.

果然是好人

42

主题

115

帖子

141

积分

注册会员

Rank: 2

积分
141
发表于 2008-12-17 22:25:00 | 显示全部楼层

Re: 关于.TGA文件.

tga bmp都不适合用来存储图片,建议你使用opengl自带的压缩方式,先读bmp图,再把他设置成opengl支持的压缩格式再存到文件里,下次直接读压缩后的图片就OK了,给你发个例子,也许该代码并不强壮,也许会发生内存泄露,所以建议你不要照搬,看下如何实现的,本来也不难


  1. #include <windows.h>
  2. #include <glew.h>
  3. #include <gl.h>
  4. #include <glu.h>
  5. #include <stdio.h>
  6. #pragma comment(lib,"opengl32.lib")
  7. #pragma comment(lib,"glu32.lib")
  8. #pragma comment(lib,"glew32.lib")
  9. #pragma warning( disable : 4305)
  10. #pragma warning( disable : 4244)


  11. HGLRC hrc;
  12. HDC hdc;
  13. int pixformat;
  14. PIXELFORMATDESCRIPTOR pfd;

  15. struct S_PICTURE
  16. {
  17.         int x,y,format;
  18.         int size;
  19.         byte *data;
  20. };

  21. void savepic(char *name,byte *image,int x,int y,int size,int format)
  22. {
  23.         FILE *f=fopen(name,"wb+");
  24.         fwrite(&x,sizeof(int),1,f);
  25.         fwrite(&y,sizeof(int),1,f);
  26.         fwrite(&size,sizeof(long),1,f);
  27.         fwrite(&format,sizeof(int),1,f);
  28.         fwrite(image,sizeof(byte),size,f);
  29.         fclose(f);
  30. }

  31. S_PICTURE *loadpic(char *name)
  32. {
  33.         FILE *f=fopen(name,"rb");
  34.         S_PICTURE *sp;
  35.         sp=new S_PICTURE;
  36.         fread(&sp->x,sizeof(int),1,f);
  37.         fread(&sp->y,sizeof(int),1,f);
  38.         fread(&sp->size,sizeof(long),1,f);
  39.         fread(&sp->format,sizeof(int),1,f);
  40.         sp->data=new byte[sp->size];
  41.         fread(sp->data,sizeof(byte),sp->size,f);
  42.         fclose(f);
  43.         return sp;
  44. }
  45. //关键是这个函数
  46. GLuint CreateTexture(char *name)
  47. {
  48.         GLuint texture;                /*HBITMAP hbmp; BITMAP bmp;
  49. //这些注释里的代码是用来读bmp并保存为压缩格式的       
  50.         hbmp=(HBITMAP)LoadImage(GetModuleHandle(0),
  51. name,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE);                               
  52.         GetObject(hbmp,sizeof bmp,&bmp);
  53.         glGenTextures(1,&texture);
  54.         glBindTexture(GL_TEXTURE_2D,texture);
  55.         glTexImage2D(GL_TEXTURE_2D,0,GL_COMPRESSED_RGB,bmp.bmWidth,bmp.bmHeight, 0,
  56. GL_BGR,GL_UNSIGNED_BYTE,bmp.bmBits);
  57.         int size;                int format;                byte *img;
  58.         glGetTexLevelParameteriv(GL_TEXTURE_2D,
  59. 0,GL_TEXTURE_INTERNAL_FORMAT,&format);
  60.         glGetTexLevelParameteriv(GL_TEXTURE_2D,
  61. 0,GL_TEXTURE_COMPRESSED_IMAGE_SIZE,&size);
  62.         glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  63.         glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  64.         img=new byte[size];
  65.         glGetCompressedTexImageARB(GL_TEXTURE_2D, 0, img);
  66.         savepic("ss",img,bmp.bmWidth,bmp.bmHeight,size,format);
  67.         DeleteObject(hbmp);
  68.         delete[] img;
  69. */
  70. //这是读已压缩好图片的
  71.         S_PICTURE *sp=loadpic("ss");
  72.         glGenTextures(1,&texture);
  73.         glBindTexture(GL_TEXTURE_2D,texture);
  74.         glCompressedTexImage2DARB(
  75. GL_TEXTURE_2D,0,sp->format,sp->x,sp->y,0,sp->size,sp->data);
  76.         glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  77.         glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  78.         delete[] sp->data;
  79.         delete[] sp;


  80.         return texture;
  81. }










  82. LRESULT CALLBACK wndproc(HWND hwnd,UINT umsg,WPARAM wparam,LPARAM lparam)
  83. {
  84.         switch (umsg)
  85.         {
  86.         case WM_DESTROY:
  87.                 wglMakeCurrent(0,0);
  88.                 wglDeleteContext(hrc);
  89.                 ReleaseDC(hwnd,hdc);
  90.                 PostQuitMessage(0);
  91.                 return 0;
  92.         default:
  93.                 return DefWindowProc(hwnd,umsg,wparam,lparam);
  94.         }
  95. }




  96. int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
  97. {
  98.         HWND hwnd;MSG msg;WNDCLASS wc;
  99.         ZeroMemory(&wc,sizeof wc);
  100.         wc.hCursor=LoadCursor(0,IDC_ARROW);
  101.         wc.hInstance=hInstance;
  102.         wc.lpfnWndProc=wndproc;
  103.         wc.lpszClassName="classname";
  104.         RegisterClass(&wc);
  105.         hwnd=CreateWindow("classname","windowname",WS_OVERLAPPED|WS_SYSMENU|WS_MINIMIZEBOX,GetSystemMetrics(0)/2-400,GetSystemMetrics(1)/2-300,800,600,0,0,hInstance,0);
  106.         ZeroMemory(&pfd,sizeof pfd);
  107.         pfd.nVersion=1;
  108.         pfd.nSize=sizeof pfd;
  109.         pfd.iPixelType=PFD_TYPE_RGBA;
  110.         pfd.dwFlags=PFD_DOUBLEBUFFER|PFD_SUPPORT_OPENGL|PFD_DRAW_TO_WINDOW;
  111.         pfd.cDepthBits=16;
  112.         pfd.cColorBits=24;
  113.         hdc=GetDC(hwnd);
  114.         pixformat=ChoosePixelFormat(hdc,&pfd);
  115.         SetPixelFormat(hdc,pixformat,&pfd);
  116.         hrc=wglCreateContext(hdc);
  117.         wglMakeCurrent(hdc,hrc);
  118.         glMatrixMode(GL_PROJECTION);
  119.         glLoadIdentity();
  120.         gluOrtho2D(0,800,0,600);
  121.         glMatrixMode(GL_MODELVIEW);
  122.         glewInit();
  123.         glEnable(GL_DEPTH_TEST);
  124.         glEnable(GL_TEXTURE_2D);
  125.         ShowWindow(hwnd,SW_SHOW);
  126.         glClearColor(1,1,1,1);

  127.         GLuint texture=CreateTexture("111.bmp");


  128.         glEnable(GL_BLEND);
  129.         while (1)
  130.         {
  131.                 if (PeekMessage(&msg,0,0,0,PM_REMOVE))
  132.                 {
  133.                         if(msg.message==WM_QUIT)break;
  134.                         TranslateMessage(&msg);
  135.                         DispatchMessage(&msg);
  136.                 }
  137.                 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  138.                 glLoadIdentity();
  139.                 glTranslatef(10,10,0);
  140.                 glBindTexture(GL_TEXTURE_2D,texture);
  141.                 glBegin(7);
  142.                 glTexCoord2f(0,0);        glVertex2f(0,0);
  143.                 glTexCoord2f(1,0);        glVertex2f(800,0);
  144.                 glTexCoord2f(1,1);        glVertex2f(800,800);
  145.                 glTexCoord2f(0,1);        glVertex2f(0,800);
  146.                 glEnd();

  147.                
  148.                 SwapBuffers(hdc);
  149.         }
  150.         return msg.wParam;
  151. }
复制代码

227

主题

1793

帖子

1866

积分

金牌会员

Rank: 6Rank: 6

积分
1866
发表于 2008-12-18 11:05:00 | 显示全部楼层

Re:关于.TGA文件.

glCompressedTexImage2DARB(GL_TEXTURE_2D,0,sp->format,sp->x,sp->y,0,sp->size,sp->data);
请问楼上
这行代码里的sp->format是什么?
GL_COMPRESSED_RGB
还是GL_RGB?

42

主题

115

帖子

141

积分

注册会员

Rank: 2

积分
141
发表于 2008-12-18 17:30:00 | 显示全部楼层

Re: Re:关于.TGA文件.

oz01: Re:关于.TGA文件.

glCompressedTexImage2DARB(GL_TEXTURE_2D,0,sp->format,sp->x,sp->y,0,sp->size,sp->data)...


format是我们自己定义的S_PICTURE结构体的format,代表图片的压缩格式,
struct S_PICTURE
{
        int x,y,format;
        int size;
        byte *data;
};
貌似不能用GL_RGB或者GL_COMPRESSED_RGB这些代替,貌似必须获取压缩后的格式信息保存起来glcompressedteximage2d的时候用,反正我那样搞显示不出图片
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-20 15:34

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表