#pragma once #include #include "shader.h" #include "logger.h" VertexShader::VertexShader(const std::string& source){ _shaderId = OPENGL_EXTRA_FUNCTIONS->glCreateShader(GL_VERTEX_SHADER); compile(source); } void VertexShader::compile(const std::string& source) { const char* sourcePtr = source.c_str(); OPENGL_EXTRA_FUNCTIONS->glShaderSource(_shaderId, 1, &sourcePtr, nullptr); OPENGL_EXTRA_FUNCTIONS->glCompileShader(_shaderId); int success; char infoLog[512]; OPENGL_EXTRA_FUNCTIONS->glGetShaderiv(_shaderId, GL_COMPILE_STATUS, &success); if (!success) { OPENGL_EXTRA_FUNCTIONS->glGetShaderInfoLog(_shaderId, 512, nullptr, infoLog); Logger::error("Vertex shader compilation failed: " + std::string(infoLog)); } } FragmentShader::FragmentShader(const std::string& source){ _shaderId = OPENGL_EXTRA_FUNCTIONS->glCreateShader(GL_FRAGMENT_SHADER); compile(source); } void FragmentShader::compile(const std::string& source) { const char* sourcePtr = source.c_str(); OPENGL_EXTRA_FUNCTIONS->glShaderSource(_shaderId, 1, &sourcePtr, nullptr); OPENGL_EXTRA_FUNCTIONS->glCompileShader(_shaderId); int success; char infoLog[512]; OPENGL_EXTRA_FUNCTIONS->glGetShaderiv(_shaderId, GL_COMPILE_STATUS, &success); if (!success) { OPENGL_EXTRA_FUNCTIONS->glGetShaderInfoLog(_shaderId, 512, nullptr, infoLog); Logger::error("Vertex shader compilation failed: " + std::string(infoLog)); } } GeometryShader::GeometryShader(const std::string& source) { _shaderId = OPENGL_EXTRA_FUNCTIONS->glCreateShader(GL_GEOMETRY_SHADER); compile(source); } void GeometryShader::compile(const std::string& source) { const char* sourcePtr = source.c_str(); OPENGL_EXTRA_FUNCTIONS->glShaderSource(_shaderId, 1, &sourcePtr, nullptr); OPENGL_EXTRA_FUNCTIONS->glCompileShader(_shaderId); int success; char infoLog[512]; OPENGL_EXTRA_FUNCTIONS->glGetShaderiv(_shaderId, GL_COMPILE_STATUS, &success); if (!success) { OPENGL_EXTRA_FUNCTIONS->glGetShaderInfoLog(_shaderId, 512, nullptr, infoLog); Logger::error("Vertex shader compilation failed: " + std::string(infoLog)); } } ShaderProgram::ShaderProgram() { _programId = OPENGL_EXTRA_FUNCTIONS->glCreateProgram(); } ShaderProgram::ShaderProgram(VertexShader vertexShader) { _programId = OPENGL_EXTRA_FUNCTIONS->glCreateProgram(); OPENGL_EXTRA_FUNCTIONS->glAttachShader(_programId, vertexShader.shaderId()); OPENGL_EXTRA_FUNCTIONS->glLinkProgram(_programId); vertexShader.dispose(); } ShaderProgram::ShaderProgram(FragmentShader fragmentShader) { _programId = OPENGL_EXTRA_FUNCTIONS->glCreateProgram(); OPENGL_EXTRA_FUNCTIONS->glAttachShader(_programId, fragmentShader.shaderId()); OPENGL_EXTRA_FUNCTIONS->glLinkProgram(_programId); fragmentShader.dispose(); } ShaderProgram::ShaderProgram(GeometryShader geometryShader) { _programId = OPENGL_EXTRA_FUNCTIONS->glCreateProgram(); OPENGL_EXTRA_FUNCTIONS->glAttachShader(_programId, geometryShader.shaderId()); OPENGL_EXTRA_FUNCTIONS->glLinkProgram(_programId); geometryShader.dispose(); } ShaderProgram::ShaderProgram(VertexShader vertexShader, FragmentShader fragmentShader) { _programId = OPENGL_EXTRA_FUNCTIONS->glCreateProgram(); OPENGL_EXTRA_FUNCTIONS->glAttachShader(_programId, vertexShader.shaderId()); OPENGL_EXTRA_FUNCTIONS->glAttachShader(_programId, fragmentShader.shaderId()); OPENGL_EXTRA_FUNCTIONS->glLinkProgram(_programId); vertexShader.dispose(); fragmentShader.dispose(); } ShaderProgram::ShaderProgram(VertexShader vertexShader, GeometryShader geometryShader) { _programId = OPENGL_EXTRA_FUNCTIONS->glCreateProgram(); OPENGL_EXTRA_FUNCTIONS->glAttachShader(_programId, vertexShader.shaderId()); OPENGL_EXTRA_FUNCTIONS->glAttachShader(_programId, geometryShader.shaderId()); OPENGL_EXTRA_FUNCTIONS->glLinkProgram(_programId); vertexShader.dispose(); geometryShader.dispose(); } ShaderProgram::ShaderProgram(FragmentShader fragmentShader, GeometryShader geometryShader) { _programId = OPENGL_EXTRA_FUNCTIONS->glCreateProgram(); OPENGL_EXTRA_FUNCTIONS->glAttachShader(_programId, fragmentShader.shaderId()); OPENGL_EXTRA_FUNCTIONS->glAttachShader(_programId, geometryShader.shaderId()); OPENGL_EXTRA_FUNCTIONS->glLinkProgram(_programId); fragmentShader.dispose(); geometryShader.dispose(); } ShaderProgram::ShaderProgram(VertexShader vertexShader, FragmentShader fragmentShader, GeometryShader geometryShader) { _programId = OPENGL_EXTRA_FUNCTIONS->glCreateProgram(); OPENGL_EXTRA_FUNCTIONS->glAttachShader(_programId, vertexShader.shaderId()); OPENGL_EXTRA_FUNCTIONS->glAttachShader(_programId, fragmentShader.shaderId()); OPENGL_EXTRA_FUNCTIONS->glAttachShader(_programId, geometryShader.shaderId()); OPENGL_EXTRA_FUNCTIONS->glLinkProgram(_programId); vertexShader.dispose(); fragmentShader.dispose(); geometryShader.dispose(); }