WhatsApp Discord
Fix ZzzLodTerrain en Source 5.2 MudinhoX - Source Mu - Mu Server Files
 

Noticias:

SMF - Just Installed!

Menú principal

Fix ZzzLodTerrain en Source 5.2 MudinhoX

Publicado por Dakosmu, Nov 26, 2025, 06:50 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Dakosmu

Fix ZzzLodTerrain  en Source 5.2 MudinhoX

Regístrate para ver el enlace

Tutorial: Reparar Manchas Negras y Renderizado Incompleto del Terreno (ZzzLodTerrain.cpp)

Este tutorial se enfoca en corregir dos problemas comunes de renderizado en tu motor 3D, basándose en los fragmentos de código de los archivos de terreno proporcionados.

Sección 1: Solucionar las Manchas Negras de Iluminación

Las manchas negras suelen aparecer cuando el cálculo de luz falla para un vértice o punto, y el sistema intenta compensar de manera incorrecta, o simplemente no aplica luz.

Paso 1: Localizar el Bloque de Propagación de Luz

Abre el archivo ZzzLodTerrain.cpp. Busca la sección que procesa la matriz LightTable después de la llamada a RequestTerrainLight.

Paso 2: Identificar el Error Crítico en la Propagación

El código original parece estar diseñado para propagar la luz de un punto iluminado a un punto oscuro. Sin embargo, las funciones Vector(0.f,0.f,0.f, ...) están ESTABLECIENDO A CERO el punto vecino iluminado, en lugar de copiar su luz.

  • Código Original (Problema): Si la luz del punto i es nula, el código sobrescribe el punto i-1 o i+1 con luz negra (0.f).

// Bucle 1 (Propagación hacia adelante)
for(int i=1;i<=(int)Num;i++)
{
if(LightTable[i][0]<=0.f)
{
// ¡PELIGRO! Esto establece a negro la luz en i-1
Vector(0.f,0.f,0.f,LightTable[i-1]);
}
}

// Bucle 2 (Propagación hacia atrás)
for(int i=(int)Num-1;i>=0;i--)
{
if(LightTable[i][0]<=0.f)
{
// ¡PELIGRO! Esto establece a negro la luz en i+1
Vector(0.f,0.f,0.f,LightTable[i+1]);
}
}

Paso 3: Aplicar la Corrección (Copiar Luz en lugar de Anularla)

Necesitas reemplazar la función Vector que establece a cero con una función que COPIE los valores del vecino. Asumiendo que existe una función VectorCopy(Origen, Destino) en tu librería, la corrección es la siguiente:

  • Corrección Sugerida: Reemplazar la línea que crea el cero por una que copia el vector de luz del vecino.

// Bucle 1 (Propagación hacia adelante: i-1 -> i)
for(int i=1;i<=(int)Num;i++)
{
if(LightTable[i][0]<=0.f)
{
// Si el punto 'i' es oscuro, copia la luz del punto anterior 'i-1'
VectorCopy(LightTable[i-1], LightTable[i]);
}
}

// Bucle 2 (Propagación hacia atrás: i+1 -> i)
for(int i=(int)Num-1;i>=0;i--)
{
if(LightTable[i][0]<=0.f)
{
// Si el punto 'i' es oscuro, copia la luz del punto siguiente 'i+1'
VectorCopy(LightTable[i+1], LightTable[i]);
}
}

  • Si VectorCopy no existe, puedes intentar asignación directa o usar memcpy si los vectores son simples arrays, o el equivalente de tu motor para asignar valores de un vector a otro. El objetivo es que LightTable = LightTable[i +/- 1].

Sección 2: Solucionar Renderizado Incompleto del Mundo

Si el mundo "sale incompleto" (partes lejanas o laterales no se dibujan), el culpable es casi siempre la optimización de visibilidad: Frustum Culling o la distancia de dibujado (Far Clip Plane).

Paso 1: Revisar la Distancia de Vista (Far Clip)

En ZzzLodTerrain.cpp, la variable CameraViewFar define la distancia máxima a la que se dibujan los objetos.

// Fragmento de ZzzLodTerrain.cpp:
float Width  = 1780.f * Aspect; // ...
// ...
Vector(((float)i-Num*0.5f)*(Width/Num),CameraViewFar*0.99f,0.f,p); // <--- Aquí se usa

  • Verificación: Asegúrate de que el valor de CameraViewFar esté configurado a una distancia lo suficientemente grande (ej. 10000.f o más) para el tamaño de tu mapa.
  • Ajuste: Si es demasiado pequeño, aumenta el valor global o la configuración de CameraViewFar en tu sistema de cámara.

Paso 2: Revisar la Lógica de Frustum Culling

El frustum culling es el proceso que decide si un objeto está visible. Si la lógica falla, oculta partes visibles del terreno.

  • Clase a Revisar: CFrustrum en ZzzLodTerrain.h.
  • Función Clave: bool Test(vec3_t vPos, float fRange). Esta función se usa para verificar si un trozo de terreno está dentro de la vista.

Acción de Debugging:

  • Deshabilitar Temporalmente: Para confirmar que el culling es la causa, puedes deshabilitar temporalmente la llamada a CFrustrum::Test en tu bucle de renderizado del terreno (en el .cpp).
  • Si se Renderiza Completo: El problema está en CFrustrum::Create() (que define el frustum) o en CFrustrum::Test() (que comprueba la visibilidad). Probablemente el fRange (el radio de la sección del terreno) está mal calculado y no incluye todos los vértices del trozo de terreno.

Paso 3: Revisar el Level of Detail (LOD) (Menos Común)

Si la lógica de LOD (Level of Detail) está marcando erróneamente los trozos lejanos del terreno para no ser dibujados (o asignándoles un nivel de detalle inválido), también podría causar un mundo incompleto.

  • Variable a Observar: LodBuffer[64*64] en ZzzLodTerrain.cpp. Asegúrate de que los valores para los trozos de terreno más lejanos se resuelvan a un nivel de detalle válido (aunque sea el más bajo) y no a un valor que signifique "no dibujar".

¡Recuerda compilar tu proyecto después de aplicar los cambios en el archivo C++!
Bon Dia

🡱 🡳
Real Time Web Analytics