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

Pages vues depuis 25/07/2007 : 25 254 701

  • 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
Crisot Crisoticon_post
La 2D, c'est has been... ;-)
--
AmigaOne X1000 - 2 Go DDR2 - Sapphire R9 280x Toxic - Crucial MX200 500 Go - Alim/Cooling BeQuiet
Crisot Crisoticon_post
Décidément...

... alors que j'ai fini l'implémentation quasi complète du normal mapping, je m'attaque donc à récupérer une source de lumière colorée grâce à la couleur secondaire (le bump bouffant la couleur primairecomme expliqué par Alain).

Et bien il semblerait que la couleur secondaire ne soit qu'une couleur spéculaire, c'est à dire un moyen d'illuminer, mais pas d'assombrir. :paf :paf :paf

Je ne sais pas si c'est lié uniquement à Warp3D ou à la génération de GPU, mais ça fout pas mal de choses en l'air.

Déjà qu'il mange du GPU, je vais vraiment finir par le virer ce normal mapping :paf
--
AmigaOne X1000 - 2 Go DDR2 - Sapphire R9 280x Toxic - Crucial MX200 500 Go - Alim/Cooling BeQuiet

Message édité par : Crisot / 27-11-2012 02:02
thellier thelliericon_post
Salut

Ben alors fait juste l'inverse utilise la couleur secondaire pour le normal mapping et
la primaire pour faire l'éclairage coloré

Par ailleurs je suis pas convaincu par ta page sur le "repère tangent"

En effet avec ma methode
1) on a déjà une équation du plan de la face avec les 3 vertex-normales du triangle
2) on a déjà une équation du plan textures avec les 3 UV du triangle

Comme je l'ai déjà écrit le problème de ma méthode c'est que les normales ne sont pas orientées vers la source lumineuse donc le calcul se fait comme si la lampe était à la place de l'observateur = je sais c un problème et il faudrait tourner (matrice de rotation vers vecteur direction lumiere) mes normales pour le résoudre (marcherait alors avec une lampe de direction quelconque mais toujours non locale)

MAIS ce qui est décrit dans ta page, Crisot, ne semble pas tourner non plus les faces vers la source lumineuse (ou semble plutot les mettre toutes face à la source lumineuse)

Bref je vois pas à quel moment tu oriente la face vers la lampe LOCALE (celle au milieu du couloir) avec la méthode décrite dans ta page


Dans l'absolu je verrai plutot la methode ainsi
Soit C le centre du triangle Soit L la lampe
Direction.x=L.x-C.x;
Direction.y=L.y-C.y;
Direction.z=L.z-C.z;
Construction d'une matrice de rotation vers Direction
Soit VN les 3 vertex-normales du triangle
transform(VN,M,3); /* transformer 3 VN avec M */

Evidemment ce serait affreusement lent de le faire par triangle et il vaudrait mieux prendre le centre de l'objet mur et tourner toutes les VN de l'objet dans cette direction lampe = cela equivaudrai à une lampe locale mais de la largeur d'un objet mur ce qui reste à mon avis réaliste

Alain







Crisot Crisoticon_post
J'éclaire comme tu le dis pas le vecteur vertex->camera pour placer la source lumineuse.

SAUF que ce vecteur est transformé dans le repère tangent avant d'être converti en RGB...
Message édité par : Crisot / 27-11-2012 14:19
Crisot Crisoticon_post
Bon après une après midi de test pour récupérer une source de lumière colorée:

-Le normal mapping ne peut-être fait qu'avec la primary color. Si on lui donne la secondary color avec SetTextureBlend(), ça ne fonctionne pas.
-La secondary color ne fonctionne, toujours, que si on ENABLE le SPECULAR avec W3D_SetState():
-> Si SPECULAR est DISABLE, alors toutes les TMU à qui on donnera la secondary color en argument via SetTextureBlend() donneront toujours un résultat nul (noir), quelque soit la manière dont on leur demande de se servir de la secondary color.
-> Si SPECULAR est ENABLE, alors la secondary color ajoutera TOUJOURS une lumière speculaire quelques soit les paramètres que l'on donne à nos TMU via SetTextureBlend(). On peut vaguement influencer le résultat, mais on ne peut pas supprimer la spécularité.

