#0 

09-11-2010 11:36:11

narugohan
Abonné
Date d'inscription: 24-03-2009
Messages: 113

Bonjour à tous,
C'est encore moi xD, j'ai un problème avec Cel-Shading que j'ai crée.
J'ai crée un shaders GLSL, pour les contour noir, j'utilise une deuxième mesh en wireFrame. Avec une mesh, tout va bien, sa fonctionne. Mon problème, c'est dès que je rajoute une autre mesh, avec elle aussi le mode wireFrame pour les contours noirs, sa ne fonctionne plus, enfin si, la première mesh oui.... mais pas la deuxième, je ne sais pas comment expliqué, une vidéo vous parlera surement mieux : http://www.youtube.com/watch?v=aqCAGhbyRQ0

Et mon code source :

Code:

       //shaders Cel-Shading
        irr::video::CShaderPerso* shaderPerso = new irr::video::CShaderPerso(device);
        irr::s32 newMaterial = gpu->addHighLevelShaderMaterialFromFiles(
                    "Shaders/vertex_CelShading.vert", "main", irr::video::EVST_VS_1_1,
                    "Shaders/pixel_CelShading.frag", "main", irr::video::EPST_PS_1_1,
                    shaderPerso, irr::video::EMT_SOLID);
        
    //1er mesh
    IAnimatedMesh* node = smgr->getMesh("models/happy.b3d");
    IAnimatedMeshSceneNode* node1 = smgr->addAnimatedMeshSceneNode(node);
    node1->setMaterialFlag(EMF_LIGHTING, false);
        node1->setMaterialType((irr::video::E_MATERIAL_TYPE)newMaterial);
    
    IAnimatedMeshSceneNode* nodeContour1 = smgr->addAnimatedMeshSceneNode(node);
    nodeContour1->setMaterialFlag(EMF_LIGHTING, true);
    nodeContour1->setMaterialFlag(EMF_WIREFRAME,true);
    nodeContour1->setMaterialFlag(EMF_ZWRITE_ENABLE, false);

    //2ème mesh
    IAnimatedMesh* node2 = smgr->getMesh("models/happy.b3d");
    IAnimatedMeshSceneNode* node3 = smgr->addAnimatedMeshSceneNode(node2);
    node3->setMaterialFlag(EMF_LIGHTING, false);
    node3->setMaterialType((irr::video::E_MATERIAL_TYPE)newMaterial);
    node3->setPosition(vector3df(-25,0,0));
    
    IAnimatedMeshSceneNode* nodeContour2 = smgr->addAnimatedMeshSceneNode(node2);
    nodeContour2->setMaterialFlag(EMF_LIGHTING, true);
    nodeContour2->setMaterialFlag(EMF_WIREFRAME,true);
    nodeContour2->setMaterialFlag(EMF_ZWRITE_ENABLE, false);
    nodeContour2->setPosition(vector3df(-25,0,0));
    
    shaderPerso->drop();

Voilà, j'espère que vous pourrez m'aider, car franchement, je ne vois pas d'ou vien le problème-_-
Merci d'avance

Cordialement

Dernière modification par narugohan (09-11-2010 11:38:14)

Hors ligne


#1 

10-11-2010 12:48:58

narugohan
Abonné
Date d'inscription: 24-03-2009
Messages: 113

UP please

Hors ligne


#2 

12-11-2010 12:29:21

narugohan
Abonné
Date d'inscription: 24-03-2009
Messages: 113

Up ?

Hors ligne


#3 

12-11-2010 14:33:51

nabouill
Abonné
Date d'inscription: 17-09-2009
Messages: 242
Corrections: 1

si tu peux mettre à dispo ton code et tes shaders en download, je veux bien essayer de tester çà chez moi pour voir.


mes sites: www.manga-vf.fr et www.series-vf.fr

Hors ligne


#4 

12-11-2010 15:59:50

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 904
Corrections: 2
Site web

Tu sais que t'est chiant ? wink
on comprend pas grand chose a ta vidéo, se pendant si j'est bien comprit le shader ne splique qu'a un seul obj ?
je ne voie pas pourquoi, mais en tout cas utiliser le mode wireframe pour faire un "cell-shading" se n'est certainement pas la bonne chose a faire ...
tu augment par deux le nombre de polygone a rendre, forcement sa influe énormement sur les performence !

