website logo
Auteur
avatar
thellier

Forum » » Création-Développement » » Demande de bench #Zero


Posté : 20-02-2017 11:29 icone du post

Hello

J'ai jamais compris comment on paramétrait le fog dans Warp3D : si seulement c'était comme dans OpenGL...

Au final le fog est implémenté dans WaZp3D mais il marche certainement pas faute de comprendre comment WaRp3D l'utilise

Faire une fog pas "nice" est trivial : voici le code de Mesa

(Un fog "nice" s'arrête aussi au milieu des faces quand on arrive à sa fin mais je croie pas que Warp3D l'implémente non plus...)

Question: j'ai noté que le bump de Microbe3D marchait plus sur ma Sam460 sur un WaRp3D plus récent: connais tu quel modif de code il faut ?


/*
 * Compute the fogged color for an array of vertices.
 * Input:  n - number of vertices
 *         v - array of vertices
 *         color - the original vertex colors
 * Output:  color - the fogged colors
 */
void gl_fog_rgba_vertices( const GLcontext *ctx, ULONG n, float v[][4], UBYTE color[][4] )
{
float f,invf;
float rFog = ctx->Fog.Color[0] * 255.0F;
float gFog = ctx->Fog.Color[1] * 255.0F;
float bFog = ctx->Fog.Color[2] * 255.0F;
float end = ctx->Fog.End;
ULONG i;
float d; 
 
 switch (ctx->Fog.Mode) {
      case GL_LINEAR:
  d = 1.0F / (ctx->Fog.End - ctx->Fog.Start);
  for (i=0;i<n;i++) {
     float f = (end - ABSF(v[i][2])) * d;
     f = CLAMP( f, 0.0F, 1.0F );
  invf=(1.0F-f);
     color[i][0] = (UBYTE) (f * color[i][0] + invf * rFog);
     color[i][1] = (UBYTE) (f * color[i][1] + invf * gFog);
     color[i][2] = (UBYTE) (f * color[i][2] + invf * bFog);
  }
  break;
      case GL_EXP:
  d = -ctx->Fog.Density;
  for (i=0;i<n;i++) {
     float f = exp( d * ABSF(v[i][2]) );
     f = CLAMP( f, 0.0F, 1.0F );
  invf=(1.0F-f);
     color[i][0] = (UBYTE) (f * color[i][0] + invf * rFog);
     color[i][1] = (UBYTE) (f * color[i][1] + invf * gFog);
     color[i][2] = (UBYTE) (f * color[i][2] + invf * bFog);
  }
  break;
      case GL_EXP2:
  d = -(ctx->Fog.Density*ctx->Fog.Density);
  for (i=0;i<n;i++) {
     float z = ABSF(v[i][2]);
     float f = exp( d * z*z );
     f = CLAMP( f, 0.0F, 1.0F );
  invf=(1.0F-f);
     color[i][0] = (UBYTE) (f * color[i][0] + invf * rFog);
     color[i][1] = (UBYTE) (f * color[i][1] + invf * gFog);
     color[i][2] = (UBYTE) (f * color[i][2] + invf * bFog);
  }
  break;
      default:
  gl_problem(ctx, "Bad fog mode in gl_fog_rgba_vertices");
  return;
   }
}

Sam440 - Sam460 - X5000 - PowerBookG4 - WinUAE - MiniMig

Cet article provient de Le site des utilisateurs francophones actuels et futurs d'AmigaOS 4.x
https://amiga-ng.org/viewtopic.php?topic=2404&forum=14