unificats els shaders glsl en un sol fitxer

corregida la inicialització de opengl i shaders
This commit is contained in:
2025-10-02 17:11:38 +02:00
parent 79033346c0
commit 7946ea54a6
6 changed files with 53 additions and 242 deletions

View File

@@ -50,6 +50,8 @@ PFNGLGETPROGRAMIVPROC glGetProgramiv;
PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog;
PFNGLUSEPROGRAMPROC glUseProgram;
PFNGLDELETEPROGRAMPROC glDeleteProgram;
PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation;
PFNGLUNIFORM2FPROC glUniform2f;
bool initGLExtensions() {
glCreateShader = (PFNGLCREATESHADERPROC)SDL_GL_GetProcAddress("glCreateShader");
@@ -66,11 +68,13 @@ bool initGLExtensions() {
glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)SDL_GL_GetProcAddress("glGetProgramInfoLog");
glUseProgram = (PFNGLUSEPROGRAMPROC)SDL_GL_GetProcAddress("glUseProgram");
glDeleteProgram = (PFNGLDELETEPROGRAMPROC)SDL_GL_GetProcAddress("glDeleteProgram");
glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)SDL_GL_GetProcAddress("glGetUniformLocation");
glUniform2f = (PFNGLUNIFORM2FPROC)SDL_GL_GetProcAddress("glUniform2f");
return glCreateShader && glShaderSource && glCompileShader && glGetShaderiv &&
glGetShaderInfoLog && glDeleteShader && glAttachShader && glCreateProgram &&
glLinkProgram && glValidateProgram && glGetProgramiv && glGetProgramInfoLog &&
glUseProgram && glDeleteProgram;
glUseProgram && glDeleteProgram && glGetUniformLocation && glUniform2f;
}
#endif
@@ -269,6 +273,19 @@ bool init(SDL_Window *window, SDL_Texture *back_buffer_texture, const std::strin
usingOpenGL = false;
return false;
}
// Establecer el uniform TextureSize inmediatamente después de compilar
// Los uniforms persisten en el programa una vez establecidos
glUseProgram(programId);
GLint textureSizeLocation = glGetUniformLocation(programId, "TextureSize");
if (textureSizeLocation != -1) {
glUniform2f(textureSizeLocation, tex_size.x, tex_size.y);
checkGLError("glUniform2f(TextureSize) - init");
} else {
SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION,
"Warning: No se pudo encontrar el uniform 'TextureSize' en el shader");
}
glUseProgram(0); // Deseleccionar el programa
} else {
SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION, "ADVERTENCIA: El driver del renderer no es OpenGL (%s).", render_name);
usingOpenGL = false;
@@ -391,6 +408,32 @@ void render() {
}
}
void setTextureSize(float width, float height) {
if (!usingOpenGL || programId == INVALID_PROGRAM_ID) {
return;
}
// Guardar el programa actual
GLint oldProgramId;
glGetIntegerv(GL_CURRENT_PROGRAM, &oldProgramId);
// Usar nuestro programa
glUseProgram(programId);
// Obtener la ubicación del uniform TextureSize
GLint textureSizeLocation = glGetUniformLocation(programId, "TextureSize");
if (textureSizeLocation != -1) {
glUniform2f(textureSizeLocation, width, height);
checkGLError("glUniform2f(TextureSize)");
} else {
SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION,
"Warning: No se pudo encontrar el uniform 'TextureSize' en el shader");
}
// Restaurar el programa anterior
glUseProgram(oldProgramId);
}
void cleanup() {
if (programId != INVALID_PROGRAM_ID) {
glDeleteProgram(programId);

View File

@@ -6,4 +6,5 @@
namespace shader {
bool init(SDL_Window *ventana, SDL_Texture *texturaBackBuffer, const std::string &vertexShader, const std::string &fragmentShader = "");
void render();
void setTextureSize(float width, float height); // Establece el tamaño de textura como uniform
} // namespace shader

View File

@@ -56,7 +56,6 @@ Screen::Screen()
#endif
// Inicializa los shaders
SDL_RenderTexture(renderer_, game_canvas_, nullptr, nullptr);
loadShaders();
shader::init(window_, game_canvas_, shader_source_);
}
@@ -227,7 +226,7 @@ void Screen::renderInfo() {
// Carga el contenido del archivo GLSL
void Screen::loadShaders() {
if (shader_source_.empty()) {
const std::string GLSL_FILE = param.game.game_area.rect.h == 256 ? "crtpi_256.glsl" : "crtpi_240.glsl";
const std::string GLSL_FILE = "crtpi.glsl";
auto data = Asset::get()->loadData(GLSL_FILE);
if (!data.empty()) {
shader_source_ = std::string(data.begin(), data.end());