#0 

19-10-2012 09:31:35

Memorial76
Membre
Date d'inscription: 19-02-2010
Messages: 67

Bonjour,

Suite à cette discussion j'ai appris les rudiments de la programmation des shaders.

Pour résumer, il s'agit de combiner deux textures en une car Irrlicht ne le fait pas tout seul.
Or, j'ai un problème avec la compilation du shader et en particulier avec les coordonnées de la texture de couche 1 (la première texture étant bien sûr en couche 0). Celle-ci n'est pas à l'échelle et, à priori, il ne prend qu'un pixel car elle est uniformément verte. Je me retrouve donc à combiner ma texture 0 avec une couche de vert uniforme...

Autre soucis, lorsque je tente d'utiliser les coordonnées de la couche 0 pour la couche 1, j'ai un message d'erreur:
"error X4515: cannot bind sampler to user specified stage. In ps_1_1, samplers must be bound to the same stage as their TEXCOORD"
Or ce code devrait fonctionne car il fonctionne chez un autre utilisateur.

J'ai essayé avec un cubeSceneNode Irrlicht de base et j'ai le même problème.

Première question d'ordre général: Comment le shader récupère-t-il les textures de la matrice sur laquelle il travaille?

Deuxième question, concernant irrlicht en particulier: Lorsque je crée mon scene node et que je déclare les coordonnées UV de mes vertex, celles-ci sont-elles applicables à toutes les couches de texture? (A priori je ne vois pas pourquoi ce ne serait pas le cas mais bon...)

Je vous remercie par avance de votre intérêt en espérant trouver la solution rapidement.

Hors ligne


#1 

19-10-2012 12:33:19

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

S3DVertex contient 1 seule coordonnée de texture, il ne faut donc pas utiliser TexCoord1 dans ton shader. Texcoord0 contient les coordonnées de la texture que contient le S3DVertex courant. Tes 2 textures doivent être de même résolution je pense.

Avoir des textures de tailles différentes n'a aucun intérêt dans ton cas (si tes textures ont la même taille ignores cette dernière phrase wink ).

Les textures sont récuperées dans le shader grâce à "register(sX)" avec X, l'indice de la texture dans le material irrlicht.

Vu que tu as un post sur le forum anglais, je mets un lien : post parallèle.

Ensuite, il y a un truc qui me chiffonne. Tu dessines ton hexagone bizarrement. Je créérais une variable membre de "CIrrHexagoneSceneNode" qui s'appellerait irr::scene::SMeshBuffer *mBuffer(SMeshBuffer est un typedef de CMeshBuffer<S3DVertex>). L'avantage de SMeshBuffer, c'est que tu peut accéder librement à tout ses membres.
Et ensuite je ferais un truc du genre :

Code c++ :



/** Methode de construction de l'hexagone:

- repère position :

axe Z
^
|
--> axe X

- repere coordonnées de texture :

--> axe U
|
v
axe V

    2 _________  3
     /|       /|\
    / | tri  / | \
   /  |  2  /  |  \
1 /tri|    /   |tri\ 4
  \ 1 |   /    | 4 /
   \  |  / tri |  /
    \ | /   3  | /
     \|/_______|/
     6          5
Les positions des sommets sont définies par rapport au centre de l'hexagone.(plus facile pour le placement car le centre du node est le centre de l'hexagone)

**/


