|
|
发表于 2008-12-17 22:25:00
|
显示全部楼层
Re: 关于.TGA文件.
tga bmp都不适合用来存储图片,建议你使用opengl自带的压缩方式,先读bmp图,再把他设置成opengl支持的压缩格式再存到文件里,下次直接读压缩后的图片就OK了,给你发个例子,也许该代码并不强壮,也许会发生内存泄露,所以建议你不要照搬,看下如何实现的,本来也不难
- #include <windows.h>
- #include <glew.h>
- #include <gl.h>
- #include <glu.h>
- #include <stdio.h>
- #pragma comment(lib,"opengl32.lib")
- #pragma comment(lib,"glu32.lib")
- #pragma comment(lib,"glew32.lib")
- #pragma warning( disable : 4305)
- #pragma warning( disable : 4244)
- HGLRC hrc;
- HDC hdc;
- int pixformat;
- PIXELFORMATDESCRIPTOR pfd;
- struct S_PICTURE
- {
- int x,y,format;
- int size;
- byte *data;
- };
- void savepic(char *name,byte *image,int x,int y,int size,int format)
- {
- FILE *f=fopen(name,"wb+");
- fwrite(&x,sizeof(int),1,f);
- fwrite(&y,sizeof(int),1,f);
- fwrite(&size,sizeof(long),1,f);
- fwrite(&format,sizeof(int),1,f);
- fwrite(image,sizeof(byte),size,f);
- fclose(f);
- }
- S_PICTURE *loadpic(char *name)
- {
- FILE *f=fopen(name,"rb");
- S_PICTURE *sp;
- sp=new S_PICTURE;
- fread(&sp->x,sizeof(int),1,f);
- fread(&sp->y,sizeof(int),1,f);
- fread(&sp->size,sizeof(long),1,f);
- fread(&sp->format,sizeof(int),1,f);
- sp->data=new byte[sp->size];
- fread(sp->data,sizeof(byte),sp->size,f);
- fclose(f);
- return sp;
- }
- //关键是这个函数
- GLuint CreateTexture(char *name)
- {
- GLuint texture; /*HBITMAP hbmp; BITMAP bmp;
- //这些注释里的代码是用来读bmp并保存为压缩格式的
- hbmp=(HBITMAP)LoadImage(GetModuleHandle(0),
- name,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE);
- GetObject(hbmp,sizeof bmp,&bmp);
- glGenTextures(1,&texture);
- glBindTexture(GL_TEXTURE_2D,texture);
- glTexImage2D(GL_TEXTURE_2D,0,GL_COMPRESSED_RGB,bmp.bmWidth,bmp.bmHeight, 0,
- GL_BGR,GL_UNSIGNED_BYTE,bmp.bmBits);
- int size; int format; byte *img;
- glGetTexLevelParameteriv(GL_TEXTURE_2D,
- 0,GL_TEXTURE_INTERNAL_FORMAT,&format);
- glGetTexLevelParameteriv(GL_TEXTURE_2D,
- 0,GL_TEXTURE_COMPRESSED_IMAGE_SIZE,&size);
- glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
- glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
- img=new byte[size];
- glGetCompressedTexImageARB(GL_TEXTURE_2D, 0, img);
- savepic("ss",img,bmp.bmWidth,bmp.bmHeight,size,format);
- DeleteObject(hbmp);
- delete[] img;
- */
- //这是读已压缩好图片的
- S_PICTURE *sp=loadpic("ss");
- glGenTextures(1,&texture);
- glBindTexture(GL_TEXTURE_2D,texture);
- glCompressedTexImage2DARB(
- GL_TEXTURE_2D,0,sp->format,sp->x,sp->y,0,sp->size,sp->data);
- glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
- glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
- delete[] sp->data;
- delete[] sp;
- return texture;
- }
- LRESULT CALLBACK wndproc(HWND hwnd,UINT umsg,WPARAM wparam,LPARAM lparam)
- {
- switch (umsg)
- {
- case WM_DESTROY:
- wglMakeCurrent(0,0);
- wglDeleteContext(hrc);
- ReleaseDC(hwnd,hdc);
- PostQuitMessage(0);
- return 0;
- default:
- return DefWindowProc(hwnd,umsg,wparam,lparam);
- }
- }
- int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
- {
- HWND hwnd;MSG msg;WNDCLASS wc;
- ZeroMemory(&wc,sizeof wc);
- wc.hCursor=LoadCursor(0,IDC_ARROW);
- wc.hInstance=hInstance;
- wc.lpfnWndProc=wndproc;
- wc.lpszClassName="classname";
- RegisterClass(&wc);
- hwnd=CreateWindow("classname","windowname",WS_OVERLAPPED|WS_SYSMENU|WS_MINIMIZEBOX,GetSystemMetrics(0)/2-400,GetSystemMetrics(1)/2-300,800,600,0,0,hInstance,0);
- ZeroMemory(&pfd,sizeof pfd);
- pfd.nVersion=1;
- pfd.nSize=sizeof pfd;
- pfd.iPixelType=PFD_TYPE_RGBA;
- pfd.dwFlags=PFD_DOUBLEBUFFER|PFD_SUPPORT_OPENGL|PFD_DRAW_TO_WINDOW;
- pfd.cDepthBits=16;
- pfd.cColorBits=24;
- hdc=GetDC(hwnd);
- pixformat=ChoosePixelFormat(hdc,&pfd);
- SetPixelFormat(hdc,pixformat,&pfd);
- hrc=wglCreateContext(hdc);
- wglMakeCurrent(hdc,hrc);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluOrtho2D(0,800,0,600);
- glMatrixMode(GL_MODELVIEW);
- glewInit();
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_TEXTURE_2D);
- ShowWindow(hwnd,SW_SHOW);
- glClearColor(1,1,1,1);
- GLuint texture=CreateTexture("111.bmp");
- glEnable(GL_BLEND);
- while (1)
- {
- if (PeekMessage(&msg,0,0,0,PM_REMOVE))
- {
- if(msg.message==WM_QUIT)break;
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
- glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
- glLoadIdentity();
- glTranslatef(10,10,0);
- glBindTexture(GL_TEXTURE_2D,texture);
- glBegin(7);
- glTexCoord2f(0,0); glVertex2f(0,0);
- glTexCoord2f(1,0); glVertex2f(800,0);
- glTexCoord2f(1,1); glVertex2f(800,800);
- glTexCoord2f(0,1); glVertex2f(0,800);
- glEnd();
-
- SwapBuffers(hdc);
- }
- return msg.wParam;
- }
复制代码 |
|