diff --git a/OpenGL/hello/src/main.cpp b/OpenGL/hello/src/main.cpp index cbd9400..e1977cb 100644 --- a/OpenGL/hello/src/main.cpp +++ b/OpenGL/hello/src/main.cpp @@ -1,6 +1,7 @@ #include "glad/glad.h" +#include "shader.h" #include -#include +#include // 三角形顶点 float vertices[] = { @@ -17,33 +18,6 @@ unsigned int indices[] = { 1, 2, 3 // 第二个三角形 }; -// 顶点着色器源码 -const char *vertexShaderSource =R"( - #version 330 core - layout (location = 0) in vec3 aPos; - layout (location = 1) in vec3 aColor; - - out vec3 color; - - void main() - { - gl_Position = vec4(aPos, 1.0); - color = aColor; - } -)"; - -// 片段着色器源码 -const char *fragmentShaderSource = R"( - #version 330 core - in vec3 color; - out vec4 FragColor; - - void main() - { - FragColor = vec4(color, 1.0); - } -)"; - void framebuffer_size_callback(GLFWwindow *window, int width, int height); void processInput(GLFWwindow *window); @@ -78,63 +52,11 @@ int main() { // 设置视口 glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); - // 创建顶点着色器 - unsigned int vertexShader; - vertexShader = glCreateShader(GL_VERTEX_SHADER); - // 将着色器源码附加到着色器对象上 - glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); - // 编译着色器 - glCompileShader(vertexShader); - // 检查编译是否成功 - int success; - char 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; - } - - // 创建片段着色器 - unsigned int fragmentShader; - fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); - // 将着色器源码附加到着色器对象上 - glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); - // 编译着色器 - glCompileShader(fragmentShader); - // 检查编译是否成功 - glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); - if (!success) { - // 获取错误信息 - glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog); - std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" - << infoLog << std::endl; - } - // 创建着色器程序 - unsigned int shaderProgram; - 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::LINK_FAILED\n" - << infoLog << std::endl; - } - - // 删除着色器 - glDeleteShader(vertexShader); - glDeleteShader(fragmentShader); + Shader shader = Shader("src/simple.vs", "src/uniformcolor.fs"); - unsigned int VAO,VBO,EBO; + unsigned int VAO, VBO, EBO; // 创建顶点数组对象 glGenVertexArrays(1, &VAO); glBindVertexArray(VAO); @@ -163,14 +85,19 @@ int main() { glClearColor(1.0f, 1.0f, 1.0f, 0.0f); glClear(GL_COLOR_BUFFER_BIT); - // 绘制三角形, 激活程序 - glUseProgram(shaderProgram); + // 激活着色器 + shader.use(); + + // 更新uniform颜色 + float timeValue = glfwGetTime(); + float greenValue = (sin(timeValue) / 2.0f) + 0.5f; + shader.setFloat4("ourColor", 1.0f, greenValue, 0.0f, 0.0f); + shader.setFloat1("xOffset", cos(timeValue) / 2.0f); + shader.setFloat1("yOffset", sin(timeValue) / 2.0f); + + // 绘制三角形 glBindVertexArray(VAO); - //使用线框模式绘制 - glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - // 设置线宽 - glLineWidth(3.0f); - // 绘制 + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); glBindVertexArray(0); diff --git a/OpenGL/hello/src/simple.vs b/OpenGL/hello/src/simple.vs new file mode 100644 index 0000000..e924e3e --- /dev/null +++ b/OpenGL/hello/src/simple.vs @@ -0,0 +1,8 @@ +#version 330 core +layout(location = 0) in vec3 aPos; // 位置变量的属性位置值为0 +uniform float xOffset; +uniform float yOffset; +void main() { + gl_Position = vec4(aPos.x + xOffset, aPos.y + yOffset, aPos.z, + 1.0); // 注意我们如何把一个vec3作为vec4的构造器的参数 +} diff --git a/OpenGL/hello/src/stb.cpp b/OpenGL/hello/src/stb.cpp new file mode 100644 index 0000000..badb3ef --- /dev/null +++ b/OpenGL/hello/src/stb.cpp @@ -0,0 +1,2 @@ +#define STB_IMAGE_IMPLEMENTATION +#include "stb_image.h" \ No newline at end of file diff --git a/OpenGL/hello/src/uniformcolor.fs b/OpenGL/hello/src/uniformcolor.fs new file mode 100644 index 0000000..07cfe17 --- /dev/null +++ b/OpenGL/hello/src/uniformcolor.fs @@ -0,0 +1,9 @@ +#version 330 core +out vec4 FragColor; + +uniform vec4 ourColor; // 在OpenGL程序代码中设定这个变量 + +void main() +{ + FragColor = ourColor; +} \ No newline at end of file