fix: Mejorar obtención de texture ID en OpenGL ES
- Probar SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_NUMBER para ES - Probar SDL_PROP_TEXTURE_OPENGL_TEXTURE_NUMBER para Desktop - Añadir logs detallados para debug - No intentar bind si texture_id es 0 (prevenir GL_INVALID_ENUM) Refs: Error 0x500 en glBindTexture en RPi
This commit is contained in:
@@ -189,29 +189,34 @@ void OpenGLShader::createQuadGeometry() {
|
||||
}
|
||||
|
||||
GLuint OpenGLShader::getTextureID(SDL_Texture* texture) {
|
||||
if (!texture) return 1;
|
||||
if (!texture) {
|
||||
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "texture es nullptr");
|
||||
return 0;
|
||||
}
|
||||
|
||||
SDL_PropertiesID props = SDL_GetTextureProperties(texture);
|
||||
GLuint texture_id = 0;
|
||||
|
||||
// Intentar obtener ID de textura OpenGL
|
||||
texture_id = (GLuint)(uintptr_t)SDL_GetPointerProperty(props, "SDL.texture.opengl.texture", nullptr);
|
||||
|
||||
if (texture_id == 0) {
|
||||
texture_id = (GLuint)(uintptr_t)SDL_GetPointerProperty(props, "texture.opengl.texture", nullptr);
|
||||
}
|
||||
|
||||
if (texture_id == 0) {
|
||||
texture_id = (GLuint)SDL_GetNumberProperty(props, "SDL.texture.opengl.texture", 1);
|
||||
}
|
||||
|
||||
if (texture_id == 0) {
|
||||
SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION,
|
||||
"No se pudo obtener ID de textura OpenGL, usando 1 por defecto");
|
||||
texture_id = 1;
|
||||
}
|
||||
// Probar diferentes nombres de properties (Desktop vs ES)
|
||||
const char* property_names[] = {
|
||||
SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_NUMBER, // OpenGL ES
|
||||
SDL_PROP_TEXTURE_OPENGL_TEXTURE_NUMBER, // OpenGL Desktop
|
||||
"SDL.texture.opengl.texture", // Fallback legacy
|
||||
"texture.opengl.texture" // Fallback legacy
|
||||
};
|
||||
|
||||
for (const char* prop_name : property_names) {
|
||||
texture_id = (GLuint)SDL_GetNumberProperty(props, prop_name, 0);
|
||||
if (texture_id != 0) {
|
||||
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION,
|
||||
"Textura OpenGL obtenida via '%s': ID=%u", prop_name, texture_id);
|
||||
return texture_id;
|
||||
}
|
||||
}
|
||||
|
||||
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
||||
"No se pudo obtener ID de textura OpenGL con ninguna property");
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool OpenGLShader::init(SDL_Window* window,
|
||||
@@ -345,6 +350,15 @@ void OpenGLShader::render() {
|
||||
|
||||
// Obtener y bindear textura
|
||||
GLuint texture_id = getTextureID(back_buffer_);
|
||||
if (texture_id == 0) {
|
||||
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
||||
"No se pudo obtener texture_id, abortando render");
|
||||
// Restaurar estados y hacer fallback
|
||||
SDL_RenderTexture(renderer_, back_buffer_, nullptr, nullptr);
|
||||
SDL_RenderPresent(renderer_);
|
||||
return;
|
||||
}
|
||||
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
glBindTexture(GL_TEXTURE_2D, texture_id);
|
||||
checkGLError("glBindTexture");
|
||||
|
||||
Reference in New Issue
Block a user