Monday, February 2, 2026

Texturas, UV, Filter, Mipmaps y Anisotropic / Blender y Godot


En este nuevo post vamos a continuar hablando un poco acerca de texturas, desde Blender a Godot, y algunos conceptos que son clave para preservar el estilo pixel art hard edge sin que, al exportarlo, pierda definición.

Uno de los problemas que encontré es que, al posicionar los objetos en Godot, las texturas de dichos objetos no eran fieles a la definición que tenían cuando las trabajaba en Marmoset Hexels. Finalmente encontré la solución definitiva y el paso a paso de cómo arreglar esto, pero primero debemos entender lo siguiente.


Todo comienza en Blender. Ya tenemos la textura bien posicionada en el objeto y el siguiente paso es ajustar la interpolación de la textura. Blender, por defecto, interpola las texturas en modo Linear y eso mata el filo del pixel art.

Entonces, para solucionar esto, vamos a Image Texture Node y cambiamos la interpolación de Linear a Closest. Dejamos Projection en Flat y Extension en Repeat.

Asesino silencioso: Mipmaps.

Blender genera mipmaps automáticamente y difumina la textura. En resumidas cuentas, para el pixel art y las texturas duras eso es veneno.

Por eso, la solución es ir a Image Texture y, en opciones avanzadas, desactivar los mipmaps o reducir el sampling a OFF. En caso de no ver esta opción, vamos a Edit, luego Preferences, luego Viewport, y en Textures colocamos el Anisotropic Filtering en 0.

Adicionalmente, si vemos una opción llamada Texture Limit, la desactivamos o la ponemos en No Limit.


Después nos queda ir a Color Management. Primero vamos a Render Properties, bajamos hasta Color Management y dejamos los siguientes valores.

View Transform: Standard
Look: None

Con esto, en Blender ya tenemos configurada una correcta visualización de las texturas pixel art.

Ahora seguimos repasando algunos conceptos clave para entender mejor los próximos cambios a realizar en Godot.

¿Qué es un Filter?

El filtrado resuelve cómo se ve una textura cuando se escala, ya sea más grande o más chica. Es decir, el motor tiene que decidir cómo calcular los píxeles nuevos.

Antes, en Blender, ajustamos Nearest o Closest. Cuando modificamos esto, el resultado es un look pixel art, con bordes serruchados y nada borroso.


Linear, Bilinear y Trilinear.

En este apartado, el motor mezcla píxeles próximos. El resultado es una imagen más suave, pero algo borrosa.

En Blender lo vemos como Interpolation y en Godot como Filter.

El Filter decide si la textura se ve nítida como un sprite viejo o suave como una foto.

¿Qué hacen los mipmaps?

Los mipmaps resuelven qué pasa cuando una textura se ve de lejos.

Con pixel art, los mipmaps suelen arruinar el look porque introducen blur.

¿Qué es el Anisotropic Filtering o Anisotropic?

Básicamente resuelve cómo se ven las texturas desde un ángulo. El ejemplo clásico es un piso, un camino o una pared larga vista de costado.

Sin anisotrópico, la textura se vuelve borrosa muy rápido a distancia. Con anisotrópico activado, el motor toma más muestras en la dirección correcta y la textura se mantiene nítida por mucho más tiempo.


Desactivar Filter, Mipmaps y Anisotropic en un material dentro de Godot.

Aunque el modelo venga bien configurado desde Blender, Godot puede volver a suavizar las texturas a nivel de material, así que este paso es clave para preservar el estilo pixel art hard edge.

En el FileSystem de Godot, localizar el material del objeto, por ejemplo el material embebido en la escena.

Si el material está dentro de una escena tscn, abrir la escena y seleccionar el objeto que lo usa.

Seleccionar el material del objeto. En el panel de la derecha, el Inspector, se mostrarán sus propiedades.

Dentro del material, buscar la sección Albedo o Albedo Texture. Ahí es donde Godot aplica los ajustes que afectan directamente a la textura.

En las opciones de la textura del Albedo, configurar lo siguiente.

Filter en OFF
Mipmaps en OFF
Anisotropic en OFF

Guardar el material.

Con estos tres valores desactivados, Godot deja de suavizar la textura y respeta el pixel exacto, manteniendo bordes duros y definición limpia, ideal para estilos pixel art, boomer shooters o estéticas retro.

