Annonces Google
Serveur IRC
Serveur : irc.portlane.se
Canal : #AmigaNG
Activité du Site

Pages vues depuis 25/07/2007 : 25 262 071

  • Nb. de membres 187
  • Nb. d'articles 1 270
  • Nb. de forums 19
  • Nb. de sujets 20
  • Nb. de critiques 24

Top 10  Statistiques

Index du forum »»  Création-Développement »» Oui on peut faire du bump mapping avec Warp3D/Os4

Oui on peut faire du bump mapping avec Warp3D/Os4#1414

6Contributeur(s)
thellierAmiDARKCrisotElwoodK-LYesCop
3 Modérateur(s)
K-LElwoodcorto
thellier thelliericon_post
Suite à mon posts sur le fil "Dungeon Crawler Os4 "

"Sur le bumping je pense qu il y a peut etre moyen avec un WaRp3D OS4 cad un v5
avec le multitexturing on peut multiplier un pixel texture par une valeur
donc si la tex contient les normales on doit pouvoir les mettre dans la direction de la lampe "

Depuis ce post je teste le truc ...
Et après nombre compilations/crash/modifs et retests ça marche enfin :-)
http://thellier.free.fr/cowbump.png

C'est basé sur le principe exposé ici mais avec une méthode un peu différente puisque j'utilise les vertex-normals
http://nehe.gamedev.net/article/bump_mapping/25006/

MA METHODE DE BUMPING WARP3D:
-----------------------------------------------------------
Utiliser le multitexturing du vrai Warp3D/OS4 (Pas Wazp3D)
2 passes de texturing :

Texturing0:
tex 0 contient une normal map
Mettre les vertex-normals dans la couleur des points et faire un
dotproduct(couleur,tex)
cad dotproduct(normal,normalmap)
=> on obtient des valeurs de noir-gris-blanc selon l'angle du dotproduct() cad une lightmap

Texturing1:
tex 1 contient la tex habituelle
Faire un W3D_MODULATE de la tex

Voilà

La salle applaudit :-)

Alain Thellier

Notes:
1) comme on utilise la couleur des points on perd un eventuel éclairage normal et coloré (stocké dans la couleur des points) ... à améliorer ...
2) on utilise les vertex-normals qui sont pas dans la direction de la lampe
3) ne pas se fier aux FPS du grab y a une tonne de débug
3) qques parties cruciales du code :

/*==================================================================*/
typedef struct _Point3D
{
float x,y,z;
float color[4];
float u,v,w;
float u1,v1,w1;
float nx,ny,nz;
} Point3D;
------------------------------------------------------------------------------------------------------------------------------------
/* Warp3D V5 for Os4 ppc only implement W3D_InterleavedArray() not W3D_Vertex/TexCoord/ColorPointer() */
#ifdef OS4
#define ARRAYFORMAT (W3D_VFORMAT_COLOR|W3D_VFORMAT_TCOORD_0)
#define ARRAYFORMAT2 (W3D_VFORMAT_COLOR|W3D_VFORMAT_TCOORD_0|W3D_VFORMAT_TCOORD_1)
format=ARRAYFORMAT;
if(MAT->MapMode=='B') format=ARRAYFORMAT2; /* bump mapping */
W3D_InterleavedArray(S->context,VertexPointer,stride,format,W3D_TEXCOORD_NORMALIZED);
#else
TexCoordPointer =(void *)&(P->u);
ColorPointer =(void *)&(P->color);
off_v=(UWORD)( (ULONG)&(P->v) - (ULONG)&(P->u));
off_w=(UWORD)( (ULONG)&(P->w) - (ULONG)&(P->u));
result=W3D_VertexPointer(S->context,VertexPointer,stride,W3D_VERTEX_F_F_F, 0);
result=W3D_TexCoordPointer(S->context,TexCoordPointer,stride,0, off_v, off_w,W3D_TEXCOORD_NORMALIZED);
result=W3D_ColorPointer(S->context,ColorPointer,stride,W3D_COLOR_FLOAT ,W3D_CMODE_RGBA,0);
#endif
------------------------------------------------------------------------------------------------------------------------------------
if(MAT->MapMode=='B') /* bump mapping */
{
P->color[0]=((P->nx+1.0)/2.0);
P->color[1]=((P->ny+1.0)/2.0);
P->color[2]=((P->nz+1.0)/2.0);
P->color[3]=1.0;
P->u1=P->u;
P->v1=P->v;
P->w1=P->w;

}
-------------------------------------------------------------------------------------------------------------------------------------
#ifdef OS4
W3D_SetState(S->context, W3D_MULTITEXTURE, W3D_ENABLE);
NumTMU = W3D_Query(S->context,W3D_Q_NUM_TMU,0);
REM(bind texs)
NLOOP(NumTMU)
{
if(n==0)
W3D_BindTexture(S->context,0, bumptex);
if(n==1)
W3D_BindTexture(S->context,1, state->tex);
if(n>1)
W3D_BindTexture(S->context,n,NULL);
}

