OpenGL 학습 노트:색인 버퍼 대상 사용
                                            
 6227 단어  OpenGL 학습 노트
                    
#include 
#include 
#include 
#include 
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;
//        
const char *vertexShaderSource = "#version 330 core
"
"layout (location = 0) in vec3 aPos;
"
"void main()
"
"{
"
"   gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
"
"}\0";
//       
const char *fragmentShaderSource = "#version 330 core
"
"out vec4 FragColor;
"
"void main()
"
"{
"
"   FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
"
"}
\0";
void framebuffer_size_callback(GLFWwindow *window, int width, int height)
{
	//                   ,       
	glViewport(0, 0, width, height);
}
void processInput(GLFWwindow *window)
{
	if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS)
		glfwSetWindowShouldClose(window, true);
}
int main(int argc, char **argv)
{
	//    ,     ,      
	glfwInit();
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
	//     
	GLFWwindow *window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "mytest", NULL, NULL);
	if (!window)
	{
		std::cout << "Create Window Error!
";
		glfwTerminate();
		return -1;
	}
	glfwMakeContextCurrent(window);
	//              
	glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
	//    glad
	//    GLAD            OpenGL         。
	// GLFW     glfwGetProcAddress,                  。
	if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
	{
		std::cout << "Failed to initialize GLAD" << std::endl;
		glfwTerminate();
		glfwDestroyWindow(window);
		return -1;
	}
	unsigned int vertexShader;
	//          
	//         
	//      
	vertexShader = glCreateShader(GL_VERTEX_SHADER);
	glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
	glCompileShader(vertexShader);
	int success;
	char infoLog[512] = { 0 };
	//          
	glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
	if (!success)
	{
		//       ,      
		glGetShaderInfoLog(vertexShader, sizeof(infoLog), NULL, infoLog);
		std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED
" << infoLog << std::endl;
	}
	//        ,           
	int fragmentShader;
	fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
	glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
	glCompileShader(fragmentShader);
	glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
	if (!success)
	{
		memset(infoLog, 0, sizeof(infoLog));
		glGetShaderInfoLog(fragmentShader, sizeof(infoLog), NULL, infoLog);
		std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED
" << infoLog << std::endl;
	}
	/*        ,                    */
	//            
	unsigned int shaderProgram;
	shaderProgram = glCreateProgram();
	//              
	glAttachShader(shaderProgram, vertexShader);
	glAttachShader(shaderProgram, fragmentShader);
	//     
	glLinkProgram(shaderProgram);
	//         ,          
	glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
	if (!success)
	{
		memset(infoLog, 0, sizeof(infoLog));
		glGetProgramInfoLog(shaderProgram, sizeof(infoLog), NULL, infoLog);
		std::cout << "ERROR::SHADER::PROGRAM::LINK_FAILED
" << infoLog << std::endl;
	}
	//                
	glUseProgram(shaderProgram);
	//   ,                  ,    
	glDeleteShader(vertexShader);
	glDeleteShader(fragmentShader);
	/************************************************
	 *                (OpenGL       ),
	 *         ,         
	 *        ,          ,
	 *         ,              
	 ***********************************************/
	//          
	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   //    
	};
	//       ,             
	unsigned int indices[] = { //      0  ! 
		0, 1, 3, //       
		1, 2, 3  //       
	};
	unsigned int VBO;
	unsigned int VAO;
	unsigned int EBO;
	//           
	glGenBuffers(1, &VBO);
	//           
	glGenBuffers(1, &EBO);
	//           
	glGenVertexArrays(1, &VAO);
	//           ,,。
	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);
	//         ,  OpenGL                     
	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void *)0);
	//       
	glEnableVertexAttribArray(0);
	//    ,     ,
	//  glVertexAttribPointer    VBO                 ,
	//              
	glBindBuffer(GL_ARRAY_BUFFER, 0);
	//           VAO,    VAO          VAO,         。
	//     VAO    glBindVertexArray,                   VAO(   VBO)。
	glBindVertexArray(0);
	//       
	while (!glfwWindowShouldClose(window))
	{
		//       
		processInput(window);
		//       
		//    glClear  ,        ,
		//             glClearColor       
		//    ,                  
		glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
		glClear(GL_COLOR_BUFFER_BIT);
		//        
		glUseProgram(shaderProgram);
		//         VAO,           ,       ,        
		glBindVertexArray(VAO);
		//               ,          ,
		//     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)       
		glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
		//          glDrawArrays  
		//                ,   glDrawArrays   。
		//                  ,   6,            6   。
		//            ,   GL_UNSIGNED_INT。
		//              EBO     (          ,                   ),          0。
		glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
		
		//           ,           , VBO     (  VAO    )     。
		//glDrawArrays(GL_TRIANGLES, 0, 3);
		glfwPollEvents();
		glfwSwapBuffers(window);
		Sleep(1);
	}
	glDeleteVertexArrays(1, &VAO);
	glDeleteBuffers(1, &VBO);
	glfwTerminate();
	glfwDestroyWindow(window);
	return 0;
}