Si una textura se ve correcta en Blender pero borrosa en Godot, casi siempre el problema está en estos flags del material, no en el UV ni en la imagen original.

Entonces, para concluir este breve post que queda como una nota de aprendizaje, la regla práctica para Godot y Blender es la siguiente.

Para pixel art, boomer shooter o FPS genérico de los años noventa.

Filter en Nearest
Mipmaps en OFF
Anisotropic en OFF

Para un estilo más moderno.

Filter en Linear
Mipmaps en ON
Anisotropic en 8X o 16X

No hay nada mágico acá. Son herramientas para engañar al ojo humano, que es muy bueno detectando patrones raros. Bien usadas, desaparecen. Mal usadas, gritan.

Y cuando una textura se ve mal, casi siempre uno de estos tres está configurado en contra del estilo del juego.

Wednesday, January 21, 2026

Props low-mid poly, Blender e Exportación (.glb)

Este es mi primer post de 2026 y, con el inicio de un nuevo año, también llegan nuevos aprendizajes. Cuando uno se concentra en algo específico y practica de forma constante, los días y las semanas pasan rápido, casi sin darse cuenta.

En este post voy a detallar el paso a paso para lograr una exportación correcta desde Blender hacia Godot, evitando artefactos visuales comunes que suelen aparecer cuando un modelo 3D no está bien preparado. Después de varios días de prueba y error, logré que un modelo se vea correctamente en el motor, sin líneas extrañas ni problemas de sombreado.

En este caso en particular, terminé un modelo de auto low poly, trabajado íntegramente en Blender. Actualmente estoy desarrollando varios objetos props de forma simultánea que luego debo incorporar al juego, así que me pareció una buena idea comenzar a documentar este proceso desde ahora.

Nota: Este flujo está probado en Godot 3.6 usando GLES3. En Godot 4 algunos comportamientos pueden variar.

Paso 1: Texturas, UVs y el problema del "Texture Bleeding"


Una vez finalizado el modelo, es fundamental prestar atención al mapa UV y a la textura. En este punto recomiendo NO usar un fondo transparente en la textura del modelo.

En motores de renderizado como Godot 3.6 (especialmente con GLES3), la transparencia se maneja de forma distinta a las superficies opacas. Acá aparece un problema muy común llamado Texture Bleeding.

Cuando una textura tiene transparencia (canal alpha) y Godot genera los Mipmaps —versiones más pequeñas de la textura que se usan cuando el objeto está lejos—, los píxeles transparentes de los bordes se mezclan con los píxeles de color. Esto genera un artefacto visual que se manifiesta como líneas blancas o claras que aparecen y desaparecen según la distancia de la cámara.

Para aclararlo mejor: cuando el fondo de la textura es transparente, Godot suele rellenar ese “vacío” con blanco o gris claro por defecto. Ese color se filtra hacia las islas UV en los mipmaps, creando esas líneas visibles a distancia. Cuando el jugador se acerca al objeto, el problema desaparece porque se usa la textura original en alta resolución.

Solución recomendada

👉 Usar siempre un fondo sólido en la textura.

Creá una capa debajo de todo y rellenala con un gris oscuro o negro. De esta forma, la textura será completamente opaca y Godot la tratará como un objeto sólido. Esto evita el bleeding y hace que las sombras y normales funcionen correctamente.

Paso 2: Ajustes finales en Blender

Si el modelo está compuesto por varios elementos, primero hay que unir los objetos:

  • Unir objetos: Ctrl + J

Antes de exportar, asegurate de que la geometría esté “sana”:

Merge by Distance

En Modo Edición:

  • Seleccioná todo (A)

  • Presioná MMerge by Distance

  • Usá un valor aproximado de 0.001 m

Esto elimina vértices duplicados que pueden causar parpadeos o errores de sombreado.

Weighted Normal

  • Agregá el modificador Weighted Normal

  • Colocalo al final de la lista

  • Activá Keep Sharp

  • En el objeto, activá Auto Smooth con un valor de 30° o 60°, según el redondeo que busques

Esto es clave para que el modelo low poly se vea limpio y sin sombras raras en Godot.

Paso 3: Configuración de exportación (.glb)

Al exportar desde Blender:

File → Export → glTF 2.0 (.glb)

Usá estos ajustes:

Include

  • Selected Objects 

Transform

  • +Y Up activado

