From 8e128f2d42a34a49680c727ee888c08e7bd2bb77 Mon Sep 17 00:00:00 2001 From: jie Date: Thu, 12 Oct 2023 15:07:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=91=BD=E5=90=8D=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/triangle.h | 25 +----- shaders/fragmentShader.glsl | 6 ++ shaders/vertexShader.glsl | 9 +++ src/triaangle.cpp | 151 ------------------------------------ src/triangle.cpp | 105 +++++++++++++++++++++++++ 5 files changed, 122 insertions(+), 174 deletions(-) create mode 100644 shaders/fragmentShader.glsl create mode 100644 shaders/vertexShader.glsl delete mode 100644 src/triaangle.cpp create mode 100644 src/triangle.cpp diff --git a/include/triangle.h b/include/triangle.h index 2069ee9..77f6a6b 100644 --- a/include/triangle.h +++ b/include/triangle.h @@ -6,30 +6,9 @@ #define MEDIAPLAYER_PRACTICE_1_H #include "pch.h" +#include "shaderService.h" -namespace PRACTICE { - - static const char *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" - "}\n"; - - static const char *fragmentShaderSource = "#version 330 core\n" - "out vec4 FragColor;\n" - "void main()\n" - "{\n" - " FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" - "}\n\0"; - - static const char *fragmentShaderSource1 = "#version 330 core\n" - "out vec4 FragColor;\n" - "void main()\n" - "{\n" - " FragColor = vec4(1.0f, 1.0f, 0.0f, 1.0f);\n" - "}\n\0"; - +namespace TRIANGLE { int Practice1(); void frameBufferSizeChange(GLFWwindow *window, int width, int height); diff --git a/shaders/fragmentShader.glsl b/shaders/fragmentShader.glsl new file mode 100644 index 0000000..7235423 --- /dev/null +++ b/shaders/fragmentShader.glsl @@ -0,0 +1,6 @@ +#version 330 core +in vec3 ourColor; +out vec4 FragColor; +void main(){ + FragColor = vec4(ourColor, 1.0f); +} \ No newline at end of file diff --git a/shaders/vertexShader.glsl b/shaders/vertexShader.glsl new file mode 100644 index 0000000..ebb82a0 --- /dev/null +++ b/shaders/vertexShader.glsl @@ -0,0 +1,9 @@ +#version 330 core +layout (location = 0) in vec3 aPos; +layout (location = 1) in vec3 aColor; +uniform float position; +out vec3 ourColor; +void main(){ + gl_Position = vec4(aPos.x + position , -aPos.y, aPos.z, 1.0f); + ourColor = aPos; +} \ No newline at end of file diff --git a/src/triaangle.cpp b/src/triaangle.cpp deleted file mode 100644 index 66c5e82..0000000 --- a/src/triaangle.cpp +++ /dev/null @@ -1,151 +0,0 @@ -#include "triangle.h" -#include "iostream" - -namespace PRACTICE { - - void frameBufferSizeChange(GLFWwindow *window, int width, int height) { - glViewport(0, 0, width, height); - } - - void processInput(GLFWwindow *window) { - if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) { - glfwSetWindowShouldClose(window, true); - } - } - - void CheckShader(unsigned int shaderIndex, bool isPorgram) { - int successful; - char logInfo[512]; - if (isPorgram) { - glad_glGetProgramiv(shaderIndex, GL_LINK_STATUS, &successful); - } else { - glad_glGetShaderiv(shaderIndex, GL_COMPILE_STATUS, &successful); - } - if (!successful) { - if (isPorgram) { - glad_glGetProgramInfoLog(shaderIndex, 512, nullptr, logInfo); - } else { - glad_glGetShaderInfoLog(shaderIndex, 512, nullptr, logInfo); - } - std::cout << logInfo << std::endl; - } - } - - int Practice1() { - glfwInit(); - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); - glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); - glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); - - GLFWwindow *window = glfwCreateWindow(800, 600, "Windows", nullptr, nullptr); - if (window == nullptr) { - return -1; - } - glfwMakeContextCurrent(window); - glfwSetWindowSizeCallback(window, frameBufferSizeChange); - - if (!gladLoadGLLoader((GLADloadproc) glfwGetProcAddress)) { - auto error = glad_glGetError(); - return static_cast(error); - } - - float vertices[] = { - -0.5, 0.5f, 0.0f, - 0.5f, 0.5f, 0.0f, - 0.0f, 0.0f, 0.0f, - 0.5f, -0.5f, 0.0f, - -0.5f, -0.5f, 0.0f, - }; - - unsigned int indices[] = { - 0, 1, 2, - }; - unsigned int indices2[]{ - 2, 3, 4, - }; - - unsigned int VAOs[2], VBO, EBOs[2]; - glGenVertexArrays(2, VAOs); - glGenBuffers(1, &VBO); - glGenBuffers(2, EBOs); - - glBindVertexArray(VAOs[0]); - glBindBuffer(GL_ARRAY_BUFFER, VBO); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBOs[0]); - - glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void *) 0); - - glEnableVertexAttribArray(0); - glBindVertexArray(0); - - - glBindVertexArray(VAOs[1]); - glBindBuffer(GL_ARRAY_BUFFER, VBO); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBOs[1]); - - glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices2), indices2, GL_STATIC_DRAW); - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void *) 0); - glEnableVertexAttribArray(0); - glBindVertexArray(0); - - - unsigned int vertexShader, fragmentShader[2], shaderProgram[2]; - vertexShader = glCreateShader(GL_VERTEX_SHADER); - fragmentShader[0] = glCreateShader(GL_FRAGMENT_SHADER); - fragmentShader[1] = glCreateShader(GL_FRAGMENT_SHADER); - shaderProgram[0] = glCreateProgram(); - shaderProgram[1] = glCreateProgram(); - glShaderSource(vertexShader, 1, &vertexShaderSource, nullptr); - CheckShader(vertexShader); - glShaderSource(fragmentShader[0], 1, &fragmentShaderSource, nullptr); - CheckShader(fragmentShader[0]); - glShaderSource(fragmentShader[1], 1, &fragmentShaderSource1, nullptr); - CheckShader(fragmentShader[1]); - - glAttachShader(shaderProgram[0], vertexShader); - glAttachShader(shaderProgram[0], fragmentShader[0]); - glLinkProgram(shaderProgram[0]); - CheckShader(shaderProgram[0], true); - - glAttachShader(shaderProgram[1], vertexShader); - glAttachShader(shaderProgram[1], fragmentShader[1]); - glLinkProgram(shaderProgram[1]); - CheckShader(shaderProgram[1], true); - - glDeleteShader(vertexShader); - glDeleteShader(fragmentShader[0]); - glDeleteShader(fragmentShader[1]); - - - glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - - while (!glfwWindowShouldClose(window)) { - processInput(window); - - glClearColor(.2f, .3f, .3f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT); - - glUseProgram(shaderProgram[0]); - glBindVertexArray(VAOs[0]); - glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); - glUseProgram(shaderProgram[1]); - glBindVertexArray(VAOs[1]); - glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); -// glDrawArrays(GL_TRIANGLES, 0, 3); - glfwSwapBuffers(window); - glfwPollEvents(); - } - - glDeleteBuffers(1, &VBO); - glDeleteVertexArrays(2, VAOs); - glDeleteBuffers(2, EBOs); - glDeleteProgram(shaderProgram[0]); - glDeleteProgram(shaderProgram[1]); - - glfwTerminate(); - return 0; - } -} \ No newline at end of file diff --git a/src/triangle.cpp b/src/triangle.cpp new file mode 100644 index 0000000..491b713 --- /dev/null +++ b/src/triangle.cpp @@ -0,0 +1,105 @@ +#include "triangle.h" +#include "iostream" +#include +using namespace std::literals::chrono_literals; +namespace TRIANGLE { + + void frameBufferSizeChange(GLFWwindow *window, int width, int height) { + glViewport(0, 0, width, height); + } + + void processInput(GLFWwindow *window) { + if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) { + glfwSetWindowShouldClose(window, true); + } + } + + void CheckShader(unsigned int shaderIndex, bool isPorgram) { + int successful; + char logInfo[512]; + if (isPorgram) { + glad_glGetProgramiv(shaderIndex, GL_LINK_STATUS, &successful); + } else { + glad_glGetShaderiv(shaderIndex, GL_COMPILE_STATUS, &successful); + } + if (!successful) { + if (isPorgram) { + glad_glGetProgramInfoLog(shaderIndex, 512, nullptr, logInfo); + } else { + glad_glGetShaderInfoLog(shaderIndex, 512, nullptr, logInfo); + } + std::cout << logInfo << std::endl; + } + } + + int Practice1() { + glfwInit(); + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + + GLFWwindow *window = glfwCreateWindow(800, 600, "Windows", nullptr, nullptr); + if (window == nullptr) { + return -1; + } + glfwMakeContextCurrent(window); + glfwSetWindowSizeCallback(window, frameBufferSizeChange); + + if (!gladLoadGLLoader((GLADloadproc) glfwGetProcAddress)) { + auto error = glad_glGetError(); + return static_cast(error); + } + + float vertices[] = { + 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, + -0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f + }; + + unsigned int VAO, VBO, EBO; + glGenVertexArrays(1, &VAO); + glGenBuffers(1, &VBO); + glGenBuffers(1, &EBO); + + glBindVertexArray(VAO); + glBindBuffer(GL_ARRAY_BUFFER, VBO); + + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void *) 0); + glEnableVertexAttribArray(0); + glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6*sizeof(float), (void*)(3*sizeof(float))); + glEnableVertexAttribArray(1); + glBindVertexArray(0); + + + auto shader = ShaderService("../../shaders/vertexShader.glsl", + "../../shaders/fragmentShader.glsl"); + + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + float pos = .0f; + while (!glfwWindowShouldClose(window)) { + processInput(window); + + glClearColor(.2f, .3f, .3f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + shader.Use(); + shader.SetUniform("position", pos+=0.001); +// std::this_thread::sleep_for(5ms); + + glBindVertexArray(VAO); +// glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); +// glUseProgram(shaderProgram[1]); + glDrawArrays(GL_TRIANGLES, 0, 3); + glfwSwapBuffers(window); + glfwPollEvents(); + } + + glDeleteBuffers(1, &VBO); + glDeleteVertexArrays(1, &VAO); + glDeleteBuffers(1, &EBO); + + glfwTerminate(); + return 0; + } +} \ No newline at end of file