void CIrrHexagoneSceneNode::createHexagoneBuffer()
{
    // rayon de l'hexagone
    irr::f32 rayon = 100.f;
    // création des 6 vertex
    irr::video::S3DVertex v1,v2,v3,v4,v5,v6;

    irr::f32 rayonCosPIsurTROIS = rayon*cos(PI/3);
    irr::f32 rayonSinPIsurTROIS = rayon*sin(PI/3);

    v1.Pos = irr::core::vector3df(-rayon,0,0);
    v2.Pos = irr::core::vector3df(-rayonCosPIsurTROIS,0,rayonSinPIsurTROIS);
    v3.Pos = irr::core::vector3df(rayonCosPIsurTROIS,0,rayonSinPIsurTROIS);
    v4.Pos = irr::core::vector3df(rayon,0,0);
    v5.Pos = irr::core::vector3df(rayonCosPIsurTROIS,0,-rayonSinPIsurTROIS);
    v6.Pos = irr::core::vector3df(-rayonCosPIsurTROIS,0,-rayonSinPIsurTROIS);

    v1.TCoords = irr::core::vector2df(0.0f ,0.5f);
    v2.TCoords = irr::core::vector2df(0.25f,0.0f);
    v3.TCoords = irr::core::vector2df(0.75f,0.0f);
    v4.TCoords = irr::core::vector2df(1.0f ,0.5f);
    v5.TCoords = irr::core::vector2df(0.75f,1.0f);
    v6.TCoords = irr::core::vector2df(0.25f,1.0f);

    v1.Normal = irr::core::vector3df(0,1,0); // utile pour l'éclairage par la suite
    v2.Normal = irr::core::vector3df(0,1,0);
    v3.Normal = irr::core::vector3df(0,1,0);
    v4.Normal = irr::core::vector3df(0,1,0);
    v5.Normal = irr::core::vector3df(0,1,0);
    v6.Normal = irr::core::vector3df(0,1,0);

    // insertion des 6 vertex dans le buffer
    mBuffer->Vertices.push_back(v1);
    mBuffer->Vertices.push_back(v2);
    mBuffer->Vertices.push_back(v3);
    mBuffer->Vertices.push_back(v4);
    mBuffer->Vertices.push_back(v5);
    mBuffer->Vertices.push_back(v6);

    // insertion des indices dans le buffer (4triangles)
    mBuffer->Indices.push_back(0);mBuffer->Indices.push_back(1);mBuffer->Indices.push_back(5); // tri 1
    mBuffer->Indices.push_back(5);mBuffer->Indices.push_back(1);mBuffer->Indices.push_back(2); // tri 2
    mBuffer->Indices.push_back(5);mBuffer->Indices.push_back(2);mBuffer->Indices.push_back(4); // tri 3
    mBuffer->Indices.push_back(4);mBuffer->Indices.push_back(2);mBuffer->Indices.push_back(4); // tri 4

    // initialisation du material
    mBuffer->Material.Lighting = false;

    // mise en place du shader
    irr::video::IGPUProgrammingServices* pGPU = pDriver->getGPUProgrammingServices();
    MyShaderCallBack* SCB1 = new MyShaderCallBack();
    irr::s32 MT1 = pGPU->addHighLevelShaderMaterialFromFiles( "./Textures/Shaders/dx.hlsl", "vertexMain", irr::video::EVST_VS_1_1,
                                                              "./Textures/Shaders/dx.hlsl", "pixelMain" , irr::video::EPST_PS_1_1,
                                                              SCB1, irr::video::EMT_SOLID);
    SCB1->drop();
   mBuffer->Material.MaterialType((irr::video::E_MATERIAL_TYPE)MT1);

}

void CIrrHexagoneSceneNode::render()
{
    irr::video::IVideoDriver* driver = SceneManager->getVideoDriver();
    driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
    driver->setMaterial(mBuffer->Material);
    driver->drawMeshBuffer(mBuffer);
}



Des modifications sont peut-être à faire car j'ai fait le code de tête. Mais le principe est là, c'est le principal. Ce code utilise les outils mis à disposition par Irrlicht, il est mieux car il te permettra d'activer des fonctionnalités intéressantes comme les VBOs. Enfin, dans le cas où tu mets plusieurs hexagones dans le même buffer.

Edit : petite rectification parce que j'utilise le material du buffer.

Dernière modification par johnplayer (19-10-2012 12:52:20)


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#2 

19-10-2012 12:59:34

Memorial76
Membre
Date d'inscription: 19-02-2010
Messages: 67

CA Y'EST LA REPONSE EST TOMBEE SUR LE FORUM EN ANGLAIS:
il faut utiliser "video::EPST_PS_2_0"

En tout cas je te renouvelle tous mes remerciements pour ta patience et tes conseils. Quelque chose me dit que je vais rapidement avoir de nouveau besoin d'aide....

Hors ligne


#3 

19-10-2012 13:24:38

johnplayer
Habitué
Date d'inscription: 30-09-2007
Messages: 431

C'est super mais bizarre! Pourquoi ça marche chez avec Shader Model 1 ?!

Sinon regardes quand même le code que je t'ai donné au-dessus, tu auras une meilleure implémentation de ton SceneNode.


core i7 4970K @ 4GHz - 32GB ddr3 19200(2400MHz) - ssd samsung 840 evo 250GB - GTX1080Ti (4K) - Cooler master storm stryker blanc.
"L'alcool, c'est comme Activia, c'est actif à l'intérieur et ça se voit à l'extérieur."

Hors ligne


#4 

19-10-2012 13:48:41

Memorial76
Membre
Date d'inscription: 19-02-2010
Messages: 67

J'y ai déjà jeté un oeil et je pense que je passerai aux buffers dès que j'en aurai l'occasion. J'en ai également profité pour mettre le la création du shader et du material dans la création de l'hexagone.

Sinon, je construis mon hexagone autour du centre en gardant un vertex au centre afin de, plus tard, pouvoir déformer l'hexagone pour, par exemple, suivre un relief...

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
881 membres
1427 sujets
11117 messages
Dernier membre inscrit: Bidule
48 invités en ligne
Aucun membre connecté
RSS Feed