绘制的图形颜色不断变化

#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <chrono>
#include <thread>
#include <iostream>
#include <random>

#include <stdbool.h>
#include <math.h>

void monitor(GLFWwindow* win,int W, int H) {
    glViewport(0, 0, W, H);
    return;
}

void Input(GLFWwindow* win) {
    if (glfwGetKey(win, GLFW_KEY_ESCAPE) == GLFW_PRESS) {
        glfwSetWindowShouldClose(win, true);
    }
    return;
}

std::random_device rd;
std::mt19937 gen(rd());
std::uniform_real_distribution<> dis(0,1);
float GetRandom(){
    return dis(gen);
}


int main() {

    glfwInit();

    glfwInitHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfwInitHint(GLFW_CONTEXT_VERSION_MINOR, 3);
    glfwInitHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

    GLFWwindow* win = glfwCreateWindow(800, 600, "着色器", NULL, NULL);
    glfwMakeContextCurrent(win);

    // 初始化glad
    gladLoadGLLoader((GLADloadproc)glfwGetProcAddress);

    glViewport(0, 0, 800, 600);

    glfwSetFramebufferSizeCallback(win, monitor);


    const char* vertex =
            "#version 330 core\n"
            "layout (location = 0) in vec3 apos;\n"
            "out vec4 vec4apos;\n"
            "void main(){\n"
            "	vec4apos = vec4(apos,1.0);\n"
            "	gl_Position = vec4apos;\n"

            "}";
    const char* fragment =
            "#version 330 core\n"
            "out vec4 FragColor;\n"
            "in vec4 vec4apos;\n"
            "uniform vec4 ourcolor;\n"
            "void main(){\n"
            "	FragColor = ourcolor;\n"
            "}";


    float arr[] = {
            // 第一个三角形
            0.5f,0.75f,0.0f,
            0.25f,0.25f,0.0f,
            0.75f,0.25f,0.0f,
    };

    unsigned int vertexshader	= glCreateShader(GL_VERTEX_SHADER);
    unsigned int fragmentshader = glCreateShader(GL_FRAGMENT_SHADER);

    glShaderSource(vertexshader, 1, &vertex, NULL);
    glShaderSource(fragmentshader, 1, &fragment, NULL);

    glCompileShader(vertexshader);
    glCompileShader(fragmentshader);

    unsigned int shaderprogram = glCreateProgram();
    glAttachShader(shaderprogram, vertexshader);
    glAttachShader(shaderprogram, fragmentshader);

    glLinkProgram(shaderprogram);

    glUseProgram(shaderprogram);
    glDeleteShader(vertexshader);
    glDeleteShader(fragmentshader);


    unsigned int VAO, VBO;
    glGenVertexArrays(1, &VAO);
    glGenBuffers(1, &VBO);


    glBindVertexArray(VAO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);

    glBufferData(GL_ARRAY_BUFFER, sizeof(arr), arr, GL_STATIC_DRAW);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)NULL);

    glEnableVertexAttribArray(0);

    while (glfwWindowShouldClose(win) == 0) {

        Input(win);

        std::this_thread::sleep_for(std::chrono::milliseconds (100));

        // 获取着色器中的ourcolor变量
        int vertexcolor = glGetUniformLocation(shaderprogram, "ourcolor");

        // 设置颜色
        glUniform4f(vertexcolor, GetRandom(), GetRandom(), GetRandom(), 1.0f);

        glUseProgram(shaderprogram);
        glDrawArrays(GL_TRIANGLES, 0, (sizeof(arr) / sizeof(arr[0])) / 3);
        glfwSwapBuffers(win);

        glfwPollEvents();

    }

    glfwTerminate();

    return 0;
}

}

2022/11/14 更新上述代码,修复了颜色没有发生变化的bug

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值