要做HDR方面的研究,不想把时间花在平台搭建上,求一份简单的OpenGL漫游源码,室内室外的都可以,碰撞检测什么的都不需要,有个光源就可以了。
谢谢了。

解决方案 »

  1.   

    给你个代码。NeHe教程的.运行后,按W,S,A,D,(CS的移动键)可以 前后左右移动。
    #include <windows.h>
    #include <stdio.h>
    #include <gl\gl.h>
    #include <gl\glu.h>
    #include <gl\glaux.h>HGLRC hRC=NULL; // 永久着色描述表
    HDC hDC=NULL; // 私有GDI设备描述表
    HWND hWnd=NULL; // 保存我们的窗口句柄
    HINSTANCE hInstance; // 保存程序的实例bool keys[256]; // 用于键盘例程的数组
    bool active=TRUE; // 窗口的活动标志
    bool fullscreen=TRUE; // 全屏标志
    bool IsBlend = FALSE; // 是否开启混合BLEND
    bool bPut = FALSE; // 判断键盘B是否按下
    bool IsLight = TRUE; // 是否开启光照
    bool lPut = FALSE; // 判断键盘L是否按下
    // 纹理贴图路径
    char* ImageFilename = "2.bmp";GLfloat xrot; // X轴旋转增量
    GLfloat yrot; // Y轴旋转增量
    GLfloat zrot; // Z轴旋转增量
    GLfloat xspeed=0.1f;
    GLfloat yspeed=0.1f;GLfloat xMove = 0.0f; // 控制左右平移
    GLfloat zMove = -6.0f; // 屏幕距离坐标中心的深度
    GLuint texture[3]; // 存储3个的纹理
    GLuint filter = 1; // 用于选择纹理的滤波方式
    GLfloat LightAmbient[] = {0.5f,0.5f,0.5f,1.0f};
    GLfloat LightDiffuse[] = {1.0f,1.0f,1.0f,1.0f};
    GLfloat LightPosition[] = {0.0f,0.0f,2.0f,1.0f};void DrawGLPyramid(); //金字塔pyramid绘制函数
    void DrawGLCube(); //立方体cube绘制函数
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);//载入位图并转换成纹理
    int LoadGLTextures()
    {
    BOOL status = FALSE;
    AUX_RGBImageRec* TextImage[1];
    memset(TextImage,0,sizeof(void*)*1);
    if(TextImage[0] = auxDIBImageLoadA((LPCSTR)ImageFilename))
    {
    status = TRUE;
    glGenTextures(3,texture); //创建纹理
    // 设置GL_NEAREST滤波方式
    glBindTexture(GL_TEXTURE_2D,texture[0]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
    // 生成纹理
    glTexImage2D(GL_TEXTURE_2D,0,3,TextImage[0]->sizeX,TextImage[0]->sizeY,0,
    GL_RGB,GL_UNSIGNED_BYTE,TextImage[0]->data);
    // 设置GL_LINEAR滤波方式
    glBindTexture(GL_TEXTURE_2D,texture[1]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D,0,3,TextImage[0]->sizeX,TextImage[0]->sizeY,0,
    GL_RGB,GL_UNSIGNED_BYTE,TextImage[0]->data);
    // 设置MIPMAP滤波方式
    glBindTexture(GL_TEXTURE_2D,texture[2]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
    gluBuild2DMipmaps(GL_TEXTURE_2D,3,TextImage[0]->sizeX,TextImage[0]->sizeY,
    GL_RGB,GL_UNSIGNED_BYTE,TextImage[0]->data);
    }
    if(TextImage[0])
    {
    if(TextImage[0]->data)
    free(TextImage[0]->data);
    free(TextImage);
    }
    return status;
    }// 重置并初始化GL窗口大小函数
    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(); // 重置模型观察矩阵
    } //OpenGL初始化设置
    int InitGL(GLvoid)
    {
    glShadeModel(GL_SMOOTH); //启用阴影平滑
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f); //设置黑色背景
    glClearDepth(1.0f); //设置深度缓存
    glEnable(GL_DEPTH_TEST); //启用深度测试
    glDepthFunc(GL_LEQUAL); //深度测试类型
    //设置高精度透视
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
    // 纹理
    LoadGLTextures(); //载入位图并转换成纹理
    glEnable(GL_TEXTURE_2D); //启用纹理映射
    // 设置光源
    glLightfv(GL_LIGHT1,GL_AMBIENT,LightAmbient); //环境光
    glLightfv(GL_LIGHT1,GL_DIFFUSE,LightDiffuse); //漫射光
    glLightfv(GL_LIGHT1,GL_POSITION,LightPosition); //光源位置
    glEnable(GL_LIGHT1); //启用光源GL_LIGHT1
    glEnable(GL_LIGHTING);
    // 混合BLEND
    glColor4f(1.0f,1.0f,1.0f,0.5f);   // 全亮度, 50% Alpha 混合
    glBlendFunc(GL_SRC_ALPHA,GL_ONE);  // 基于源象素alpha通道值的半透明混合函数
    return TRUE;
    }// 从这里开始进行所有的绘制
    int DrawGLScene(GLvoid)
    {
    //清除屏幕和深度缓存
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity(); //重置当前的模型观察矩阵
    //画金字塔pyramid
    glTranslatef(-1.5f+xMove, 0.0f, zMove);
    glRotatef(xrot,0.0f,-1.0f,0.0f);
    DrawGLPyramid(); //画立方体cube
    glLoadIdentity();
    glTranslatef(1.5f+xMove, 0.0f, zMove);
    glRotatef(yrot,1.0f,1.0f,0.0f);
    DrawGLCube(); xrot +=xspeed;
    yrot -=yspeed;
    return TRUE;
    }//正常销毁窗口
    GLvoid KillGLWindow(GLvoid) 
    {
    if (fullscreen) 
    {
    ChangeDisplaySettings(NULL,0); //切换回桌面
    ShowCursor(TRUE); //显示鼠标
    }
    if (hRC) 
    {
    if (!wglMakeCurrent(NULL,NULL)) // 释放RC和DC
    {
    MessageBox(NULL,"Release Of DC And RC Failed.",
    "SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
    }
    if (!wglDeleteContext(hRC)) 
    {
    MessageBox(NULL,"Release Rendering Context Failed.",
    "SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
    }
    hRC = NULL;
    }
    if (hDC && !ReleaseDC(hWnd,hDC))         // 释放 DC
    {
    MessageBox(NULL,"Release Device Context Failed.",
    "SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
    hDC=NULL; 
    }
    if (hWnd && !DestroyWindow(hWnd))        // 销毁窗口
    {
    MessageBox(NULL,"Could Not Release hWnd.",
    "SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
    hWnd=NULL;
    }
    if (!UnregisterClass("OpenGL",hInstance)) // 注销类
    {
    MessageBox(NULL,"Could Not Unregister Class.",
    "SHUTDOWN ERROR",MB_OK | MB_ICONINFORMATION);
    hInstance=NULL; 
    }
    }
      

  2.   

    BOOL CreateGLWindow(char* title, int width, int height, int bits, bool fullscreenflag)
    {
    GLuint PixelFormat; // 保存查找匹配的结果
    WNDCLASS wc; // 窗口类结构
    DWORD dwStyle; // 窗口风格
    DWORD dwExStyle; // 扩展窗口风格
    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 = "OpenGL"; // 窗口类名 if (!RegisterClass(&wc))                // 注册窗口类
    {
    MessageBox(NULL,"Failed To Register The Window Class.","ERROR",MB_OK|MB_ICONEXCLAMATION);
    return FALSE;
    }
    if (fullscreen)
    {
    DEVMODE dmScreenSettings; // 设备模式
    //分配内存
    memset(&dmScreenSettings,0,sizeof(dmScreenSettings)); 
    dmScreenSettings.dmSize=sizeof(dmScreenSettings);
    dmScreenSettings.dmPelsWidth = width; // 所选屏幕宽度
    dmScreenSettings.dmPelsHeight = height; // 所选屏幕高度
    dmScreenSettings.dmBitsPerPel = bits; // 每像素所选颜色深度
    dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT; // 尝试设置显示模式并返回结果。注: CDS_FULLSCREEN 移去了状态条。
    if (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)
    {
    // 若模式失败,提供两个选项:退出或在窗口内运行。
    if (MessageBox(NULL,"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?","NeHe GL",MB_YESNO|MB_ICONEXCLAMATION)==IDYES)

    //如果用户选择窗口模式,变量fullscreen 的值变为FALSE,程序继续运行
    fullscreen=FALSE;
    }
    else
    {
    // Pop Up A Message Box Letting User Know The Program Is Closing.
    MessageBox(NULL,"Program Will Now Close.","ERROR",MB_OK|MB_ICONSTOP);
    return FALSE;       //退出并返回 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,
    "OpenGL",
    title,
    WS_CLIPSIBLINGS |  
    WS_CLIPCHILDREN |
    dwStyle,
    0, 0,
    WindowRect.right-WindowRect.left,
    WindowRect.bottom-WindowRect.top,
    NULL,
    NULL,
    hInstance,
    NULL))) 
    {
    KillGLWindow();  // 重置显示区
    MessageBox(NULL,"Window Creation Error.","ERROR",MB_OK|MB_ICONEXCLAMATION);
    return FALSE; 
    }
    static PIXELFORMATDESCRIPTOR 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, // 忽略聚集位
    32, // 16位 Z-缓存 (深度缓存)
    0, // 无模板缓存
    0, // 无辅助缓存
    PFD_MAIN_PLANE, // 主绘图层
    0, // 保留
    0, 0, 0 // 忽略层遮罩
    };  if (!(hDC=GetDC(hWnd))) //取设备描述表
    {
    KillGLWindow();
    MessageBox(NULL,"Can't Create A GL Device Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
    return FALSE;
    }
    if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd)))    // 寻找相应的象素格式
    {
    KillGLWindow();
    MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
    return FALSE;
    }
    if(!SetPixelFormat(hDC,PixelFormat,&pfd))  // 设置象素格式
    {
    KillGLWindow();
    MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
    return FALSE;
    }
    if (!(hRC=wglCreateContext(hDC)))                    // 取着色描述表
    {
    KillGLWindow();
    MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
    return FALSE;
    }
    if(!wglMakeCurrent(hDC,hRC))                         // 激活着色描述表
    {
    KillGLWindow();
    MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
    return FALSE;
    } ShowWindow(hWnd,SW_SHOW);
    SetForegroundWindow(hWnd); // 略略提高优先级
    SetFocus(hWnd);
    ReSizeGLScene(width, height); // 设置透视GL屏幕
    if (!InitGL())    // 初始化新建的GL窗口
    {
    KillGLWindow();
    MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);
    return FALSE;
    } return TRUE;
    }LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
    switch (uMsg) 
    {
    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:
    PostQuitMessage(0); 
    return 0;/*******如果键盘有键释放,通过读取wParam的信息可以找出键值。
    然后将键盘数组keys[ ]相应的数组组成员的值设为FALSE。这样
    查找key[ ]来得知什么键被按下,什么键被释放了。键盘上的每
    个键都可以用0-255之间的一个数来代表。举例来说,当我们
    按下40所代表的键时,keys[40]的值将被设为TRUE。放开的话,
    它就被设为FALSE。这也是key数组的原理。********************/
    case WM_KEYDOWN: 
    keys[wParam] = TRUE; 
    return 0; 
    case WM_KEYUP: 
    keys[wParam] = FALSE; 
    return 0;
    case WM_SIZE:
    ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));
    return 0;
    // case WM_LBUTTONDOWN:
    // glEnable(GL_LIGHTING);
    // case WM_RBUTTONDOWN:
    // glDisable(GL_LIGHTING);
    } return DefWindowProc(hWnd,uMsg,wParam,lParam);
    }
      

  3.   


    int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
    {
    MSG msg;
    BOOL done=TRUE; //用来退出循环的变量 if (MessageBox(NULL,"Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",MB_YESNO|MB_ICONQUESTION)==IDNO)
    {
    fullscreen=FALSE; //窗口模式
    } // 创建OpenGL窗口
    if (!CreateGLWindow("OpenGL Framework",800,600,16,fullscreen))
    {
    return 0; // 失败退出
    } while(done) // 保持循环直到 done=FALSE
    {
    if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) //取消息
    {
    if (msg.message==WM_QUIT)
    done = FALSE;
    else
    {
    TranslateMessage(&msg); //翻译消息
    DispatchMessage(&msg); //发送消息到处理函数
    }
    }
    else //无消息则绘制OPENGL场景
    {
    if (active)
    {
    if (keys[VK_ESCAPE])
    done = FALSE;
    else
    {
    DrawGLScene(); // 绘制
    SwapBuffers(hDC); // 交换缓存
    } // F1键在全屏模式和窗口模式间切换
    if(keys[VK_F1])
    {
    keys[VK_F1]=FALSE;
    KillGLWindow();
    fullscreen=!fullscreen;
    if (!CreateGLWindow("OpenGL Framework",800,600,16,fullscreen))
    {return 0;}
    }
    // 滤波方式选择
    if(keys[VK_F5])
    filter = 0;
    if(keys[VK_F6])
    filter = 1;
    if(keys[VK_F7])
    filter = 2;
    // 屏幕深度
    if(keys['W'])
    zMove+=0.01f;
    if(keys['S'])
    zMove-=0.01f;
    if(keys['A'])
    xMove+=0.01f;
    if(keys['D'])
    xMove-=0.01f;
    // 旋转速度
    if(keys[VK_SUBTRACT])
    { xspeed -=0.01f; yspeed -=0.01f; }
    if(keys[VK_ADD])
    { xspeed +=0.01f; yspeed +=0.01f; }
    // 打开关闭混合GL_BLEND
    if(keys['B'] && !bPut)
    {
    bPut = TRUE;
    if(!IsBlend)
    {
    IsBlend = TRUE;
    glEnable(GL_BLEND);
    glDisable(GL_DEPTH_TEST);
    }
    else
    {
    IsBlend = FALSE;
    glDisable(GL_BLEND);
    glEnable(GL_DEPTH_TEST);
    }
    }
    else if(!keys['B'])
    bPut = FALSE;
    // 打开关闭光照GL_LIGHTING
    if(keys['L'] && !lPut)
    {
    lPut = TRUE;
    if(!IsLight)
    {
    IsLight = TRUE;
    glEnable(GL_LIGHTING);
    }
    else
    {
    IsLight = FALSE;
    glDisable(GL_LIGHTING);
    }
    }
    else if(!keys['L'])
    lPut = FALSE;
    }
    }
    }
    KillGLWindow();
    return (msg.wParam);
    }void DrawGLPyramid()
    {
    glBegin(GL_TRIANGLES);
    //前侧面
    glColor3f(1.0f,0.0f,0.0f);
    glVertex3f(0.0f,1.0f,0.0f);
    glColor3f(0.0f,1.0f,0.0f);
    glVertex3f(-1.0f,-1.0f,1.0f);
    glColor3f(0.0f,0.0f,1.0f);
    glVertex3f(1.0f,-1.0f,1.0f);
    //右侧面
    glColor3f(1.0f,0.0f,0.0f);
    glVertex3f(0.0f,1.0f,0.0f);
    glColor3f(0.0f,0.0f,1.0f);
    glVertex3f(1.0f,-1.0f,1.0f);
    glColor3f(0.0f,1.0f,0.0f);
    glVertex3f(1.0f,-1.0f,-1.0f);
    //后侧面
    glColor3f(1.0f,0.0f,0.0f);
    glVertex3f(0.0f,1.0f,0.0f);
    glColor3f(0.0f,1.0f,0.0f);
    glVertex3f(1.0f,-1.0f,-1.0f);
    glColor3f(0.0f,0.0f,1.0f);
    glVertex3f(-1.0f,-1.0f,-1.0f);
    //左侧面
    glColor3f(1.0f,0.0f,0.0f);
    glVertex3f(0.0f,1.0f,0.0f);
    glColor3f(0.0f,0.0f,1.0f);
    glVertex3f(-1.0f,-1.0f,-1.0f);
    glColor3f(0.0f,1.0f,0.0f);
    glVertex3f(-1.0f,-1.0f,1.0f);
    glEnd();
    }void DrawGLCube()
    {
    glBindTexture(GL_TEXTURE_2D, texture[filter]);
    glBegin(GL_QUADS);
    //前面
    glNormal3f(0.0f,0.0f,1.0f); //法线
    glTexCoord2f(0.0f,1.0f);
    glVertex3f(-1.0f,1.0f,1.0f); //左上点
    glTexCoord2f(1.0,1.0f);
    glVertex3f(1.0f,1.0f,1.0f); //右上点
    glTexCoord2f(1.0f,0.0f);
    glVertex3f(1.0f,-1.0f,1.0f); //右下点
    glTexCoord2f(0.0f,0.0f);
    glVertex3f(-1.0f,-1.0f,1.0f); //左下点
    //后面
    glNormal3f(0.0f,0.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.0,1.0f);
    glVertex3f(1.0f,-1.0f,-1.0f);
    glTexCoord2f(0.0f,1.0f);
    glVertex3f(-1.0f,-1.0f,-1.0f);
    //上面
    glNormal3f(0.0f,1.0f,0.0f);
    glTexCoord2f(0.0f,1.0f);
    glVertex3f(-1.0f,1.0f,-1.0f);
    glTexCoord2f(1.0,1.0f);
    glVertex3f(1.0f,1.0f,-1.0f);
    glTexCoord2f(1.0f,0.0f);
    glVertex3f(1.0f,1.0f,1.0f);
    glTexCoord2f(0.0f,0.0f);
    glVertex3f(-1.0f,1.0f,1.0f);
    //下面
    glNormal3f(0.0f,-1.0f,0.0f);
    glTexCoord2f(1.0,1.0f);
    glVertex3f(-1.0f,-1.0f,-1.0f);
    glTexCoord2f(1.0f,0.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);
    //左面
    glNormal3f(-1.0f,0.0f,0.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);
    //右面
    glNormal3f(1.0f,0.0f,0.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);
    glEnd();
    }