unificats els shaders glsl en un sol fitxer
corregida la inicialització de opengl i shaders
This commit is contained in:
45
source/external/jail_shader.cpp
vendored
45
source/external/jail_shader.cpp
vendored
@@ -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);
|
||||
|
||||
1
source/external/jail_shader.h
vendored
1
source/external/jail_shader.h
vendored
@@ -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
|
||||
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user