创建OpenGL窗口

来源:互联网 发布:javascript 尚学堂 编辑:程序博客网 时间:2024/04/27 22:24

1,新建一个类(GLWindow)
2,头文件中 include 文件:glew.h、glfw3.h, 由于glew是静态库需要定义宏 #define GLEW_STATIC 1
3,具体代码如下:

class GLWindow{public:    GLWindow();    ~GLWindow();    //创建窗口    /**     *@param width:窗口的宽度     *@param height:窗口的高度     *@param title:标题     */    void createWindow(int width, int height, const char* title);    //关闭窗口    void closeWindow();    //是否已经关闭窗口    bool windowShouldClose();    //交换前后端渲染缓冲    void pollEvents();private:     GLFWwindow* m_pWindow;};

static const char* getKeyName(int key){    switch (key)    {        case GLFW_KEY_A:             return "A";        case GLFW_KEY_B:             return "B";        case GLFW_KEY_C:             return "C";        case GLFW_KEY_D:             return "D";        case GLFW_KEY_E:             return "E";        case GLFW_KEY_F:             return "F";        case GLFW_KEY_G:             return "G";        case GLFW_KEY_H:             return "H";        case GLFW_KEY_I:             return "I";        case GLFW_KEY_J:             return "J";        case GLFW_KEY_K:             return "K";        case GLFW_KEY_L:             return "L";        case GLFW_KEY_M:             return "M";        case GLFW_KEY_N:             return "N";        case GLFW_KEY_O:             return "O";        case GLFW_KEY_P:             return "P";        case GLFW_KEY_Q:             return "Q";        case GLFW_KEY_R:             return "R";        case GLFW_KEY_S:             return "S";        case GLFW_KEY_T:             return "T";        case GLFW_KEY_U:             return "U";        case GLFW_KEY_V:             return "V";        case GLFW_KEY_W:             return "W";        case GLFW_KEY_X:             return "X";        case GLFW_KEY_Y:             return "Y";        case GLFW_KEY_Z:             return "Z";        case GLFW_KEY_1:             return "1";        case GLFW_KEY_2:             return "2";        case GLFW_KEY_3:             return "3";        case GLFW_KEY_4:             return "4";        case GLFW_KEY_5:             return "5";        case GLFW_KEY_6:             return "6";        case GLFW_KEY_7:             return "7";        case GLFW_KEY_8:             return "8";        case GLFW_KEY_9:             return "9";        case GLFW_KEY_0:             return "0";        case GLFW_KEY_SPACE:         return "SPACE";        case GLFW_KEY_MINUS:         return "MINUS";        case GLFW_KEY_EQUAL:         return "EQUAL";        case GLFW_KEY_LEFT_BRACKET:  return "LEFT BRACKET";        case GLFW_KEY_RIGHT_BRACKET: return "RIGHT BRACKET";        case GLFW_KEY_BACKSLASH:     return "BACKSLASH";        case GLFW_KEY_SEMICOLON:     return "SEMICOLON";        case GLFW_KEY_APOSTROPHE:    return "APOSTROPHE";        case GLFW_KEY_GRAVE_ACCENT:  return "GRAVE ACCENT";        case GLFW_KEY_COMMA:         return "COMMA";        case GLFW_KEY_PERIOD:        return "PERIOD";        case GLFW_KEY_SLASH:         return "SLASH";        case GLFW_KEY_WORLD_1:       return "WORLD 1";        case GLFW_KEY_WORLD_2:       return "WORLD 2";        case GLFW_KEY_ESCAPE:        return "ESCAPE";        case GLFW_KEY_F1:            return "F1";        case GLFW_KEY_F2:            return "F2";        case GLFW_KEY_F3:            return "F3";        case GLFW_KEY_F4:            return "F4";        case GLFW_KEY_F5:            return "F5";        case GLFW_KEY_F6:            return "F6";        case GLFW_KEY_F7:            return "F7";        case GLFW_KEY_F8:            return "F8";        case GLFW_KEY_F9:            return "F9";        case GLFW_KEY_F10:           return "F10";        case GLFW_KEY_F11:           return "F11";        case GLFW_KEY_F12:           return "F12";        case GLFW_KEY_F13:           return "F13";        case GLFW_KEY_F14:           return "F14";        case GLFW_KEY_F15:           return "F15";        case GLFW_KEY_F16:           return "F16";        case GLFW_KEY_F17:           return "F17";        case GLFW_KEY_F18:           return "F18";        case GLFW_KEY_F19:           return "F19";        case GLFW_KEY_F20:           return "F20";        case GLFW_KEY_F21:           return "F21";        case GLFW_KEY_F22:           return "F22";        case GLFW_KEY_F23:           return "F23";        case GLFW_KEY_F24:           return "F24";        case GLFW_KEY_F25:           return "F25";        case GLFW_KEY_UP:            return "UP";        case GLFW_KEY_DOWN:          return "DOWN";        case GLFW_KEY_LEFT:          return "LEFT";        case GLFW_KEY_RIGHT:         return "RIGHT";        case GLFW_KEY_LEFT_SHIFT:    return "LEFT SHIFT";        case GLFW_KEY_RIGHT_SHIFT:   return "RIGHT SHIFT";        case GLFW_KEY_LEFT_CONTROL:  return "LEFT CONTROL";        case GLFW_KEY_RIGHT_CONTROL: return "RIGHT CONTROL";        case GLFW_KEY_LEFT_ALT:      return "LEFT ALT";        case GLFW_KEY_RIGHT_ALT:     return "RIGHT ALT";        case GLFW_KEY_TAB:           return "TAB";        case GLFW_KEY_ENTER:         return "ENTER";        case GLFW_KEY_BACKSPACE:     return "BACKSPACE";        case GLFW_KEY_INSERT:        return "INSERT";        case GLFW_KEY_DELETE:        return "DELETE";        case GLFW_KEY_PAGE_UP:       return "PAGE UP";        case GLFW_KEY_PAGE_DOWN:     return "PAGE DOWN";        case GLFW_KEY_HOME:          return "HOME";        case GLFW_KEY_END:           return "END";        case GLFW_KEY_KP_0:          return "KEYPAD 0";        case GLFW_KEY_KP_1:          return "KEYPAD 1";        case GLFW_KEY_KP_2:          return "KEYPAD 2";        case GLFW_KEY_KP_3:          return "KEYPAD 3";        case GLFW_KEY_KP_4:          return "KEYPAD 4";        case GLFW_KEY_KP_5:          return "KEYPAD 5";        case GLFW_KEY_KP_6:          return "KEYPAD 6";        case GLFW_KEY_KP_7:          return "KEYPAD 7";        case GLFW_KEY_KP_8:          return "KEYPAD 8";        case GLFW_KEY_KP_9:          return "KEYPAD 9";        case GLFW_KEY_KP_DIVIDE:     return "KEYPAD DIVIDE";        case GLFW_KEY_KP_MULTIPLY:   return "KEYPAD MULTPLY";        case GLFW_KEY_KP_SUBTRACT:   return "KEYPAD SUBTRACT";        case GLFW_KEY_KP_ADD:        return "KEYPAD ADD";        case GLFW_KEY_KP_DECIMAL:    return "KEYPAD DECIMAL";        case GLFW_KEY_KP_EQUAL:      return "KEYPAD EQUAL";        case GLFW_KEY_KP_ENTER:      return "KEYPAD ENTER";        case GLFW_KEY_PRINT_SCREEN:  return "PRINT SCREEN";        case GLFW_KEY_NUM_LOCK:      return "NUM LOCK";        case GLFW_KEY_CAPS_LOCK:     return "CAPS LOCK";        case GLFW_KEY_SCROLL_LOCK:   return "SCROLL LOCK";        case GLFW_KEY_PAUSE:         return "PAUSE";        case GLFW_KEY_LEFT_SUPER:    return "LEFT SUPER";        case GLFW_KEY_RIGHT_SUPER:   return "RIGHT SUPER";        case GLFW_KEY_MENU:          return "MENU";        default:                     return "UNKNOWN";    }}static const char* getActionName(int action){    switch (action)    {        case GLFW_PRESS:        {            return "pressed";            break;        }        case GLFW_RELEASE:        {            return "released";            break;        }        case GLFW_REPEAT:        {            return "repeated";            break;        }    }    return "caused unknown action";}static const char* getButtonName(int button){    switch (button)    {        case GLFW_MOUSE_BUTTON_LEFT:        {            return "left";            break;        }        case GLFW_MOUSE_BUTTON_RIGHT:        {            return "right";            break;        }        case GLFW_MOUSE_BUTTON_MIDDLE:        {            return "middle";            break;        }        default:        {            static char name[16];            sprintf(name, "%i", button);            return name;            break;        }    }}static const char* getModsName(int mods){    static char name[512];    if (mods == 0) {        return " no mods";    }    name[0] = '\0';    if (mods & GLFW_MOD_SHIFT) {        strcat(name, " shift");    }    if (mods & GLFW_MOD_CONTROL) {        strcat(name, " control");    }    if (mods & GLFW_MOD_ALT) {        strcat(name, " alt");    }    if (mods & GLFW_MOD_SUPER) {        strcat(name, " super");    }    return name;}static const char* getCharacterString(int codepoint){    static char result[6 + 1];    int length = wctomb(result, codepoint);    if (length == -1){        length = 0;    }    result[length] = '\0';    return result;}static void onErrorCallback(int error, const char* description){    fputs(description, stderr);}static void onKeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods){    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)        glfwSetWindowShouldClose(window, GL_TRUE);}static void onMouseButtonCallback(GLFWwindow* window, int button, int action, int mods){    glfwGetWindowUserPointer(window);    printf("%0.3f: Mouse button %i (%s) (with%s) was %s\n",        glfwGetTime(), button,        getButtonName(button),        getModsName(mods),        getActionName(action));    if (GLFW_MOUSE_BUTTON_LEFT == button)    {        if (GLFW_PRESS == action)//按下        {        }        else if(GLFW_RELEASE == action)//释放        {        }    }}static void onCursorPositionCallback(GLFWwindow* window, double x, double y){    glfwGetWindowUserPointer(window);    printf("%0.3f: Cursor position: %f %f GLPoint:%f,%f\n", glfwGetTime(), x, y);}static void onScrollCallback(GLFWwindow* window, double x, double y){    glfwGetWindowUserPointer(window);    printf(" %0.3f: Scroll: %0.3f %0.3f\n", glfwGetTime(), x, y);}static void onCharCallback(GLFWwindow* window, unsigned int codepoint){    glfwGetWindowUserPointer(window);    printf("%0.3f: Character 0x%08x (%s) input\n",        glfwGetTime(), codepoint,        getCharacterString(codepoint));}GLWindow::GLWindow()    :m_pWindow(nullptr){}GLWindow::~GLWindow(){}void GLWindow::createWindow(int width, int height, const char* title){    glfwSetErrorCallback(onErrorCallback);    if (!glfwInit())    {        closeWindow();    }    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);    m_pWindow = glfwCreateWindow(width, height, title, nullptr, nullptr);    if (!m_pWindow)    {        closeWindow();    }    glfwMakeContextCurrent(m_pWindow);    glfwSwapInterval(1);    glfwSetMouseButtonCallback(m_pWindow, onMouseButtonCallback);    glfwSetCursorPosCallback(  m_pWindow, onCursorPositionCallback);    glfwSetScrollCallback(     m_pWindow, onScrollCallback);    glfwSetKeyCallback(        m_pWindow, onKeyCallback);    glfwSetCharCallback(       m_pWindow, onCharCallback);    glewInit();    //OpenGL版本信息    const GLubyte* name          =    glGetString(GL_VENDOR); //返回负责当前OpenGL实现厂商的名字    const GLubyte* biaoshifu     =    glGetString(GL_RENDERER); //返回一个渲染器标识符,通常是个硬件平台    const GLubyte* OpenGLVersion =    glGetString(GL_VERSION); //返回当前OpenGL实现的版本号    printf("OpenGL实现厂商的名字:%s\n", name);    printf("渲染器标识符:%s\n", biaoshifu);    printf("OOpenGL实现的版本号:%s\n", OpenGLVersion);}void GLWindow::closeWindow(){    if (m_pWindow)    {        glfwDestroyWindow(m_pWindow);    }    glfwTerminate();    exit(EXIT_SUCCESS);}bool GLWindow::windowShouldClose(){    return glfwWindowShouldClose(m_pWindow) != 0;}void GLWindow::getFramebufferSize(int &width, int &height){    glfwGetFramebufferSize(m_pWindow, &width, &height);}void GLWindow::pollEvents(){    glfwSwapBuffers(m_pWindow);    glfwPollEvents();}
0 0
原创粉丝点击