⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 text.txt

📁 立方体纹理贴图
💻 TXT
字号:
#include <windows.h>
#include<stdio.h>
#include<gl/gl.h>
#include<gl/glu.h>
#include<gl/glaux.h>

//变量声明
HWND   hwnd;
HDC hDC;
HGLRC hRC=NULL;    //定义渲染环境
HINSTANCE hInstance; //得到程序的实例RECT rect;
int sw=640;
int sh=480;
GLfloat aspect;
bool FullScreen=1;

//第6节添加的变量
GLfloat xrot;
GLfloat yrot;
GLfloat zrot;GLuint texture[1];
#pragma comment(lib,"opengl32.lib")
#pragma comment(lib,"glu32.lib")
#pragma comment(lib,"glaux.lib")
//第6节新添加的函数
AUX_RGBImageRec *LoadBMP(char *Filename)   //加载一个位图图像
{
//FILE
FILE *File=NULL;
if(!Filename)
   return NULL;File=fopen(Filename,"r"); //读取文件if(File) //文件存在
{
   fclose(File);
   return auxDIBImageLoad(Filename);
}
return NULL;//不存在返回空;
}
//第6节新添加的函数
int LoadGLTextures() //将加载的图片转换成纹理
{
int Status=FALSE;
AUX_RGBImageRec *TextureImage[1];
memset(TextureImage,0,sizeof(void*)*1);
if(TextureImage[0]=LoadBMP("Data/1.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;
}void SceneInit(int w,int h)
{
//第6节新添加的代码
if(!LoadGLTextures())
   return ;glEnable(GL_TEXTURE_2D);
//新添加结束
glShadeModel(GL_SMOOTH);
glClearColor(0.0,0.0,0.0,0.5);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
}GLvoid SceneResizeViewport(GLsizei w,GLsizei h)
{
if(h==0)
   h=1;aspect=(GLfloat)w/(GLfloat)h;
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,aspect,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
int SceneShow(GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

glTranslatef(0.0f,0.0f,-7.0f);
//第6节新添加的代码
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(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(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(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(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(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();
glColor3f(1.0,1.0,1.0);
auxWireCube(1.0);
/**/
xrot+=0.3f;
yrot+=0.2f;
zrot+=0.4f;
return TRUE;
}
bool ChangeResolution(int w,int h,int bitdepth)
{
DEVMODE devMode;
int modeSwitch;
int closeMode=0;
EnumDisplaySettings(NULL,closeMode,&devMode);
devMode.dmBitsPerPel=bitdepth;
devMode.dmPelsWidth=w;
devMode.dmPelsHeight=h;
devMode.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;
modeSwitch=ChangeDisplaySettings(&devMode,CDS_FULLSCREEN);
if(modeSwitch==DISP_CHANGE_SUCCESSFUL)
{
   return true;
}
else
{
    ChangeDisplaySettings(NULL,0);
    return false;
}
}void EnableOpenGL()
{
PIXELFORMATDESCRIPTOR pfd;
int iFormat;
hDC=GetDC(hwnd);
ZeroMemory(&pfd,sizeof(pfd));
pfd.nSize=sizeof(pfd);
pfd.nVersion=1;
pfd.dwFlags=PFD_DRAW_TO_WINDOW|
PFD_SUPPORT_OPENGL|
PFD_DOUBLEBUFFER;
pfd.iPixelType=PFD_TYPE_RGBA;
pfd.cColorBits=16;
pfd.cDepthBits=16;
pfd.iLayerType=PFD_MAIN_PLANE;
iFormat=ChoosePixelFormat(hDC,&pfd);
SetPixelFormat(hDC,iFormat,&pfd);
hRC=wglCreateContext(hDC);
wglMakeCurrent(hDC,hRC);
}
void DisableOpenGL()
{
wglMakeCurrent(NULL,NULL);
wglDeleteContext(hRC);
ReleaseDC(hwnd,hDC);
}
////////////////////////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                     PSTR szCmdLine, int iCmdShow)
{
      static TCHAR szAppName[] = TEXT ("HelloWin") ;
      MSG           msg ;
      WNDCLASS      wndclass ;
      bool bQuit=false;if(MessageBox(NULL,"是否选择全屏显示模式?","全屏方式运行?",MB_YESNO|MB_ICONQUESTION)==IDNO)
     FullScreen=0;      wndclass.style          = CS_HREDRAW | CS_VREDRAW ;
      wndclass.lpfnWndProc    = WndProc ;
      wndclass.cbClsExtra     = 0 ;
      wndclass.cbWndExtra     = 0 ;
      wndclass.hInstance      = hInstance ;
      wndclass.hIcon          = LoadIcon (NULL, IDI_APPLICATION) ;
      wndclass.hCursor        = LoadCursor (NULL, IDC_ARROW) ;
      wndclass.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH) ;
      wndclass.lpszMenuName   = NULL ;
      wndclass.lpszClassName = szAppName ;      if (!RegisterClass (&wndclass))
      {
           MessageBox (NULL, TEXT ("This program requires Windows NT!"),
                       szAppName, MB_ICONERROR) ;
           return 0 ;
      }
?????
   if(FullScreen)
{
    ChangeResolution(640,480,16);   //全屏改变分辨率
   hwnd=CreateWindow(szAppName,"旋转彩色的三角形和正方形",????
        WS_POPUP|WS_CLIPSIBLINGS|WS_VISIBLE,
        0,0,
        GetSystemMetrics(SM_CXSCREEN),
        GetSystemMetrics(SM_CYSCREEN),
        NULL,NULL,
        hInstance,
        NULL);
}
else
{
   hwnd=CreateWindow(szAppName,"彩色的三角形和正方形",
        WS_TILEDWINDOW|WS_VISIBLE,
        GetSystemMetrics(SM_CXSCREEN)/2-sw/2,
        GetSystemMetrics(SM_CYSCREEN)/2-sh/2,
        sw,sh,
        NULL,NULL,
        hInstance,
        NULL);
   ChangeDisplaySettings(NULL,0);
}      ShowWindow (hwnd, iCmdShow) ;
      UpdateWindow (hwnd) ;   EnableOpenGL();
SceneInit(sw,sh);if(!FullScreen)
{
   GetWindowRect(hwnd,&rect);
   sw=rect.right-rect.left;
   sh=rect.bottom-rect.top;
   if(sw>0&&sh>0)
    SceneResizeViewport(sw,sh);
}
else
{
   SceneResizeViewport(GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN));
}
/*?????
      while (GetMessage (&msg, NULL, 0, 0))
      {
           TranslateMessage (&msg) ;
           DispatchMessage (&msg) ;
      }
*///消息循环
while(!bQuit)
{
   if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
    if(msg.message==WM_QUIT)
     bQuit=TRUE;
    else
    {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
    }
   else
   {
    //OpenGL动画
    SceneShow();
    SwapBuffers(hDC);
   }
}
DisableOpenGL();
ShowWindow(hwnd,SW_HIDE);
DestroyWindow(hwnd);
ChangeDisplaySettings(NULL,0);
     return msg.wParam ;
}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
?????
    switch (message)
     {
      case WM_CREATE:
   GetWindowRect(hwnd,&rect);
   sw=rect.right-rect.left;
   sh=rect.bottom-rect.top;
   SceneResizeViewport(sw,sh);
   return 0;
   case WM_SIZE:
   if(!FullScreen)
   {
    GetWindowRect(hwnd,&rect);
    sw=rect.right-rect.left;
    sh=rect.bottom-rect.top;
    if(sw>0 && sh>0)
     SceneResizeViewport(sw,sh);
   }
   else
   {
    SceneResizeViewport(GetSystemMetrics(SM_CXSCREEN),
    GetSystemMetrics(SM_CYSCREEN));
   }
   return 0;
??
case WM_CLOSE:
   ShowWindow(hwnd,SW_HIDE);
   PostQuitMessage(0);
   return 0;
case WM_DESTROY:
   return 0;??????????
case WM_KEYDOWN:
   switch(wParam)
   {
    case VK_ESCAPE:
     PostMessage(hwnd,WM_CLOSE,0,0);
     break;
   }
   return 0;
default:
   return DefWindowProc(hwnd,message,wParam,lParam);
      }
     // return DefWindowProc (hwnd, message, wParam, lParam) ;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -