opengl使用着色器的示例程序

⌚Time: 2024-03-18 19:01:46

👨‍💻Author: Jack Ge

使用了glew库和freeglut库


#include <GL/glew.h>

#include <GL/freeglut.h>

#include <iostream>



// 窗口大小

const GLint WIDTH = 800, HEIGHT = 600;



const GLchar* 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";



const GLchar* fragmentShaderSource = "#version 330 core\n"

    "out vec4 FragColor;\n"

    "void main()\n"

    "{\n"

    "   FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n"

    "}\0";



void render()

{

    // 清空颜色缓冲区

    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);

    glClear(GL_COLOR_BUFFER_BIT);



    // 使用着色器程序



    // 创建顶点着色器

    GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);

    glShaderSource(vertexShader, 1, &vertexShaderSource, nullptr);

    glCompileShader(vertexShader);



    // 创建片段着色器

    GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);

    glShaderSource(fragmentShader, 1, &fragmentShaderSource, nullptr);

    glCompileShader(fragmentShader);



    // 创建着色器程序

    GLuint 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.0f,  0.5f, 0.0f

    };



    // 创建顶点缓冲对象(VBO)

    GLuint VBO, VAO;

    glGenVertexArrays(1, &VAO);

    glGenBuffers(1, &VBO);

    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);

    glBindVertexArray(0);



    // 绘制三角形

    glUseProgram(shaderProgram);

    glBindVertexArray(VAO);

    glDrawArrays(GL_TRIANGLES, 0, 3);

    glBindVertexArray(0);



    // 交换缓冲区

    glutSwapBuffers();

}



int main(int argc, char** argv)

{

    // 初始化GLUT

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);

    glutInitWindowSize(WIDTH, HEIGHT);

    glutCreateWindow("OpenGL");



    // 初始化GLEW

    glewExperimental = GL_TRUE;

    glewInit();



    // 设置视口大小

    glViewport(0, 0, WIDTH, HEIGHT);



    // 注册回调函数

    glutDisplayFunc(render);



    // 进入GLUT循环

    glutMainLoop();



    return 0;

}



#include <GL/glew.h>

#include <GL/freeglut.h>

#include <iostream>



int windowWidth = 800;

int windowHeight = 600;



float time = 0.0;



void display()

{

    glClear(GL_COLOR_BUFFER_BIT);



    // 设置着色器程序和参数

    GLint shaderProgram;

    GLuint vertexShader;

    GLuint fragmentShader;



    const GLchar* vertexShaderSource = R"(

        #version 330 core

        layout (location = 0) in vec3 aPos;

        void main()

        {

            gl_Position = vec4(aPos, 1.0);

        }

    )";



    const GLchar* fragmentShaderSource = R"(

        #version 330 core



        uniform float time;

        uniform vec2 resolution;



        out vec4 FragColor;



        void main()

        {

            vec2 uv = gl_FragCoord.xy / resolution.xy;



            float strength = 0.2;

            float speed = 1.0;

            float frequency = 10.0;

            vec2 offset = vec2(cos(uv.y * frequency + time * speed), sin(uv.x * frequency + time * speed)) * strength;



            vec3 color = vec3(1.0, 0.5, 0.0);

            FragColor = vec4(color, 1.0) + vec4(offset.x, offset.y, 0.0, 0.0);

        }

    )";



    // 创建和编译顶点着色器

    vertexShader = glCreateShader(GL_VERTEX_SHADER);

    glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);

    glCompileShader(vertexShader);



    // 创建和编译片段着色器

    fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);

    glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);

    glCompileShader(fragmentShader);



    // 创建着色器程序

    shaderProgram = glCreateProgram();

    glAttachShader(shaderProgram, vertexShader);

    glAttachShader(shaderProgram, fragmentShader);

    glLinkProgram(shaderProgram);



    // 检查编译错误

    GLint success;

    GLchar infoLog[512];

    glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);

    if (!success)

    {

        glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);

        std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;

    }



    // 设置着色器参数

    glUseProgram(shaderProgram);

    glUniform1f(glGetUniformLocation(shaderProgram, "time"), time);

    glUniform2f(glGetUniformLocation(shaderProgram, "resolution"), windowWidth, windowHeight);



    // 绘制一个全屏四边形

    glBegin(GL_QUADS);

    glVertex2f(-1.0, -1.0);

    glVertex2f(1.0, -1.0);

    glVertex2f(1.0, 1.0);

    glVertex2f(-1.0, 1.0);

    glEnd();



    glutSwapBuffers();

}



void idle()

{

    time += 0.01;

    glutPostRedisplay();

}



int main(int argc, char** argv)

{

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);

    glutInitWindowSize(windowWidth, windowHeight);

    glutCreateWindow("Wave Shader");



    // 初始化GLEW

    glewExperimental = GL_TRUE;

    glewInit();



    glutDisplayFunc(display);

    glutIdleFunc(idle);



    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);



    glutMainLoop();



    return 0;

}