#include<iostream>#include<cmath>// GLEW#include<GL/glew.h>// GLFW#include<GLFW/glfw3.h>voidframebuffer_size_callback(GLFWwindow* window,int width,int height);voidprocessInput(GLFWwindow *window);intmain(void){
GLFWwindow* window;if(!glfwInit())return-1;
window =glfwCreateWindow(640,480,"Hello World",NULL,NULL);if(!window){glfwTerminate();return-1;}glfwMakeContextCurrent(window);
glewExperimental = GL_TRUE;if(glewInit()!= GLEW_OK)
std::cout <<"Error!"<< std::endl;// 顶点着色器字符串constchar*vertexShaderSource ="#version 330 core\n""layout (location = 0) in vec3 aPos;\n""void main()\n""{\n"" gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n""}\0";constchar*fragmentShaderSource ="#version 330 core\n""out vec4 FragColor;\n""void main()\n""{\n"" FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n""}\n\0";// vertex shaderunsignedint vertexShader =glCreateShader(GL_VERTEX_SHADER);glShaderSource(vertexShader,1,&vertexShaderSource,NULL);glCompileShader(vertexShader);// check for shader compile errorsint success;char 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 shaderunsignedint fragmentShader =glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragmentShader,1,&fragmentShaderSource,NULL);glCompileShader(fragmentShader);// check for shader compile errorsglGetShaderiv(fragmentShader, GL_COMPILE_STATUS,&success);if(!success){glGetShaderInfoLog(fragmentShader,512,NULL, infoLog);
std::cout <<"ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n"<< infoLog << std::endl;}// link shadersunsignedint shaderProgram =glCreateProgram();glAttachShader(shaderProgram, vertexShader);glAttachShader(shaderProgram, fragmentShader);glLinkProgram(shaderProgram);// check for linking errorsglGetProgramiv(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 configure vertex attributes// ------------------------------------------------------------------float vertices[]={0.5f,0.5f,0.0f,// 右上角0.5f,-0.5f,0.0f,// 右下角-0.5f,-0.5f,0.0f,// 左下角-0.5f,0.5f,0.0f// 左上角};unsignedint indices[]={0,1,3,// 第一个三角形1,2,3// 第二个三角形};unsignedint 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 then configure vertex attributes(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(float),(void*)0);glEnableVertexAttribArray(0);// note that this is allowed, the call to glVertexAttribPointer registered VBO as the vertex attribute's bound vertex buffer object so afterwards we can safely unbindglBindBuffer(GL_ARRAY_BUFFER,0);// You can unbind the VAO afterwards so other VAO calls won't accidentally modify this VAO, but this rarely happens. Modifying other// VAOs requires a call to glBindVertexArray anyways so we generally don't unbind VAOs (nor VBOs) when it's not directly necessary.glBindVertexArray(0);// uncomment this call to draw in wireframe polygons.//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);// render loop// -----------while(!glfwWindowShouldClose(window)){// input// -----processInput(window);// render// ------glClearColor(0.2f,0.3f,0.3f,1.0f);glClear(GL_COLOR_BUFFER_BIT);// draw our first triangleglUseProgram(shaderProgram);glBindVertexArray(VAO);glDrawElements(GL_TRIANGLES,6, GL_UNSIGNED_INT,0);//--------------改动// glBindVertexArray(0); // no need to unbind it every time // glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.)// -------------------------------------------------------------------------------glfwSwapBuffers(window);glfwPollEvents();}glDeleteVertexArrays(1,&VAO);glDeleteBuffers(1,&VBO);glDeleteProgram(shaderProgram);glfwTerminate();return0;}voidprocessInput(GLFWwindow *window){if(glfwGetKey(window, GLFW_KEY_ESCAPE)== GLFW_PRESS)glfwSetWindowShouldClose(window, true);}voidframebuffer_size_callback(GLFWwindow* window,int width,int height){glViewport(0,0, width, height);}