#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