Historique des modifications - Message

Message #9711

Sujet: Agir sur l'opacité d'un triangle


Type Date Auteur Contenu
Dernière modification 27-04-2012 15:50:20 Metallizer
Edit: Ce méthode n'a pas été retenue, voir le message #7 pour la solution
  • -------------------------------------


Bon finalement j'ai opté pour le shader et ça marche nickel, merci pour ton aide wink

J'ai défini une structure qui permet de lister les shaders disponibles qu'on peut appliquer à des nodes :

Code c++ :

struct Shaders {
  s32 opacity;
};


Les membres de cette structure sont définis en début de programme :

Code c++ :

void initShaders() {
  shaders.opacity = 0;
  if(gpu) {
    OpacityShaderCallback* cb = new OpacityShaderCallback();
    shaders.opacity = gpu->addHighLevelShaderMaterialFromFiles(
      "shader/opacity.vert", "vertexMain", video::EVST_VS_1_1,
      "shader/opacity.frag", "pixelMain", video::EPST_PS_1_1,
      cb, video::EMT_TRANSPARENT_ALPHA_CHANNEL
    );
    cb->drop();
  }
}


J'ai également défini un Callback pour ce shader :

Code c++ :

class OpacityShaderCallback : public video::IShaderConstantSetCallBack {
  public:
    const video::SMaterial* usedMaterial;
    virtual void OnSetMaterial(const video::SMaterial& material) {
      usedMaterial = &material;
    }
    virtual void OnSetConstants(video::IMaterialRendererServices* services, s32 userData) {
      // On récupère les informations de la couleur diffuse qui seront passés au shader
      f32 vColor[4] = {
        usedMaterial->DiffuseColor.getRed() / 255.0f,
        usedMaterial->DiffuseColor.getGreen() / 255.0f,
        usedMaterial->DiffuseColor.getBlue() / 255.0f,
        usedMaterial->DiffuseColor.getAlpha() / 255.0f
      };
      services->setVertexShaderConstant("vColor", vColor, 4);
    }
};


J'applique le shader au node :

Code c++ :

texture = videoDriver()->getTexture("maTexture.png");
material.setTexture(0, texture);
material.Lighting = false;
// Stockage de l'opacité dans la matériau
material.DiffuseColor.setAlpha(100);
material.MaterialType = (video::E_MATERIAL_TYPE)shaders.opacity;


Le vertex shader :

// Récupération de la couleur diffuse du matériau du node
uniform vec4 vColor;

void main(void) {
  gl_FrontColor = vColor;
  gl_Position = ftransform();
  gl_TexCoord[0] = gl_MultiTexCoord0;
}

Le pixel shader :

uniform sampler2D T0;

void main(void) {
  vec4 col = texture2D(T0, gl_TexCoord[0].st);
  gl_FragColor = col * gl_Color;
}
Création du message 03-02-2011 23:17:11 Metallizer
Edit: Ce méthode n'a pas été retenue, voir le message #7 pour la solution
  • -------------------------------------


Bon finalement j'ai opté pour le shader et ça marche nickel, merci pour ton aide wink

J'ai défini une structure qui permet de lister les shaders disponibles qu'on peut appliquer à des nodes :

Code c++ :

struct Shaders {
  s32 opacity;
};


Les membres de cette structure sont définis en début de programme :

Code c++ :

void initShaders() {
  shaders.opacity = 0;
  if(gpu) {
    OpacityShaderCallback* cb = new OpacityShaderCallback();
    shaders.opacity = gpu->addHighLevelShaderMaterialFromFiles(
      "shader/opacity.vert", "vertexMain", video::EVST_VS_1_1,
      "shader/opacity.frag", "pixelMain", video::EPST_PS_1_1,
      cb, video::EMT_TRANSPARENT_ALPHA_CHANNEL
    );
    cb->drop();
  }
}


J'ai également défini un Callback pour ce shader :

Code c++ :

class OpacityShaderCallback : public video::IShaderConstantSetCallBack {
  public:
    const video::SMaterial* usedMaterial;
    virtual void OnSetMaterial(const video::SMaterial& material) {
      usedMaterial = &material;
    }
    virtual void OnSetConstants(video::IMaterialRendererServices* services, s32 userData) {
      // On récupère les informations de la couleur diffuse qui seront passés au shader
      f32 vColor[4] = {
        usedMaterial->DiffuseColor.getRed() / 255.0f,
        usedMaterial->DiffuseColor.getGreen() / 255.0f,
        usedMaterial->DiffuseColor.getBlue() / 255.0f,
        usedMaterial->DiffuseColor.getAlpha() / 255.0f
      };
      services->setVertexShaderConstant("vColor", vColor, 4);
    }
};


J'applique le shader au node :

Code c++ :

texture = videoDriver()->getTexture("maTexture.png");
material.setTexture(0, texture);
material.Lighting = false;
// Stockage de l'opacité dans la matériau
material.DiffuseColor.setAlpha(100);
material.MaterialType = (video::E_MATERIAL_TYPE)shaders.opacity;


Le vertex shader :

// Récupération de la couleur diffuse du matériau du node
uniform vec4 vColor;

void main(void) {
  gl_FrontColor = vColor;
  gl_Position = ftransform();
  gl_TexCoord[0] = gl_MultiTexCoord0;
}

Le pixel shader :

uniform sampler2D T0;

void main(void) {
  vec4 col = texture2D(T0, gl_TexCoord[0].st);
  gl_FragColor = col * gl_Color;
}

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
166 invités en ligne
membre en ligne: -
RSS Feed