it seems that blend modes (or base material types) does not work for custom shaders.
I pass EMT_TRANSPARENT_ADD_COLOR to addHighLevelShaderMaterial but color is not added. Instead it's just replaced.
In fragment shader all I do is: gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
red is not added to green:

if i do gl_FragColor = vec4(1.0, 0.0, 0.0, 0.0);
and use EMT_TRANSPARENT_ALPHA_CHANNEL
then mesh is not displayed (full transparent) - this is ok, but if i replace 0.0 with any other greater value like
gl_FragColor = vec4(1.0, 0.0, 0.0, 0.1);
then mesh is rendered with 100% red channel (the same effect as on screenshot above)
Am I doing something wrong or it's not supposed to work this way?
This is full source code:
Code: Select all
#include <irrlicht.h>
using namespace irr;
using namespace video;
using namespace scene;
IrrlichtDevice *device;
IVideoDriver *driver;
ISceneManager *smgr;
ICameraSceneNode *cam;
const char *VERTEX =
{
"void main() {"
" gl_Position = ftransform();"
"}"
};
const char *FRAGMENT =
{
"void main() {"
" gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);"
"}"
};
int main(int argc, char *argv[])
{
device = createDevice( video::EDT_OPENGL, core::dimension2d<u32>(800, 600),32,false, false, false);
driver = device->getVideoDriver();
smgr = device->getSceneManager();
cam = smgr->addCameraSceneNode();
cam->setPosition(core::vector3df(100,100,100));
cam->setTarget(core::vector3df(0,0,0));
//add a simple mesh
ISceneNode *node=smgr->addMeshSceneNode(smgr->getMesh("media/beast.b3d"));
node->setMaterialTexture(0, driver->getTexture("media/beast1.png"));
node->setMaterialFlag(EMF_LIGHTING, false);
//build shader
irr::u32 shader = driver->getGPUProgrammingServices()->addHighLevelShaderMaterial(VERTEX, "main", EVST_VS_1_1,FRAGMENT, "main", EPST_PS_1_1, NULL, EMT_TRANSPARENT_ADD_COLOR);
node->setMaterialType((irr::video::E_MATERIAL_TYPE)shader);
while(device->run()) {
driver->beginScene(true, true, SColor(255, 0, 255, 0));
smgr->drawAll();
driver->endScene();
}
return EXIT_SUCCESS;
}