搭建OpenGL环境(32位操作系统+VS2010)

1、下载GLEW

地址:http://glew.sourceforge.net/index.html

点击 Windows 32-bit and 64-bit

2、下载GLFW

地址:http://www.glfw.org/download.html

点击 32-bit Windows binaries

3、解压这两个压缩包,然后把glew-2.0.0-win32\glew-2.0.0\bin\Release\Win32中的glew32.dll拷贝到

C:\Windows\System32和C:\Windows\SysWOW64中

4、把glfw-3.2.1.bin.WIN32\glfw-3.2.1.bin.WIN32\lib-vc2010中的glfw3.dll拷贝到

C:\Windows\System32和C:\Windows\SysWOW64中

5、把glew-2.0.0-win32\glew-2.0.0\lib\Release\Win32中的glew32.lib和glew32s.lib拷贝到

...\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib中

6、把glfw-3.2.1.bin.WIN32\glfw-3.2.1.bin.WIN32\lib-vc2010中的glfw3.lib和glfw3dll.lib拷贝到

...\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib中

7、新建一个文件夹OpenGL,再建子文件夹include,然后把glew-2.0.0-win32\glew-2.0.0\include中的GL文件夹拷贝到新建的include中

再把glfw-3.2.1.bin.WIN32\glfw-3.2.1.bin.WIN32\include中的GLFW文件夹拷贝到新建的include中

8、创建一个新的控制台空项目,添加.cpp文件

9、修改项目属性——》VC++目录——》包含目录

添加刚才创建的include文件夹的路径,比如我的是D:\OpenGL\include

10、修改链接器——》输入——》附加依赖项

添加opengl32.lib

glfw3.lib

glew32s.lib

glew32.lib

11、将如下代码拷贝到刚创建的.cpp中:

 
   
#include
// GLEW
#define GLEW_STATIC
#include
// GLFW
#include
// 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 );
}

12、如果用到GLM的话,下载地址是:http://glm.g-truc.net/0.9.8/index.html

GLM中只包含头文件,所以我们把解压后的glm-0.9.8.4/glm中的glm文件夹直接拷贝到刚才创建的include文件夹中即可

你可能感兴趣的:(搭建OpenGL环境(32位操作系统+VS2010))