migrat a OpenGL 3.3 Core Profile

This commit is contained in:
2025-10-02 18:15:39 +02:00
parent e347e04d33
commit 6ff7ccf69a
12 changed files with 981 additions and 643 deletions

View File

@@ -8,9 +8,9 @@
#include <memory> // Para allocator, shared_ptr, make_shared, __shared_ptr_access
#include <string> // Para operator+, char_traits, to_string, string
#include "asset.h" // Para Asset
#include "external/jail_shader.h" // Para init, render
#include "mouse.h" // Para updateCursorVisibility
#include "asset.h" // Para Asset
#include "mouse.h" // Para updateCursorVisibility
#include "rendering/opengl/opengl_shader.h" // Para OpenGLShader
#include "options.h" // Para VideoOptions, video, WindowOptions, window
#include "param.h" // Para Param, param, ParamGame, ParamDebug
#include "text.h" // Para Text, Text::COLOR, Text::STROKE
@@ -57,7 +57,8 @@ Screen::Screen()
// Inicializa los shaders
loadShaders();
shader::init(window_, game_canvas_, shader_source_);
shader_backend_ = std::make_unique<Rendering::OpenGLShader>();
shader_backend_->init(window_, game_canvas_, vertex_shader_source_, fragment_shader_source_);
}
// Destructor
@@ -97,8 +98,8 @@ void Screen::renderPresent() {
SDL_SetRenderTarget(renderer_, nullptr);
clean();
if (Options::video.shaders) {
shader::render();
if (Options::video.shaders && shader_backend_) {
shader_backend_->render();
} else {
SDL_RenderTexture(renderer_, game_canvas_, nullptr, nullptr);
SDL_RenderPresent(renderer_);
@@ -223,13 +224,20 @@ void Screen::renderInfo() {
}
}
#endif
// Carga el contenido del archivo GLSL
// Carga el contenido de los archivos GLSL
void Screen::loadShaders() {
if (shader_source_.empty()) {
const std::string GLSL_FILE = "crtpi.glsl";
auto data = Asset::get()->loadData(GLSL_FILE);
if (vertex_shader_source_.empty()) {
const std::string VERTEX_FILE = "crtpi_vertex.glsl";
auto data = Asset::get()->loadData(VERTEX_FILE);
if (!data.empty()) {
shader_source_ = std::string(data.begin(), data.end());
vertex_shader_source_ = std::string(data.begin(), data.end());
}
}
if (fragment_shader_source_.empty()) {
const std::string FRAGMENT_FILE = "crtpi_fragment.glsl";
auto data = Asset::get()->loadData(FRAGMENT_FILE);
if (!data.empty()) {
fragment_shader_source_ = std::string(data.begin(), data.end());
}
}
}
@@ -238,7 +246,10 @@ void Screen::loadShaders() {
void Screen::initShaders() {
if (Options::video.shaders) {
loadShaders();
shader::init(window_, game_canvas_, shader_source_);
if (!shader_backend_) {
shader_backend_ = std::make_unique<Rendering::OpenGLShader>();
}
shader_backend_->init(window_, game_canvas_, vertex_shader_source_, fragment_shader_source_);
}
}
@@ -310,6 +321,10 @@ auto Screen::initSDLVideo() -> bool {
SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION,
"Warning: Failed to set OpenGL hint!");
}
// Configurar contexto OpenGL 3.3 Core Profile
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
#endif
// Crear ventana