利用GLFW和GLEW搭建OpenGL开发环境
2016-10-01 13:48
861 查看
(如需交流,请关注公众号:神马观止)
1. 下载相应的头文件和库文件
GLEW:http://glew.sourceforge.net/index.html
GLFW:http://www.glfw.org/download.html
得到glew-2.0.0-win32.zip和glfw-3.2.1.bin.WIN32.zip,这里我们采用静态链接库的方式, IDE采用的是Visual Studio 2013,用32位库文件。
(1)头文件:在本地创建文件夹OpenGL,在OpenGL下创建inlcude文件夹,然后将\glfw-3.2.1.bin.WIN32\include下的GLFW拷贝到inlcude里,并将\glew-2.0.0\include中的GL也拷贝到include文件夹中。
(2)LIB文件:将\glfw-3.2.1.bin.WIN32\lib-vc2013下的所有文件拷贝到C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86,同时将\glew-2.0.0\lib\Release\Win32下的所有文件也拷贝到C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86。
2.打开VS2013,新建工程
建立一个Win32控制台程序,同时勾选空项目的选项
然后添加一个.cpp文件编写主程序
3.添加GLFW和GLEW的头文件包含目录,右击工程“HelloTriangle”,选择“属性”,如下图,选择“VC++ 目录”。
选择OpenGL\include文件夹
4.将LIB文件名添加到工程
5.编写OpenGL应用程序
6.运行
7.代码
1. 下载相应的头文件和库文件
GLEW:http://glew.sourceforge.net/index.html
GLFW:http://www.glfw.org/download.html
得到glew-2.0.0-win32.zip和glfw-3.2.1.bin.WIN32.zip,这里我们采用静态链接库的方式, IDE采用的是Visual Studio 2013,用32位库文件。
(1)头文件:在本地创建文件夹OpenGL,在OpenGL下创建inlcude文件夹,然后将\glfw-3.2.1.bin.WIN32\include下的GLFW拷贝到inlcude里,并将\glew-2.0.0\include中的GL也拷贝到include文件夹中。
(2)LIB文件:将\glfw-3.2.1.bin.WIN32\lib-vc2013下的所有文件拷贝到C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86,同时将\glew-2.0.0\lib\Release\Win32下的所有文件也拷贝到C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86。
2.打开VS2013,新建工程
建立一个Win32控制台程序,同时勾选空项目的选项
然后添加一个.cpp文件编写主程序
3.添加GLFW和GLEW的头文件包含目录,右击工程“HelloTriangle”,选择“属性”,如下图,选择“VC++ 目录”。
选择OpenGL\include文件夹
4.将LIB文件名添加到工程
5.编写OpenGL应用程序
6.运行
7.代码
#include <iostream> // GLEW #define GLEW_STATIC #include <GL/glew.h> // GLFW #include <GLFW/glfw3.h> // Function prototypes void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode); // Window dimensions const GLuint WIDTH = 800, HEIGHT = 600; // Shaders const GLchar* vertexShaderSource = "#version 330 core\n" "layout (location = 0) in vec3 position;\n" "void main()\n" "{\n" "gl_Position = vec4(position.x, position.y, position.z, 1.0);\n" "}\0"; const GLchar* fragmentShaderSource = "#version 330 core\n" "out vec4 color;\n" "void main()\n" "{\n" "color = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" "}\n\0"; // The MAIN function, from here we start the application and run the game loop int main() { std::cout << "Starting GLFW context, OpenGL 3.3" << std::endl; // Init GLFW glfwInit(); // Set all the required options for GLFW glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); // Create a GLFWwindow object that we can use for GLFW's functions GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "LearnOpenGL", nullptr, nullptr); glfwMakeContextCurrent(window); // Set the required callback functions glfwSetKeyCallback(window, key_callback); // Set this to true so GLEW knows to use a modern approach to retrieving function pointers and extensions glewExperimental = GL_TRUE; // Initialize GLEW to setup the OpenGL Function pointers glewInit(); // Define the viewport dimensions int width, height; glfwGetFramebufferSize(window, &width, &height); glViewport(0, 0, width, height); // Build and compile our shader program // Vertex shader GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); glCompileShader(vertexShader); // Check for compile time errors GLint success; GLchar infoLog[512]; glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(vertexShader, 512, NULL, infoLog); std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl; } // Fragment shader GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); glCompileShader(fragmentShader); // Check for compile time errors glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog); std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl; } // Link shaders GLuint shaderProgram = glCreateProgram(); glAttachShader(shaderProgram, vertexShader); glAttachShader(shaderProgram, fragmentShader); glLinkProgram(shaderProgram); // Check for linking errors glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); if (!success) { glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog); std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl; } glDeleteShader(vertexShader); glDeleteShader(fragmentShader); // Set up vertex data (and buffer(s)) and attribute pointers //GLfloat vertices[] = { // // First triangle // 0.5f, 0.5f, // Top Right // 0.5f, -0.5f, // Bottom Right // -0.5f, 0.5f, // Top Left // // Second triangle // 0.5f, -0.5f, // Bottom Right // -0.5f, -0.5f, // Bottom Left // -0.5f, 0.5f // Top Left //}; GLfloat vertices[] = { 0.5f, 0.5f, 0.0f, // Top Right 0.5f, -0.5f, 0.0f, // Bottom Right -0.5f, -0.5f, 0.0f, // Bottom Left -0.5f, 0.5f, 0.0f // Top Left }; GLuint indices[] = { // Note that we start from 0! 0, 1, 3, // First Triangle 1, 2, 3 // Second Triangle }; GLuint VBO, VAO, EBO; glGenVertexArrays(1, &VAO); glGenBuffers(1, &VBO); glGenBuffers(1, &EBO); // Bind the Vertex Array Object first, then bind and set vertex buffer(s) and attribute pointer(s). glBindVertexArray(VAO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0); glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); // Note that this is allowed, the call to glVertexAttribPointer registered VBO as the currently bound vertex buffer object so afterwards we can safely unbind glBindVertexArray(0); // Unbind VAO (it's always a good thing to unbind any buffer/array to prevent strange bugs), remember: do NOT unbind the EBO, keep it bound to this VAO // Uncommenting this call will result in wireframe polygons. //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); // Game loop while (!glfwWindowShouldClose(window)) { // Check if any events have been activiated (key pressed, mouse moved etc.) and call corresponding response functions glfwPollEvents(); // Render // Clear the colorbuffer glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); // Draw our first triangle glUseProgram(shaderProgram); glBindVertexArray(VAO); //glDrawArrays(GL_TRIANGLES, 0, 6); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); glBindVertexArray(0); // Swap the screen buffers glfwSwapBuffers(window); } // Properly de-allocate all resources once they've outlived their purpose glDeleteVertexArrays(1, &VAO); glDeleteBuffers(1, &VBO); glDeleteBuffers(1, &EBO); // Terminate GLFW, clearing any resources allocated by GLFW. glfwTerminate(); return 0; } // Is called whenever a key is pressed/released via GLFW void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode) { if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) glfwSetWindowShouldClose(window, GL_TRUE); }
相关文章推荐
- 使用glew、glfw配置OpenGL开发环境
- Xcode环境下OpenGL C++ GLFW开发环境搭建
- mac 下 用 glfw3 搭建opengl开发环境
- OpenGL-vs2012-glfw-glew 测试环境搭建
- 如何在Windows平台搭建完整的OpenGL开发环境?
- 利用VMware搭建虚拟开发环境及VMware虚拟机上网
- 利用AIR体系进行Android开发(环境搭建)
- Ubuntu下搭建openGL开发环境
- 利用GNUstep搭建windows下object-c的开发环境
- 利用VMware搭建虚拟开发环境及VMware虚拟机上网
- 利用Eclipse+Scala搭建android开发环境
- 5分钟利用 Myeclipse8.6 快速搭建ssh(JPA)开发环境 并自动生成dao ,model
- 搭建VS2010,OpenGL开发环境
- 搭建OpenGL在Eclipse底下的开发环境
- 搭建OpenGL在Eclipse底下的开发环境
- Windows上Eclipse开发OpenGL的环境搭建
- Ubuntu 8.04下搭建OpenGL开发环境
- Opengl开发环境搭建
- Opengl开发环境搭建
- OpenGL 之 Eclipse 开发环境搭建