画一个三角形

来源:互联网 发布:男女说唱的网络歌曲 编辑:程序博客网 时间:2024/04/29 18:49

先上三角形的代码:

#include <iostream>// GLEW#define GLEW_STATIC#include <GL/glew.h>// GLFW#include <GLFW/glfw3.h>// 回调函数的声明void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode);// 窗体的宽和高const GLuint WIDTH = 800, HEIGHT = 600;// 下面是顶点着色器和片段着色器,用GLSL语言编写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";// main函数是窗口的入口函数int main(){    // 初始化GLFW    glfwInit();    //     glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//OPENGL主版本号    glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);//次版本号    glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);//采用CORE编译模式    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);//窗口大小不可更改    // 创建窗口    GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "LearnOpenGL", nullptr, nullptr);    glfwMakeContextCurrent(window);//把创建出来的窗口设置为当前环境的上下文    // 设置窗口的回调函数    glfwSetKeyCallback(window, key_callback);    // 设置GLEW,此项设置为真    glewExperimental = GL_TRUE;    //     glewInit();    // 定义窗口的尺寸大小    int width, height;    glfwGetFramebufferSize(window, &width, &height);      glViewport(0, 0, width, height);//得到窗口的尺寸大小之后绘制窗口    //     // 首先,创建一个顶点着色器,在把之前写的顶点着色器源码导入顶点着色器中,然后编译顶点着色器    GLuint 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\n" << infoLog << std::endl;    }    // 同上    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;    }    // 然后创建一个总的着色器程序,把之前的各个着色器全部附加上来    GLuint shaderProgram = glCreateProgram();    glAttachShader(shaderProgram, vertexShader);    glAttachShader(shaderProgram, fragmentShader);    glLinkProgram(shaderProgram);//链接着色器    //检查链接状态    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);//然后就可以把之前的着色器删除了    // 下面是自己定义的三角形的顶点数据    GLfloat vertices[] = {        -0.5f, -0.5f, 0.0f, // Left           0.5f, -0.5f, 0.0f, // Right          0.0f,  0.5f, 0.0f  // Top       };    GLuint VBO, VAO;    glGenVertexArrays(1, &VAO);    glGenBuffers(1, &VBO);//分别创建VAO对象和VBO对象    // 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);    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)    // 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, 3);        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);    // Terminate GLFW, clearing any resources allocated by GLFW.    glfwTerminate();    return 0;}// Is called whenever a key is pressed/released via GLFWvoid key_callback(GLFWwindow* window, int key, int scancode, int action, int mode){    if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)        glfwSetWindowShouldClose(window, GL_TRUE);}


0 0
原创粉丝点击