• 渲染一个变色矩形


    
    
    #define GLEW_STATIC
    #include <GL/glew.h>
    #include <GLFW/glfw3.h>
    #include <iostream>
    
    using namespace std;
    
    void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode)
    {
    	// 当用户按下ESC键,我们设置window窗口的WindowShouldClose属性为true
    	// 关闭应用程序
    	if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
    		glfwSetWindowShouldClose(window, GL_TRUE);
    }
    
    const GLchar* vertexShaderSource = "#version 330 core
    "
    "layout (location = 0) in vec3 position;
    "
    "void main()
    "
    "{
    "
    "gl_Position = vec4(position.x, position.y, position.z, 1.0);
    "
    "}
    ";
    
    const GLchar* fragmentShaderSource = "#version 330 core
    "
    "out vec4 color;
    "
    "uniform vec4 outColor;"
    "void main()
    "
    "{
    "
    "color = outColor;
    "
    "}
    ";
    
    int main()
    {
    	glfwInit();
    	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);
    
    	GLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL", nullptr, nullptr);
    	if (window == nullptr)
    	{
    		std::cout << "Failed to create GLFW window" << std::endl;
    		glfwTerminate();
    		return -1;
    	}
    
    	glfwSetKeyCallback(window, key_callback);
    
    	glfwMakeContextCurrent(window);
    
    	glewExperimental = GL_TRUE;
    	if (glewInit() != GLEW_OK)
    	{
    		std::cout << "Failed to initialize GLEW" << std::endl;
    		return -1;
    	}
    
    	int width, height;
    	glfwGetFramebufferSize(window, &width, &height);
    	glViewport(0, 0, width, height);
    
    	GLuint vertexShader;
    	vertexShader = glCreateShader(GL_VERTEX_SHADER);
    	glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
    	glCompileShader(vertexShader);
    	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
    " << infoLog << std::endl;
    	}
    
    	GLuint fragmentShader;
    	fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    	glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
    	glCompileShader(fragmentShader);
    
    	GLuint shaderProgram;
    	shaderProgram = glCreateProgram();
    	glAttachShader(shaderProgram, vertexShader);
    	glAttachShader(shaderProgram, fragmentShader);
    	glLinkProgram(shaderProgram);
    
    	glDeleteShader(vertexShader);
    	glDeleteShader(fragmentShader);
    
    	GLfloat 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,
    	};
    	GLuint indices[] = {
    		0, 1, 3,
    		1, 2, 3,
    	};
    	GLuint VBO, VAO, EBO;
    	glGenVertexArrays(1, &VAO);
    	glGenBuffers(1, &VBO);
    	glGenBuffers(1, &EBO);
    	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);
    	glBindVertexArray(0);
    	//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
    
    	while (!glfwWindowShouldClose(window))
    	{
    		glfwPollEvents();
    		glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    		glClear(GL_COLOR_BUFFER_BIT);
    
    		glUseProgram(shaderProgram);
    
    		GLfloat timeValue = glfwGetTime();
    		GLfloat greenValue = (sin(timeValue) / 2) + 0.5;
    		GLint vertexColorLocation = glGetUniformLocation(shaderProgram, "outColor");
    		glUniform4f(vertexColorLocation, 0.0f, greenValue, 0.0f, 1.0f);
    
    		glBindVertexArray(VAO);
    		//glDrawArrays(GL_TRIANGLES, 0, 3);
    		glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
    		glBindVertexArray(0);
    
    		glfwSwapBuffers(window);
    	}
    
    	glDeleteVertexArrays(1, &VAO);
    	glDeleteBuffers(1, &VBO);
    	glDeleteBuffers(1, &EBO);
    
    	glfwTerminate();
    
    	return 0;
    }
  • 相关阅读:
    职场篇:聚焦与复盘
    职场篇:直面情绪杀手【已补更】
    .NetCore实践篇:成功解决分布式监控ZipKin聚合依赖问题(三)
    职场篇:为何我们需要思想大洗礼?
    职场篇:从温水煮青蛙说起
    .NetCore实践篇:分布式监控系统zipkin踩坑之路(二)
    postman application/json;
    yapi 个人空间 这个分组的问题
    yapi 的分组的理解!
    yapi的安装
  • 原文地址:https://www.cnblogs.com/lakeone/p/9010471.html
Copyright © 2020-2023  润新知