Historique des modifications - Message

Message #11797

Sujet: Changer la coloration de la texture d'une skybox


Type Date Auteur Contenu
Création du message 12-05-2017 11:04:52 Magun
ba oui surment, déjà tu crée de nouvelle texture a chaque frame qui ne sont pas nécéssaire
et puis je suis pas sur pour le setMaterialTexture

Code c++ :

#include <irrlicht.h>
#include <iostream>

using namespace irr;
using namespace irr::core;
using namespace irr::video;

void set_color(array<ITexture*> skybox, array<ITexture*> rendered, vector3df RedCoef, vector3df GreenCoef, vector3df BlueCoef, float colorCoeff)
{
    for(unsigned i = 0; i<skybox.size(); ++i)
    {
        irr::video::SColor color;
        unsigned char *src = (unsigned char*) skybox[i]->lock(ETLM_READ_ONLY);
        unsigned char *dst = (unsigned char*) rendered[i]->lock(ETLM_WRITE_ONLY);

        u32 pitch = skybox[i]->getPitch();
        u32 bytes = video::IImage::getBitsPerPixelFromFormat(skybox[i]->getColorFormat()) / 8;


        for(unsigned x = 0; x<skybox[i]->getSize().Width; ++x)
        {
            for(unsigned y = 0; y<skybox[i]->getSize().Height; ++y)
            {
                unsigned char *in = src + (y * pitch) + (x * bytes);
                unsigned char *out = dst + (y * pitch) + (x * bytes);

                color.setData(in, skybox[i]->getColorFormat());

                
                float r = color.getRed() / 255.f;
                float g = color.getGreen() / 255.f;
                float b = color.getBlue() / 255.f;

                float rsepia = r * RedCoef.X + g * RedCoef.Y + b * RedCoef.Z;
                float gsepia = r * GreenCoef.X + g * GreenCoef.Y + b * GreenCoef.Z;
                float bsepia = r * BlueCoef.X + g * BlueCoef.Y + b * BlueCoef.Z;

                r = colorCoeff*r + (1.0-colorCoeff)*rsepia;
                g = colorCoeff*g + (1.0-colorCoeff)*gsepia;
                b = colorCoeff*g + (1.0-colorCoeff)*bsepia;

                color.setRed(std::min(r * 225.f, 255.f));
                color.setGreen(std::min(g * 225.f, 255.f));
                color.setBlue(std::min(b * 225.f, 255.f));

                color.getData(out, skybox[i]->getColorFormat());
            }
        }

        rendered[i]->unlock();
        skybox[i]->unlock();
    }
}

int main()
{
    IrrlichtDevice* device = createDevice(video::EDT_OPENGL, core::dimension2d<u32>(640, 480));
    video::IVideoDriver* driver = device->getVideoDriver();
    scene::ISceneManager* smgr = device->getSceneManager();
    gui::IGUIEnvironment* gui = device->getGUIEnvironment();
    
    driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, false);
    
    array<ITexture*> skybox;
    array<ITexture*> rendered;
    
    skybox.push_back(driver->getTexture("../../media/irrlicht2_up.bmp"));
    skybox.push_back(driver->getTexture("../../media/irrlicht2_dn.bmp"));
    skybox.push_back(driver->getTexture("../../media/irrlicht2_lf.bmp"));
    skybox.push_back(driver->getTexture("../../media/irrlicht2_rt.bmp"));
    skybox.push_back(driver->getTexture("../../media/irrlicht2_ft.bmp"));
    skybox.push_back(driver->getTexture("../../media/irrlicht2_bk.bmp"));
    
    for(int i = 0; i<skybox.size(); ++i)
    {
        irr::core::stringc name = "skybox_";
        name += i;
        rendered.push_back(driver->addTexture(skybox[i]-> getSize(), name.c_str(), skybox[i]-> getColorFormat()));
    }

    smgr->addSkyBoxSceneNode(
        rendered[0], rendered[1],
        rendered[2], rendered[3],
        rendered[4], rendered[5]
    );

    driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, true);

    scene::ICameraSceneNode* cam = smgr->addCameraSceneNodeFPS();
    cam->setPosition(core::vector3df(-100,50,100));
    cam->setTarget(core::vector3df(0,0,0));
    device->getCursorControl()->setVisible(false);
    
    irr::u32 time = device->getTimer()->getTime() / 1000;

    while(device->run())
    {
        driver->beginScene(true, true, video::SColor(255,0,0,0));
        smgr->drawAll();
        set_color(
            skybox, rendered,
            vector3df(0.393, 0.769, 0.189),
            vector3df(0.349, 0.686, 0.168),
            vector3df(0.272, 0.534, 0.131),
            sin(device->getTimer()->getTime() / 1000.0)
        );
        driver->endScene();
    }

    device->drop();

    return 0;
}

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