#pragma once #include "../shader_backend.hpp" #ifdef __APPLE__ #include #else #include #endif namespace Rendering { /** * @brief Backend de shaders usando OpenGL 3.3 Core Profile * * Implementa el renderizado de shaders usando APIs modernas de OpenGL: * - VAO (Vertex Array Objects) * - VBO (Vertex Buffer Objects) * - Shaders GLSL #version 330 core */ class OpenGLShader : public ShaderBackend { public: OpenGLShader() = default; ~OpenGLShader() override; auto init(SDL_Window* window, SDL_Texture* texture, const std::string& vertex_source, const std::string& fragment_source) -> bool override; void render() override; void setTextureSize(float width, float height) override; void cleanup() final; [[nodiscard]] auto isHardwareAccelerated() const -> bool override { return is_initialized_; } private: // Funciones auxiliares auto initGLExtensions() -> bool; auto compileShader(const std::string& source, GLenum shader_type) -> GLuint; auto linkProgram(GLuint vertex_shader, GLuint fragment_shader) -> GLuint; void createQuadGeometry(); static auto getTextureID(SDL_Texture* texture) -> GLuint; static void checkGLError(const char* operation); // Estado SDL SDL_Window* window_ = nullptr; SDL_Renderer* renderer_ = nullptr; SDL_Texture* back_buffer_ = nullptr; // Estado OpenGL GLuint program_id_ = 0; GLuint vao_ = 0; // Vertex Array Object GLuint vbo_ = 0; // Vertex Buffer Object GLuint ebo_ = 0; // Element Buffer Object // Ubicaciones de uniforms GLint texture_size_location_ = -1; // TamaƱos int window_width_ = 0; int window_height_ = 0; float texture_width_ = 0.0F; float texture_height_ = 0.0F; // Estado bool is_initialized_ = false; #ifndef __APPLE__ // Punteros a funciones OpenGL en Windows/Linux PFNGLCREATESHADERPROC glCreateShader = nullptr; PFNGLSHADERSOURCEPROC glShaderSource = nullptr; PFNGLCOMPILESHADERPROC glCompileShader = nullptr; PFNGLGETSHADERIVPROC glGetShaderiv = nullptr; PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog = nullptr; PFNGLDELETESHADERPROC glDeleteShader = nullptr; PFNGLATTACHSHADERPROC glAttachShader = nullptr; PFNGLCREATEPROGRAMPROC glCreateProgram = nullptr; PFNGLLINKPROGRAMPROC glLinkProgram = nullptr; PFNGLVALIDATEPROGRAMPROC glValidateProgram = nullptr; PFNGLGETPROGRAMIVPROC glGetProgramiv = nullptr; PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog = nullptr; PFNGLUSEPROGRAMPROC glUseProgram = nullptr; PFNGLDELETEPROGRAMPROC glDeleteProgram = nullptr; PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation = nullptr; PFNGLUNIFORM2FPROC glUniform2f = nullptr; PFNGLGENVERTEXARRAYSPROC glGenVertexArrays = nullptr; PFNGLBINDVERTEXARRAYPROC glBindVertexArray = nullptr; PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays = nullptr; PFNGLGENBUFFERSPROC glGenBuffers = nullptr; PFNGLBINDBUFFERPROC glBindBuffer = nullptr; PFNGLBUFFERDATAPROC glBufferData = nullptr; PFNGLDELETEBUFFERSPROC glDeleteBuffers = nullptr; PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer = nullptr; PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray = nullptr; #endif }; } // namespace Rendering