REM(all tmus)
NLOOP(NumTMU)
{
if(n==0)
result=W3D_SetTextureBlendTags(S->context,
W3D_BLEND_STAGE, 0,
W3D_COLOR_ARG_A, W3D_ARG_TEXTURE_COLOR,
W3D_COLOR_ARG_B, W3D_ARG_DIFFUSE_COLOR,
W3D_COLOR_COMBINE, W3D_COMBINE_DOT3RGB,
TAG_DONE);

if(n==1)
result=W3D_SetTextureBlendTags(S->context,
W3D_BLEND_STAGE, 1,
W3D_ENV_MODE, state->TexEnvMode,
TAG_DONE);

if(n>1)
result=W3D_SetTextureBlendTags(S->context,
W3D_BLEND_STAGE,n,
W3D_COLOR_COMBINE,W3D_COMBINE_DISABLED,
W3D_ALPHA_COMBINE,W3D_COMBINE_DISABLED,
TAG_DONE);

if(result!=W3D_SUCCESS)
{printf("Cant SetTextureBlend%ld (error %ld)\n",n,result);}
}

result=W3D_SetTextureBlend(S->context,NULL);
if(result!= W3D_SUCCESS)
{printf("Cant SetTextureBlend (error %ld)\n",result);}

thellier thelliericon_post
voici le binaire
http://thellier.free.fr/Microbe3D14.zip

lancer microbe3d-ppc
Charger Cow-Aubrac.obj
puis faire touche 'e' pour activer le bump
et touches x y z et souris pour tourner
touches / * pour zoomer
f pour enlever les textes à l ecran
Esc = quit

la texture servant au bump est dans data/bump2.bmp = si vous voulez la modifier

sinon y a toujours les memes options à tester (notamment) sur teapot.obj
m pour changer de materiau
G pour l'affecter à ce groupe
C pour env mapping
T pour toon
etc...

oui oui je sais je vais faire des menus pour toutes ces options...

Alain

Pense à laisser un espace devant un lien si tu veux le rendre actif. Merci pour ton boulot !
Message édité par : Creols / 22-11-2012 17:38
AmiDARK AmiDARKicon_post
cool :)
Ca c'est du codeur de ouf ;)
Crisot Crisoticon_post
Hello, merci pour les test!

Je me suis pas encore penché dessus mais c'est clair que ça va permettre de réduire drastiquement les polygones, notament ceux qui n'étaient là que pour procurer un éclairage justement. La normal map fera aussi bien le boulot.

Simple et sympa!
--
AmigaOne X1000 - 2 Go DDR2 - Sapphire R9 280x Toxic - Crucial MX200 500 Go - Alim/Cooling BeQuiet
AmiDARK AmiDARKicon_post
Après, il doit aussi pouvoir être combiné un "light mapping" précalculé et ton custom bump :p . non ?
thellier thelliericon_post
Oui il faut juste rajouter une passe de multitexture avec la vraie lightmap (precalculee)
mais apres j aurai un autre probleme : faire tenir les 3 textures et 3 u v w dans les structures que j utilise dans microbe3D

Alain
Crisot Crisoticon_post
La grande question que je me pose maintenant, c'est la tronche que ça va avoir avec plusieurs lights.

D'un point de vue éclairage pur et simple il suffit de prendre la normale dominante à chaque vertex, mais je sais pas si le bump rendra super bien lorsque fortement soumi à 2 lampes. A tester. :)
--
AmigaOne X1000 - 2 Go DDR2 - Sapphire R9 280x Toxic - Crucial MX200 500 Go - Alim/Cooling BeQuiet
thellier thelliericon_post
Ou alors on met pas les vertex-normal dans les couleur de points mais dans la 2eme couleur de points
Ainsi on epargne les couleurs de points qui peuvent continuer de contenir un lighting classique "a la opengl"
Apres faut reussir a faire marcher le tout ensemble... :-P

Alain
thellier thelliericon_post
>c'est la tronche que ça va avoir avec plusieurs lights

Bahhh jamais content
De toute façon les coders de jeux vidéo c'est un métier d'illusionistes : du moment que c joli qu'importe la réalité mathématique

Comme le bump est un reflet speculaire alors on le remarque surtout si la source lumineuse bouge et révéle les aspérités : donc si le héros tient une torche ou alors lance des boules de feu au fond des couloirs alors le bump doit suivre CETTE lampe ci et si alors le bump suit pas les autres lampes d'ambiance = personne ne le remarquera

Alain
Crisot Crisoticon_post
Rooo ça va fais pas la gueule :-P
Bon, faut que je plante ça quand j'aurais fini 2 ou 3 autres bricoles.
--
AmigaOne X1000 - 2 Go DDR2 - Sapphire R9 280x Toxic - Crucial MX200 500 Go - Alim/Cooling BeQuiet
Petites Annonces

0 annonce(s) publiée(s)

Consulter

AmigaOS 4.1

Laissez-vous tenter par
AmigaOS 4.1
AmiTheme

AmiTheme