Shaders
main.cpp
#define GLEW_STATIC #include <GL/glew.h> #include <GLFW/glfw3.h> #include <bits/stdc++.h> #include "Shader.h" float vertices[] = { // positions // colors -0.5f, -0.5f, 0.3f, 1.0f, 0.0f, 0.0f, // bottom right 0.5f, -0.9f, 0.0f, 0.0f, 1.0f, 0.0f, // bottom left 0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f, // top 0.8f, 0.8f, 0.0f, 1.0f, 0.0f, 1.0f }; unsigned int indices[] = { // 注意索引从0开始! 0, 1, 2, // 第一个三角形 2, 3, 1 // 第二个三角形 }; void HandleInput(GLFWwindow* window) { if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) { glfwSetWindowShouldClose(window, true); } } int main() { 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, "First Window", NULL, NULL); if (window == NULL) { std::cout << "Somethong wrong happen" << std::endl; glfwTerminate(); return -1; } glfwMakeContextCurrent(window); // INIT GLEW glewExperimental = true; if (glewInit() != GLEW_OK) { std::cout << "INIT GLEW FAIL" << std::endl; glfwTerminate(); return -1; } glViewport(0, 0, 800, 600); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); // 开启面剔除 glEnable(GL_CULL_FACE); glCullFace(GL_BACK); Shader testShader = Shader("vertexCode.txt", "fragmentCode.txt"); unsigned int VAO; glGenVertexArrays(1, &VAO); glBindVertexArray(VAO); unsigned int VBO; glGenBuffers(1, &VBO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); unsigned int EBO; glGenBuffers(1, &EBO); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, 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); while (!glfwWindowShouldClose(window)) { HandleInput(window); glClearColor(0.5f, 0.2f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); testShader.UseShader(); glBindVertexArray(VAO); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); //glDrawArrays(GL_TRIANGLES, 0, 3); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); glfwSwapBuffers(window); glfwPollEvents(); } glDeleteVertexArrays(1, &VAO); glDeleteBuffers(1, &VBO); glfwTerminate(); }
Shader.cpp
#include "Shader.h" #include <iostream> #include <fstream> #include <sstream> #include <GL/glew.h> #include <GLFW/glfw3.h> #include <bits/stdc++.h> Shader::Shader(const char* vertexPath, const char* fragmentPath) { std::string vertexCode; std::string fragmentCode; std::ifstream vertexFile; std::ifstream fragmentFile; std::stringstream vertexSStream, fragmentSStream; vertexFile.open(vertexPath); fragmentFile.open(fragmentPath); vertexFile.exceptions(std::ifstream::failbit || std::ifstream::badbit); fragmentFile.exceptions(std::ifstream::failbit || std::ifstream::badbit); try { if (!vertexFile.is_open() || !fragmentFile.is_open()) { throw std::exception("OPEN FILE ERROR"); } // 读取文件的缓冲内容到数据流中 vertexSStream << vertexFile.rdbuf(); fragmentSStream << fragmentFile.rdbuf(); // 关闭文件处理器 vertexFile.close(); fragmentFile.close(); // 转换数据流到string vertexCode = vertexSStream.str(); fragmentCode = fragmentSStream.str(); vertexSource = vertexCode.c_str(); fragmentSource = fragmentCode.c_str(); unsigned int vertex, fragment; vertex = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertex, 1, &vertexSource, NULL); glCompileShader(vertex); fragment = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragment, 1, &fragmentSource, NULL); glCompileShader(fragment); ID = glCreateProgram(); glAttachShader(ID, vertex); glAttachShader(ID, fragment); glLinkProgram(ID); glDeleteShader(vertex); glDeleteShader(fragment); } catch (std::ifstream::failure &e) { std::cout << "ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ" << std::endl; } } Shader::~Shader() { } void Shader::UseShader() { glUseProgram(ID); }
Shader.h
#pragma once #include <string> class Shader { public: // shader program id unsigned int ID; const char* vertexSource; const char* fragmentSource; Shader(const char* vertexPath, const char* fragmentPath); ~Shader(); void UseShader(); };
vertextCode & fragmentCode
#version 330 core layout (location = 0) in vec3 aPos; layout (location = 1) in vec3 aColor; out vec4 ourColor; void main() { gl_Position = vec4(aPos, 1.0); ourColor = vec4(aColor, 1.0); } -------------------------------------------------------- -------------------------------------------------------- #version 330 core out vec4 FragColor; in vec4 ourColor; void main() { FragColor = ourColor; }
发表评论