#0 

20-10-2012 09:20:16

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

Voilà, j'aurai voulu savoir si d'autres personnes on le même problème que moi. Je n'arrive plus à utiliser plusieurs textures dans mes GLSL.
Avant, je faisait ça:

Code c++ :


// Callback du shader
class MyShaderCallBack : public IShaderConstantSetCallBack
{
    public:

    virtual void OnSetConstants(IMaterialRendererServices* services, s32 userData)
    {
        // on récupère un pointeur sur VideoDriver
        IVideoDriver* driver = services->getVideoDriver();

        // Matrice WorldViewProj
        matrix4 mWorldViewProj;
        mWorldViewProj = driver->getTransform(ETS_PROJECTION);
        mWorldViewProj *= driver->getTransform(ETS_VIEW);
        mWorldViewProj *= driver->getTransform(ETS_WORLD);
        // on l'envoie au GPU
        services->setVertexShaderConstant("mWorldViewProj", mWorldViewProj.pointer(), 16);

        // On envoie la valeur alpha_herbe au GPU
        services->setPixelShaderConstant("alpha_herbe", &alpha_herbe, 1);

        if(driver->getDriverType() == EDT_OPENGL)
        {
            // texture
            int tex1 = 0;
            services->setPixelShaderConstant("Tex1", (const float*)(&tex1), 1);
            int tex2 = 1;
            services->setPixelShaderConstant("Tex2", (const float*)(&tex2), 1);
            int tex3 = 2;
            services->setPixelShaderConstant("Tex3", (const float*)(&tex3), 1);
            int tex4 = 3;
            services->setPixelShaderConstant("Tex4", (const float*)(&tex4), 1);
        }
    }
};


Et dans mon pixel shader:

Code:

uniform sampler2D Tex1; // texture sol
uniform sampler2D Tex2; // texture herbe
uniform sampler2D Tex3;
uniform sampler2D Tex4;
uniform float alpha_herbe=1.0f;
        
void main(void)
{
    gl_FragColor = texture2D(Tex2, gl_TexCoord[0].st); // J'ai aussi essayé avec Tex3 et Tex4
}

Enfin, dans mon main:

Code c++ :


    //
    IGPUProgrammingServices* gpu = driver->getGPUProgrammingServices();
    // création du matériau pour l'hexagone
    s32 MT1 = 0;
    MyShaderCallBack* MC1 = new MyShaderCallBack();

    if(driver->getDriverType() == EDT_DIRECT3D9)
    {
        MT1 = gpu->addHighLevelShaderMaterialFromFiles(
                "mWorldViewProj", "alpha_herbe", EVST_VS_2_0,
                "Tex1", "Tex2", EPST_PS_2_0,
                MC1, EMT_SOLID);
    }
    else if(driver->getDriverType() == EDT_OPENGL)
    {
        MT1 = gpu->addHighLevelShaderMaterialFromFiles(
                "Tex3", "Tex4", EVST_VS_2_0,
                "../medias/dx.hlsl", "vertexMain", EPST_PS_2_0,
                MC1, EMT_SOLID);
    }
    MC1->drop();
    // l'hexagone (non-régulier)
    ImeshSceneNode* node = smgr->addMeshSceneNode(smgr->getMesh("../medias/dx.hlsl"));
    node->setPosition(vector3df(0,0,0));
    node->setMaterialTexture(0, driver->getTexture("pixelMain"));
    node->setMaterialTexture(1, driver->getTexture("../medias/opengl_vertex.glsl"));
    node->setMaterialTexture(2, driver->getTexture("main"));
    node->setMaterialTexture(3, driver->getTexture("../medias/opengl_pixel.glsl"));
    node->setMaterialFlag(EMF_LIGHTING, false);
    node->setMaterialType((E_MATERIAL_TYPE)MT1);



Normalement vu que gl_fragcolor est "égal" à Tex1, ça devrait m'afficher la texture d'herbe mais non, ça m'affiche aussi la texture. En bref, quoi que je fasse ça m'affiche la texture du slot 0.
Par contre sous directx pas de problème grace ": register(sX)" avec X index de la texture.

Edit : j'ai trouvé ça : related post

Dernière modification par johnplayer (20-10-2012 09:47:28)


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


#1 

20-10-2012 17:21:05

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

C'est bon j'ai trouvé en bidouillant. En fait une modif a été faite dans la SVN et il ne faut plus faire de (f32*)(&int), il faut envoyer directement un f32*.

Code c++ :


            // texture
            services->setPixelShaderConstant("mWorldViewProj", new f32(0), 1);
            services->setPixelShaderConstant("alpha_herbe", new f32(1), 1);
            services->setPixelShaderConstant("Tex1", new f32(2), 1);
            services->setPixelShaderConstant("Tex2", new f32(3), 1);


Voilà, un truc con comme il en arrive souvent.^^


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 

03-05-2013 11:52:00

Copland
Modérateur
Lieu: ZarbiLand
Date d'inscription: 22-09-2006
Messages: 657
Site web

En retard de 15 ans mais j'ajoute ma pierre à l'édifice quand même.
Il vaut mieux éviter de passer un float, un int est plus propre et le système de chaîne à changer également :

int MonCanal = 1;
services->setPixelShaderConstant(services->getPixelShaderConstantID("alpha_herbe"),&MonCanal , 1);

Voilou wink

Dernière modification par Copland (03-05-2013 11:52:13)


Config : I5 2400, ATI HD6870 1Go DDR5, 4Go DDR3.
Single Boot : Windows Seven.

Hors ligne


#3 

03-05-2013 13:20:05

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

de plus t'auras un memleak avec un new a cette endroit
perso j'utilise un array sa permet d'éviter des call inutile pour 16pauve texture wink

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
882 membres
1429 sujets
11119 messages
Dernier membre inscrit: LiseBuisson96
9 invités en ligne
Aucun membre connecté
RSS Feed