Pour aller plus loin avec la secondary color, il faut le support de la ext_secondary_color. C'est le cas de nos Radeons, mais pas de Warp3D.

Bref, en l'état, je ne vois aucun moyen de conserver une source de lumière colorée avec le normal mapping activé, ce dernier condamnant notre unique couleur.

:paf :paf :paf
--
AmigaOne X1000 - 2 Go DDR2 - Sapphire R9 280x Toxic - Crucial MX200 500 Go - Alim/Cooling BeQuiet
thellier thelliericon_post
Je vois bien : c la merde
Evidemment rien n'est impossible on doit pouvoir certainement utiliser une de ces pistes (après faut voir le cout CPU/GPU):

1) faire la même chose sans le multitexturing en faisant deux passes de texturing une avec le modulate et la deuxieme avec le dot
2) appliquer une ligtmap colorée
3) tracer un quad avec une texture de spot rouge par dessus les murs quand on lance une boule de feu
4) mettre dans la 2eme passe W3D_COMBINE_INTERPOLATE (Interpolate between Argument A and B by factor C)
RGB=CA+(1−C)*B
Alpha=CA+(1−C)B

A = la couleur boule de feu dans W3D_ARG_FACTOR (Use the per-stage constant blend factor as specified with the W3D_BLEND_FACTOR tag.)
B= texture mur
C= le resultat du bump precedent

Faut rajouter le tag
W3D_BLEND_FACTOR A per-stage constant blend factor, specified as a pointer to a
W3D_Color structure.

Alain
Message édité par : thellier / 28-11-2012 10:17
thellier thelliericon_post
ce qui donnerait ça (pour ceux qui suivent plus... :-P )

W3D_Color lightcolor;

lightcolor.r=1.0; /* red orange */
lightcolor.g=0.4;
lightcolor.b=0.0;
lightcolor.a=1.0;



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_BLEND_FACTOR,& lightcolor,
W3D_COLOR_ARG_B, W3D_ARG_TEXTURE_COLOR,
W3D_COLOR_ARG_C, W3D_ARG_PREVIOUS_COLOR,
W3D_COLOR_ARG_A, W3D_W3D_ARG_FACTOR,
W3D_COLOR_COMBINE, W3D_COMBINE_INTERPOLATE,
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);}
}


Message édité par : thellier / 28-11-2012 10:25
Message édité par : thellier / 28-11-2012 10:32
Crisot Crisoticon_post
C'est totalement ça!

Mais comme tu le démontres si bien, ça implique une 3e TMU. Et si, techniquement, c'est parfaitement viable, hormis l'absence de gouraud sur cette couleur, nos GPU ne vont définitivement pas encaisser cette 3e passe sans broncher. En revanche sur les HD ce sera easy! (Mais très honnêtement, sur les HD, ce serait bien que les drivers aillent un peu plus loin, tout simplement).

Mais c'est clairement à garder sous le coude. Avec des textures pas trop grandes pour ne pas tuer le chip, ça peut totalement le faire!
--
AmigaOne X1000 - 2 Go DDR2 - Sapphire R9 280x Toxic - Crucial MX200 500 Go - Alim/Cooling BeQuiet
thellier thelliericon_post
Euhhh faut lire : y a que 2 TMU utilisées
0) W3D_COMBINE_DOT3RGB,
1) W3D_COMBINE_INTERPOLATE

Je fais juste une boucle pour désactiver toute les autres TMUs car sinon j'ai des crashs sur la SAM

Alain
Crisot Crisoticon_post
Ah mea culpa... En fait j'ai lu le message sur le téléphone au boulot, et j'ai répondu depuis mon lit vers 13h00... Je réclame échapper au pilori.

Bon bah c'est encore mieux! Ca nous fait pour ainsi dire une flat primary.
--
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