Historique des modifications - Message

Message #10874

Sujet: multi-texture avec GLSL et Irrlicht SVN


Type Date Auteur Contenu
Dernière modification 20-10-2012 07:47:28 johnplayer
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:
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(
                "../medias/dx.hlsl", "vertexMain", EVST_VS_2_0,
                "../medias/dx.hlsl", "pixelMain", EPST_PS_2_0,
                MC1, EMT_SOLID);
	}
	else if(driver->getDriverType() == EDT_OPENGL)
	{
        MT1 = gpu->addHighLevelShaderMaterialFromFiles(
                "../medias/opengl_vertex.glsl", "main", EVST_VS_2_0,
                "../medias/opengl_pixel.glsl", "main", EPST_PS_2_0,
                MC1, EMT_SOLID);
	}
    MC1->drop();
    // l'hexagone (non-régulier)
	IMeshSceneNode* node = smgr->addMeshSceneNode(smgr->getMesh("../medias/hexagone.3ds"));
	node->setPosition(vector3df(0,0,0));
	node->setMaterialTexture(0, driver->getTexture("../medias/sol.png"));
	node->setMaterialTexture(1, driver->getTexture("../medias/herbe.png"));
	node->setMaterialTexture(2, driver->getTexture("../medias/red.png"));
	node->setMaterialTexture(3, driver->getTexture("../medias/blue.png"));
	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
Création du message 20-10-2012 07:20:16 johnplayer
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:
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(
                "../medias/dx.hlsl", "vertexMain", EVST_VS_2_0,
                "../medias/dx.hlsl", "pixelMain", EPST_PS_2_0,
                MC1, EMT_SOLID);
	}
	else if(driver->getDriverType() == EDT_OPENGL)
	{
        MT1 = gpu->addHighLevelShaderMaterialFromFiles(
                "../medias/opengl_vertex.glsl", "main", EVST_VS_2_0,
                "../medias/opengl_pixel.glsl", "main", EPST_PS_2_0,
                MC1, EMT_SOLID);
	}
    MC1->drop();
    // l'hexagone (non-régulier)
	IMeshSceneNode* node = smgr->addMeshSceneNode(smgr->getMesh("../medias/hexagone.3ds"));
	node->setPosition(vector3df(0,0,0));
	node->setMaterialTexture(0, driver->getTexture("../medias/sol.png"));
	node->setMaterialTexture(1, driver->getTexture("../medias/herbe.png"));
	node->setMaterialTexture(2, driver->getTexture("../medias/red.png"));
	node->setMaterialTexture(3, driver->getTexture("../medias/blue.png"));
	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

Retour

Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
137 invités en ligne
membre en ligne: -
RSS Feed