(此节内容对应NEHE教程第24课)
应用.tga文件作为纹理数据来源进行纹理贴图
.tga图像文件数据格式:
0~~11 | 头信息 | |
12~13 | 图像宽度 | byte[13]*256+byte[12] |
14~15 | 图像高度 | byte[15]*256+byte[14] |
16 | 图像每像素存储占用位(bit)数 | 24或32 |
18~end | 图片数据域 数据格式为GBRA,特殊需要需要转换 |
图片总大小=图像宽度*图像高度*(图像每像素存储占用位(bit)数/8) |
OpenGL可扩展性描述 | |
glGetString(GL_RENDERER) | 获取OpenGL相关信息 |
GL_VENDOR | 销售商 |
GL_RENDERER | OpenGL的实现组织 |
GL_VERSION | 当前版本 |
GL_EXTENSIONS | OpenGL扩展名 |
剪裁区域设置
glScissor函数用来设置剪裁区域,如果启用了GL_SCISSOR_TEST,绘制的内容只能在剪裁区域中显示。
glScissor(x,y,width,heigth);
glEnable(GL_SCISSOR_TEST);
应用剪裁区域 未应用剪裁区域
#include "header.h" int scroll; int maxtokens; int swidth; int sheight; GLuint base; typedef struct { GLubyte *imageData; GLuint bpp; GLuint width; GLuint height; GLuint texID; } TextureImage; TextureImage textures[1]; bool LoadTGA(TextureImage *texture, char *filename) { GLubyte TGAheader[12]={0,0,2,0,0,0,0,0,0,0,0,0}; GLubyte TGAcompare[12]; GLubyte header[6]; GLuint bytesPerPixel; GLuint imageSize; GLuint temp; GLuint type=GL_RGBA; FILE *file = fopen(filename, "rb"); if( file==NULL || fread(TGAcompare,1,sizeof(TGAcompare),file)!=sizeof(TGAcompare) || memcmp(TGAheader,TGAcompare,sizeof(TGAheader))!=0 || fread(header,1,sizeof(header),file)!=sizeof(header)) { if (file == NULL) return false; else { fclose(file); return false; } } texture->width = header[1] * 256 + header[0]; texture->height = header[3] * 256 + header[2]; if( texture->width <=0 || texture->height <=0 || (header[4]!=24 && header[4]!=32)) { fclose(file); return false; } texture->bpp = header[4]; bytesPerPixel = texture->bpp/8; imageSize = texture->width*texture->height*bytesPerPixel; texture->imageData=(GLubyte *)malloc(imageSize); if( texture->imageData==NULL || fread(texture->imageData, 1, imageSize, file)!=imageSize) { if(texture->imageData!=NULL) free(texture->imageData); fclose(file); return false; } for(GLuint i=0; i<int(imageSize); i+=bytesPerPixel) { temp=texture->imageData[i]; texture->imageData[i] = texture->imageData[i + 2]; texture->imageData[i + 2] = temp; } fclose (file); // Build A Texture From The Data glGenTextures(1, &texture[0].texID); glBindTexture(GL_TEXTURE_2D, texture[0].texID); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); if (texture[0].bpp==24) { type=GL_RGB; } glTexImage2D(GL_TEXTURE_2D, 0, type, texture[0].width, texture[0].height, 0, type, GL_UNSIGNED_BYTE, texture[0].imageData); return true; } GLvoid BuildFont(GLvoid) { base=glGenLists(256); glBindTexture(GL_TEXTURE_2D, textures[0].texID); for (int loop1=0; loop1<256; loop1++) { float cx=float(loop1%16)/16.0f; float cy=float(loop1/16)/16.0f; glNewList(base+loop1,GL_COMPILE); glBegin(GL_QUADS); glTexCoord2f(cx,1.0f-cy-0.0625f); glVertex2d(0,16); glTexCoord2f(cx+0.0625f,1.0f-cy-0.0625f); glVertex2i(16,16); glTexCoord2f(cx+0.0625f,1.0f-cy-0.001f); glVertex2i(16,0); glTexCoord2f(cx,1.0f-cy-0.001f); glVertex2i(0,0); glEnd(); glTranslated(14,0,0); glEndList(); } } GLvoid KillFont(GLvoid) { glDeleteLists(base,256); } GLvoid glPrint(GLint x, GLint y, int set, const char *fmt, ...) { char text[1024]; va_list ap; if (fmt == NULL) return; va_start(ap, fmt); vsprintf(text, fmt, ap); va_end(ap); if (set>1) { set=1; } glEnable(GL_TEXTURE_2D); glLoadIdentity(); glTranslated(x,y,0); glListBase(base-32+(128*set)); glScalef(1.0f,2.0f,1.0f); glCallLists(strlen(text),GL_UNSIGNED_BYTE, text); glDisable(GL_TEXTURE_2D); } void ReSizeGLScene(GLsizei width, GLsizei height) { swidth=width; sheight=height; if (height==0) { height=1; } glViewport(0,0,width,height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0f,640,480,0.0f,-1.0f,1.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } int InitGL(void) { if (!LoadTGA(&textures[0],"Data/Font.TGA")) { return false; } BuildFont(); glShadeModel(GL_SMOOTH); glClearColor(0.0f, 0.0f, 0.0f, 0.5f); glClearDepth(1.0f); glBindTexture(GL_TEXTURE_2D, textures[0].texID); return TRUE; } void DrawGLScene(void) { char *token; int cnt=0; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(1.0f,0.5f,0.5f); glPrint(50,16,1,"Renderer"); glPrint(80,48,1,"Vendor"); glPrint(66,80,1,"Version"); glColor3f(1.0f,0.7f,0.4f); glPrint(200,16,1,(char *)glGetString(GL_RENDERER)); glPrint(200,48,1,(char *)glGetString(GL_VENDOR)); glPrint(200,80,1,(char *)glGetString(GL_VERSION)); glColor3f(0.5f,0.5f,1.0f); glPrint(192,432,1,"NeHe Productions"); glLoadIdentity(); glColor3f(1.0f,1.0f,1.0f); glBegin(GL_LINE_STRIP); glVertex2d(639,417); glVertex2d( 0,417); glVertex2d( 0,480); glVertex2d(639,480); glVertex2d(639,128); glEnd(); glBegin(GL_LINE_STRIP); glVertex2d( 0,128); glVertex2d(639,128); glVertex2d(639, 1); glVertex2d( 0, 1); glVertex2d( 0,417); glEnd(); glScissor(1 ,int(0.135416f*sheight),swidth-2,int(0.597916f*sheight)); glEnable(GL_SCISSOR_TEST); char* text=(char *)malloc(strlen((char *)glGetString(GL_EXTENSIONS))+1); strcpy (text,(char *)glGetString(GL_EXTENSIONS)); token=strtok(text," "); while(token!=NULL) { cnt++; if (cnt>maxtokens) { maxtokens=cnt; } glColor3f(0.5f,1.0f,0.5f); glPrint(0,96+(cnt*32)-scroll,0,"%i",cnt); glColor3f(1.0f,1.0f,0.5f); glPrint(50,96+(cnt*32)-scroll,0,token); token=strtok(NULL," "); } glDisable(GL_SCISSOR_TEST); free(text); glFlush(); } void keyboard(unsigned char key,int x,int y) { switch (key) { case 'W': if (scroll>0) { scroll-=2; } glutPostRedisplay(); break; case 'S': if (scroll<32*(maxtokens-9)) { scroll+=2; } glutPostRedisplay(); break; } } int main(int argc,char **argv) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH); glutInitWindowSize(800,600); glutInitWindowPosition(100,100); glutCreateWindow("区域剪裁和TGA图像文件的加载"); InitGL(); glutDisplayFunc(DrawGLScene); glutKeyboardFunc(keyboard); glutReshapeFunc(ReSizeGLScene); glutMainLoop(); }
相关推荐
OpenGL教程第33课TGA文件.rar
18:二次几何体 19:粒子系统 20:蒙板 21:线的游戏 22:凹凸映射 23:球面映射 24:扩展 25:变形 26:反射 27:影子 28:贝塞尔曲面 29:Blt函数 30:碰撞检测 31:模型加载 32:拾取游戏 33:TGA文件 34:地形 ...
易语言OpenGL教程第33课TGA文件源码,OpenGL教程第33课TGA文件,LoadGLTextures,ReSizeGLScene,InitGL,DrawGLScene,KillGLWindow,CreateGLWindow,WndProc,WinMain,HIWORD,LOWORD,LoadTGA,LoadUncompressedTGA,...
本来想直接使用《OpenGL超级宝典》里面现成的TGA文件载入函数,然后修改成一个类,但遗憾的是,书上的代码并不适合于所有的TGA文件。有些由GIMP和Photoshop创建TGA文件无法载入。这真是让我感到不爽。好在自己有了几...
该项目实现了MD2动画文件的加载,限于文件大小,不能提供opengl库和完整的工程,只提供源码和dll文件。
现代OpenGL+Qt学习笔记之二:程序框架http://blog.csdn.net/chaojiwudixiaofeixia/article/details/77917697源码。
对应的OpenGL学习博客:...此代码仅用于OpenGL入门学习。PS:可能会有点卡主要是因为:①使用的地面模型是高模(几十万个顶点)②使用的天空盒贴图是2040x2048的超大贴图6张;没办法只找到这些资源,所以只能将就着用了
如何从一个文件中读取模型数据。通过该例子,你将学会如何从文件加载3D模型,并且平滑的从一个模型变换为另一个模型。
OpenGL中带有Code :: Blocks的目标文件加载器 Code::Blocks 수정하였다。 준비사항 Code::Blocks 설치(윈도우기준으로설명) 。이브러리를설치한다。 glfw3.h glew.h gl.h 。이브러리설치다음과다。 。이브러리...
NEHE的OPENGL教程 第42课 多视窗口… NEHE的OPENGL教程 第42课 多视窗口… NeHe的OPENGL中文教程:第41课 体… NeHe的OPENGL中文教程:第40课 绳… NeHe的OPENGL中文教程:第39课 物… ...怎样开始学习OpenGL
程序功能:通过glx将x11和sdl创建的窗口联系起来(不是sdl-opengl的东西)供opengl渲染显示的小程序,其中bmp的是通过分析bmp文件格式读取位图数据和sdl_image两种方式加载,Png和Jpg文件格式比较复杂,所以直接使用...
Qt6.2.0 通过opengl库加载多个obj文件显示,效果和教程看我博客
使用VS2008和opengl编写的全景图像拼接程序,可以完成图像拼接的立体显示,可以旋转,缩放,控制键为空格,和上下左右的四个箭头键,以及上下翻页两个键。包括立方体,圆柱面和球面全景图的生成,附有测试图片。
现代OpenGL+Qt学习笔记之四:使用Uniform变量实现对模型的旋转http://blog.csdn.net/chaojiwudixiaofeixia/article/details/77944140源码
OpenGL入门学习之十四——OpenGL版本和OpenGL扩展.pdf
该工程采用Qt3D模块加载obj模型文件,最终将模型显示在窗口中。 环境:qt:5.9.6 系统:win10 64Bit obj文件:自带一份
ios应用源码之通过opengl加载图像 drawpixels .
基于Qt+OpenGL 实现的3D模型obj文件加载以及纹理贴图,未使用第三方库,根据obj文件的格式,逐行解析并读取,加载到顶点缓冲区中,适合学习OBJ模型加载的同学参考。
实验三 实验四:OpenGL的 交互绘制
基于MFC的OpenGL程序,读入.3ds文件,可供大家参考