本站首页    管理页面    写新日志    退出


«July 2025»
12345
6789101112
13141516171819
20212223242526
2728293031


公告

☆★☆★☆★☆★☆★☆
生活的点点记录,以及一些体会...........

喜欢是淡淡的爱,爱是深深的喜欢.

时间会见证一切.......................

欢迎大家指出错误,共同进步..........

期待中..............................

☆★☆★☆★☆★☆★☆


我的分类(专题)

日志更新

最新评论

留言板

链接

世纪音频

 

 


Blog信息
blog名称:
日志总数:162
评论数量:312
留言数量:0
访问次数:940224
建立时间:2005年5月17日




[work]opengl study Lesson-06纹理映射
原创空间

oceanblue 发表于 2008/11/16 22:37:53

#include <windows.h> #include <gl/glut.h>#include <stdio.h>#include <gl/GLAux.h>GLfloat xrot;GLfloat yrot;GLfloat zrot;GLuint texture[1]; HGLRC hRC = NULL;HDC   hDC = NULL;HWND  hWnd = NULL;HINSTANCE hInstance;bool keys[256];bool active = TRUE;bool fullscreen = TRUE;GLfloat rtri;LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);AUX_RGBImageRec* LoadBMP(char* Filename){ FILE* File = NULL; if(!Filename) {  return NULL; } File = fopen(Filename,"r"); if(File) {  fclose(File);  return auxDIBImageLoad(Filename); } return NULL; }int LoadGLTextures(){ int Status = FALSE; AUX_RGBImageRec* TextureImage[1]; memset(TextureImage, 0, sizeof(void*)*1); if(TextureImage[0] = LoadBMP("Data/NeHe.bmp")) {  Status = TRUE;  glGenTextures(1, &texture[0]);  glBindTexture(GL_TEXTURE_2D,texture[0]); } glTexImage2D(GL_TEXTURE_2D,0,3,TextureImage[0]->sizeX,TextureImage[0]->sizeY,0,GL_RGB,GL_UNSIGNED_BYTE,TextureImage[0]->data); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR); if(TextureImage[0]) {  if(TextureImage[0]->data)  {   free(TextureImage[0]->data);   }  free(TextureImage[0]); } return Status;}GLvoid ReSizeGLScene(GLsizei width, GLsizei height){ if( height == 0) {  height = 1;  } glViewport(0,0,width,height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); //设置视口的大小 gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f); glMatrixMode(GL_MODELVIEW); glLoadIdentity();}int InitGL(GLvoid){    if(!LoadGLTextures()) {  return FALSE; } glEnable(GL_TEXTURE_2D); glShadeModel(GL_SMOOTH); glClearColor(0.0f,0.0f,0.0f,0.5f); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); return TRUE;}int DrawGLScene(GLvoid){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity();    glTranslatef(0.0f,0.0f,-5.0f); glRotatef(xrot,1.0f,0.0f,0.0f); glRotatef(yrot,0.0f,1.0f,0.0f); glRotatef(zrot,0.0f,0.0f,1.0f); glBindTexture(GL_TEXTURE_2D,texture[0]); glBegin(GL_QUADS); // 前面 glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // 纹理和四边形的左下 glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // 纹理和四边形的右下 glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // 纹理和四边形的右上 glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // 纹理和四边形的左上 // 后面 glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // 纹理和四边形的右下 glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // 纹理和四边形的右上 glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // 纹理和四边形的左上 glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // 纹理和四边形的左下 // 顶面 glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // 纹理和四边形的左上 glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // 纹理和四边形的左下 glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // 纹理和四边形的右下 glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // 纹理和四边形的右上 // 底面 glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // 纹理和四边形的右上 glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // 纹理和四边形的左上 glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // 纹理和四边形的左下 glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // 纹理和四边形的右下 // 右面 glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // 纹理和四边形的右下 glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // 纹理和四边形的右上 glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // 纹理和四边形的左上 glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // 纹理和四边形的左下 // 左面 glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // 纹理和四边形的左下 glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // 纹理和四边形的右下 glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // 纹理和四边形的右上 glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // 纹理和四边形的左上 glEnd(); // 金字塔绘制结束 xrot+=0.3f; // X 轴旋转yrot+=0.2f; // Y 轴旋转zrot+=0.4f; // Z 轴旋转return true; // 继续运行 }GLvoid KillGLWindow(GLvoid){ if(fullscreen) {     ChangeDisplaySettings(NULL,0);  ShowCursor(TRUE);  } if(hRC) {  if(!wglMakeCurrent(NULL,NULL))  {   MessageBox(NULL,"释放DC或RC失败.","关闭错误",MB_OK | MB_ICONINFORMATION);  }  hRC=NULL; } if(hDC && !ReleaseDC(hWnd,hDC)) {  MessageBox(NULL,"释放窗口句柄失败.","关闭错误",MB_OK | MB_ICONINFORMATION);  hWnd = NULL; } if(!UnregisterClass("OpenG",hInstance)) {  MessageBox(NULL,"不能注销窗口类.","关闭错误",MB_OK | MB_ICONINFORMATION);  hInstance = NULL; } }BOOL CreateGLWindow(char* title, int width, int height,int bits,bool fullscreenflag){ GLuint PixelFormat; WNDCLASS wc; DWORD dwExStyle; DWORD dwStyle; RECT WindowRect; WindowRect.left = (long)0; WindowRect.right = (long)width; WindowRect.top = (long)0; WindowRect.bottom = (long)height; fullscreen = fullscreenflag; hInstance = GetModuleHandle(NULL); wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; wc.lpfnWndProc = (WNDPROC)WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon(NULL, IDI_WINLOGO); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = NULL; wc.lpszMenuName = NULL; wc.lpszClassName = "OpenG"; if(!RegisterClass(&wc)) {   MessageBox(NULL,"注册窗口失败","错误",MB_OK|MB_ICONEXCLAMATION);  return FALSE;  } if(fullscreen) {  DEVMODE dmScreenSettings;  memset(&dmScreenSettings,0,sizeof(dmScreenSettings));  dmScreenSettings.dmSize = sizeof(dmScreenSettings);  dmScreenSettings.dmPelsHeight = height;  dmScreenSettings.dmPelsWidth =  width;  dmScreenSettings.dmBitsPerPel = bits;  dmScreenSettings.dmFields = DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;  if(ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL) {  if(MessageBox(NULL,"全屏模式在当前显示卡上显示失败!\n使用窗口模式?","Nehe G",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)  {   fullscreen = FALSE;  }  else  {   MessageBox(NULL,"程序将被关闭","错误",MB_OK|MB_ICONSTOP);   return FALSE;  }  }     } if(fullscreen) {  dwExStyle = WS_EX_APPWINDOW;  dwStyle = WS_POPUP;  ShowCursor(FALSE); } else {   dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;  dwStyle = WS_OVERLAPPEDWINDOW; } AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle); if (!(hWnd=CreateWindowEx( dwExStyle,    // 扩展窗体风格  "OpenG",    // 类名字  title,     // 窗口标题  WS_CLIPSIBLINGS |   // 必须的窗体风格属性  WS_CLIPCHILDREN |   // 必须的窗体风格属性  dwStyle,    // 选择的窗体属性  0, 0,     // 窗口位置  WindowRect.right-WindowRect.left, // 计算调整好的窗口宽度  WindowRect.bottom-WindowRect.top, // 计算调整好的窗口高度  NULL,     // 无父窗口  NULL,     // 无菜单  hInstance,    // 实例  NULL)))     // 不向WM_CREATE传递任何东东 {  KillGLWindow();       // 重置显示区  MessageBox(NULL,"不能创建一个窗口设备描述表","错误",MB_OK|MB_ICONEXCLAMATION);  return FALSE;       // 返回 FALSE } static PIXELFORMATDESCRIPTOR pfd=     // /pfd 告诉窗口我们所希望的东东,即窗口使用的像素格式 {  sizeof(PIXELFORMATDESCRIPTOR),     // 上述格式描述符的大小   1,        // 版本号   PFD_DRAW_TO_WINDOW |      // 格式支持窗口   PFD_SUPPORT_OPENGL |      // 格式必须支持OpenGL   PFD_DOUBLEBUFFER,      // 必须支持双缓冲   PFD_TYPE_RGBA,       // 申请 RGBA 格式   bits,        // 选定色彩深度   0, 0, 0, 0, 0, 0,      // 忽略的色彩位   0,        // 无Alpha缓存   0,        // 忽略Shift Bit   0,        // 无累加缓存   0, 0, 0, 0,       // 忽略聚集位   16,        // 16位 Z-缓存 (深度缓存)   0,        // 无蒙板缓存   0,        // 无辅助缓存   PFD_MAIN_PLANE,       // 主绘图层   0,        // Reserved   0, 0, 0        // 忽略层遮罩 };  if (!(hDC=GetDC(hWnd)))       // 取得设备描述表了么? {  KillGLWindow();       // 重置显示区  MessageBox(NULL,"不能创建一种相匹配的像素格式","错误",MB_OK|MB_ICONEXCLAMATION);  return FALSE;       // 返回 FALSE } if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd)))    // Windows 找到相应的象素格式了吗? {  KillGLWindow();       // 重置显示区  MessageBox(NULL,"不能设置像素格式","错误",MB_OK|MB_ICONEXCLAMATION);  return FALSE;       // 返回 FALSE }  if(!SetPixelFormat(hDC,PixelFormat,&pfd))    // 能够设置象素格式么? {  KillGLWindow();       // 重置显示区  MessageBox(NULL,"不能设置像素格式","错误",MB_OK|MB_ICONEXCLAMATION);  return FALSE;       // 返回 FALSE } if (!(hRC=wglCreateContext(hDC)))     // 能否取得着色描述表? {  KillGLWindow();       // 重置显示区  MessageBox(NULL,"不能创建OpenGL渲染描述表","错误",MB_OK|MB_ICONEXCLAMATION);  return FALSE;       // 返回 FALSE } if(!wglMakeCurrent(hDC,hRC))      // 尝试激活着色描述表 {  KillGLWindow();       // 重置显示区  MessageBox(NULL,"不能激活当前的OpenGL渲然描述表","错误",MB_OK|MB_ICONEXCLAMATION);  return FALSE;       // 返回 FALSE } ShowWindow(hWnd,SW_SHOW);      // 显示窗口 SetForegroundWindow(hWnd);      // 略略提高优先级 SetFocus(hWnd);        // 设置键盘的焦点至此窗口 ReSizeGLScene(width, height);  if (!InitGL())        // 初始化新建的GL窗口 {  KillGLWindow();       // 重置显示区  MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);  return FALSE;       // 返回 FALSE }return TRUE;   }LRESULT CALLBACK WndProc( HWND hWnd,     // 窗口的句柄       UINT uMsg,     // 窗口的消息       WPARAM wParam,     // 附加的消息内容       LPARAM lParam)     // 附加的消息内容{  switch (uMsg)        // 检查Windows消息 { case WM_ACTIVATE:      // 监视窗口激活消息  {   if (!HIWORD(wParam))     // 检查最小化状态   {    active=TRUE;     // 程序处于激活状态   }   else   {    active=FALSE;     // 程序不再激活   }    return 0;      // 返回消息循环  } case WM_SYSCOMMAND:      // 系统中断命令  {   switch (wParam)      // 检查系统调用   {   case SC_SCREENSAVE:    // 屏保要运行?   case SC_MONITORPOWER:    // 显示器要进入节电模式?    return 0;     // 阻止发生   }   break;       // 退出  }  case WM_CLOSE:       // 收到Close消息?  {   PostQuitMessage(0);     // 发出退出消息   return 0;      // 返回  } case WM_KEYDOWN:      // 有键按下么?  {   keys[wParam] = TRUE;     // 如果是,设为TRUE   return 0;      // 返回  } case WM_KEYUP:       // 有键放开么?  {   keys[wParam] = FALSE;     // 如果是,设为FALSE   return 0;      // 返回  } case WM_SIZE:       // 调整OpenGL窗口大小  {   ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));  // LoWord=Width,HiWord=Height   return 0;      // 返回  } } // 向 DefWindowProc传递所有未处理的消息。 return DefWindowProc(hWnd,uMsg,wParam,lParam);} int WINAPI WinMain( HINSTANCE hInstance,    // 当前窗口实例       HINSTANCE hPrevInstance,    // 前一个窗口实例       LPSTR  lpCmdLine,    // 命令行参数       int  nCmdShow)    // 窗口显示状态{ MSG msg;        // Windowsx消息结构 BOOL done=FALSE;  // 提示用户选择运行模式 if (MessageBox(NULL,"你想在全屏模式下运行么?", "设置全屏模式",MB_YESNO|MB_ICONQUESTION)==IDNO) {  fullscreen=FALSE;      // FALSE为窗口模式 } // 创建OpenGL窗口 if (!CreateGLWindow("NeHe's OpenGL程序框架",640,480,16,fullscreen)) {  return 0;       // 失败退出 } while(!done)        // 保持循环直到 done=TRUE {  if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))   // 有消息在等待吗?  {    if (msg.message==WM_QUIT)    // 收到退出消息?   {    done=TRUE;     // 是,则done=TRUE   }   else       // 不是,处理窗口消息   {    TranslateMessage(&msg);    // 翻译消息    DispatchMessage(&msg);    // 发送消息   }  }  else        // 如果没有消息  {   // 绘制场景。监视ESC键和来自DrawGLScene()的退出消息   if (active)      // 程序激活的么?   {    if (keys[VK_ESCAPE])    // ESC 按下了么?    {     done=TRUE;    // ESC 发出退出信号    }    else      // 不是退出的时候,刷新屏幕    {     DrawGLScene();    // 绘制场景     SwapBuffers(hDC);   // 交换缓存 (双缓存)    }   }   if (keys[VK_F1])     // F1键按下了么?   {    keys[VK_F1]=FALSE;    // 若是,使对应的Key数组中的值为 FALSE    KillGLWindow();     // 销毁当前的窗口    fullscreen=!fullscreen;    // 切换 全屏 / 窗口 模式    // 重建 OpenGL 窗口    if (!CreateGLWindow("NeHe's OpenGL 程序框架",640,480,16,fullscreen))    {     return 0;    // 如果窗口未能创建,程序退出    }   }  } } // 关闭程序 KillGLWindow();        // 销毁窗口 return (msg.wParam);       // 退出程序}


阅读全文(1677) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.047 second(s), page refreshed 144753971 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号