Geometry

  • Apply Modifiers: SÍ (imprescindible para que el Weighted Normal quede grabado)

  • UVs:

  • Normals:

  • Tangents: SÍ (muy importante para evitar reflejos falsos en los bordes)

  • Vertex Colors:

Con esta configuración, Godot no “inventa” información extra y el modelo se importa tal como fue trabajado en Blender.

Cierre

Después de varios días de pruebas, este flujo fue el único que me dio resultados consistentes, sin artefactos visuales, parpadeos ni líneas indeseadas. Es un proceso simple, pero si se omite alguno de estos pasos, los errores aparecen tarde o temprano.

Voy a seguir documentando este tipo de ajustes a medida que avance con más props y modelos para el proyecto, ya que estos detalles hacen una gran diferencia en el resultado final dentro del motor.

Thursday, December 18, 2025

Nuevos proyectos y novedades

Vuelvo a publicar después de mucho tiempo, y la verdad es que pasaron muchas cosas. Durante este período estuve trabajando en distintos proyectos, probando nuevas técnicas y tecnologías. Mi proyecto personal, el juego de PC, sigue en marcha, aunque no es una tarea sencilla. Cada sprite, cada polígono y cada animación llevan muchísimo tiempo, más aún considerando que todo lo realizo de manera individual. Por eso, hoy me resulta difícil definir una fecha concreta de finalización.

En este post quiero compartir un "mockup" inicial del juego, tiene una base de boomer shooter, aunque con varias modificaciones que posiblemente terminen convirtiéndolo en algo más interesante en su versión final. Adjunto capturas de pantalla y un video del estado actual en el siguiente post. Todos los sprites y texturas fueron realizados por mí. Este prototipo inicial me sirve como referencia para definir paletas de color, texturas y cómo estas interactúan entre sí. La iluminación también juega un rol clave: es fundamental para construir atmósferas y escenarios que generen inmersión.

El proyecto tiene su complejidad, pero la idea es mantener un "scope" controlado. De lo contrario, se vuelve imposible de terminar. Si algo aprendí con el tiempo es que el verdadero éxito está en empezar los proyectos… y terminarlos.

Para la creación de sprites me sentí muy cómodo trabajando con Marmoset Hexels 3 (mis 1.849 horas lo confirman), aunque Aseprite también es una excelente herramienta. Me gusta combinar pixel art con texturas del mundo real para lograr una mayor profundidad visual y evitar una estética demasiado ficticia.

Otro apartado fundamental es el sonido: ambientes bien trabajados y, en algunos momentos, música sutil. Nada extravagante. La idea es que el jugador se sumerja en el mundo, que el entorno cuente la historia y que lo visual y lo sonoro lo acompañen en la exploración. Esta técnica fue clave en muchos grandes títulos; Half-Life es un claro ejemplo. Y no es casualidad que hoy en día haya una fascinación actual por el retro gaming y el low poly que tiene mucho que ver con eso: simplicidad, buen diseño e inmersión.

Si hay un aprendizaje central en todo este proceso, es que las limitaciones técnicas potencian la creatividad. Tal vez por eso muchos juegos de los años 90 y principios de los 2000 eran tan ingeniosos a nivel técnico. El hardware imponía límites claros. Hoy, con motores como Unreal Engine, muchos juegos terminan viéndose similares: altísimo nivel de detalle, costos elevados y, en muchos casos, una pérdida de la magia que tenían los viejos juegos en primera persona.

Adjunto en este post imágenes de distintas secciones del prototipo inicial del juego. Todo esto sigue siendo un "work in progress". Actualmente estoy trabajando con Godot y me siento muy cómodo con el motor.

En los próximos posts iré compartiendo avances y aprendizajes, especialmente problemas y errores, que son los que más disfruto analizar. Creo que documentar todo el proceso previo a una publicación final es tan importante como el resultado en sí.







Con el tiempo, también me gustaría publicar estos contenidos en paralelo en distintos sitios (incluido LinkedIn, en mi cuenta personal), ya que Blogger hoy en día no tiene el tráfico que solía tener.

Por eso, a modo de cierre, quiero dejar registradas cada una de las funcionalidades que vaya incorporando al juego, con la idea de que este proceso también pueda servirle a otros. Al final, de eso se trata: de compartir, aprender y enriquecerse con la experiencia de crear y trabajar con distintas herramientas.

Sin más, nos vemos en el próximo post!!.