sinon même si se n'est pas logique que tu ne puisse appliquer le shader sur plusieur obj, tu peut toujours en crée un pour chaque obj
mais se n'est pas non plus une solution, demande sur le forum officiel tu veras bien ... je pensse a un  problème avec le z-buffer ... mais ...

ps: arrete les "xD", "lol", "ptdr" ... sa fait vraiment gamin, et je ne sais pas pour les autre mais sa ne me donne pas envie de poster, surtout que j'ai mis 10 min a comprendre .... wink

Hors ligne


#5 

12-11-2010 18:21:54

narugohan
Abonné
Date d'inscription: 24-03-2009
Messages: 113

Dsl pour les smiley, et moi chiant ??? O_o nn pas du tout .... :°
Enfin bon, enfaite, le shader lui marche très bien, ce n'est pas lui le problème. Pour faire les contours noirs sur une mesh, il y a 2 méthode( une complexe et une plus simple( utilisé assez souvent sur PS1 et PS2, par exemple Jet Set Radio) ), la méthode complexe est réalisé à l'aide d'un shader qui calcul tous sa, mais comme je m'y connais pas trop en GLSL, et que la méthode est apparemment assez complexe, l'on ma conseillé d'utilisé la méthode simple, qui est pourtant assez utilisé, c'est d'affiché une deuxième mesh, en mode WireFrame avec le z-buffer qui affiche que les faces arrières, enfin on m'a dit de désactiver le z-buffer, se que j'ai fais. Le problème, c'est que sur la première mesh, sa fonctionne, par contre la deuxième mesh, pas du tout ou casiment pas. Il faut que je m'approche de la deuxième mesh, et que j'oriente ma caméra sous un certain angle, pour que sa fonctionne dès que je me recule, ou que je bouge légèrement la caméra de quelque degrès de rotation, cela m'affiche le WireFrame entièrement, c'est pour sa que je ne comprend pas.
Sinon, il faut savoir que n'utilise les contours noirs que sur les personnages, donc sa peut encore aller, et sa prend comme même moins de mémoire que d'affiché une deuxième mesh normal( pas en WireFrame ), mais je suis d'accord, que sa prend comme même plus de mémoire que la 1er méthode, mais je ne pense pas utiliser avant longtemps cette première méthode.

J'espère que je me suis un peu mieux expliqué, si non ? j'essayerais de refaire une meilleur vidéo pour que vous compreniez

Encore merci
Cordialement

Hors ligne


#6 

12-11-2010 21:00:20

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 904
Corrections: 2
Site web

c'est bon narugohan, tu n'écris pas non plus a un ministre, et je disais ça gentiment, enfin bref ...
je viens de pensser que cela peut également venir de l'ordre d'affichage dans un cas, le wireframe est afficher en premier et le mesh après, mais dans l'autre cas c'est l'inverse
c'est pour cela, donc, que sa ne marche pas correctement, pour ce faire je te propose de crée un ISceneNode avec une methode d'afichage l'égèement différente
il te faut alors deux materieux, un pour celui du mesh, et l'autre pour le mode wireframe

et pour afficher tu fait:

Code c++ :


driver->setTransform(irr::video::ETS_WORLD, la_matrice_de_rendue);
driver-setMaterial(wireframe);
driver->drawMeshBuffer(poiteur_vers_ton_mesh);
driver-setMaterial(normale);
driver->drawMeshBuffer(poiteur_vers_ton_mesh);



sa règle ton probleme d'affichage je pensse, et tu ne seras pas obliger de bouger deux mesh a chaque fois, mais je maintien que c'est pas une bonne solution, même si des jeux l'utilise sur psp, et je ne pensse pas que se soit le cas ... wink

ps: dsl si je "pisque", je voulais pas être méchant :')

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
Analysé par
880 membres
1424 sujets
11113 messages
Dernier membre inscrit: mandrifidy
50 invités en ligne
Aucun membre connecté
RSS Feed