Page 1 of 2
Solid color and alpha questions
Posted: Sun Mar 05, 2006 4:10 am
by luvcraft
I have three quick questions I can't find the answers to anywhere in the Irrlicht documentation or here on the forums:
1. Is there a simple way to assign a solid color as the texture of an ISceneNode?
2. I have a texture with a gradual alpha; it is a circle that is solid at the edge, and fades to transparent in the middle. When I use it in Irrlicht, however, it is solid up to the point where the alpha<128, at which point it goes totally transparent. Is there any way to keep the gradual alpha change in Irrlicht?
3. Is there any way to adjust the overall alpha for a texture, for instance if I want a scene node to slowly fade out to total transparency?
Thanks in advance for the help!
Posted: Sun Mar 05, 2006 6:16 am
by vitek
Hava a look at SMaterial::MaterialTypeParam.
Posted: Sun Mar 05, 2006 9:02 pm
by luvcraft
vitek wrote:Hava a look at SMaterial::MaterialTypeParam.
Adjusting that would only change how much of the texture is completely transparent or completely solid. It doesn't have anything to do with the "gradual transparency" effect that I'm after. Thanks for trying.
At this point it looks like I'll probably need to switch to a different 3D engine, like Ogre3D, especially since I'm handling all of the gameplay code myself and not using any of Irrlicht's gameplay functions.
Oh well.
Posted: Mon Mar 06, 2006 4:29 am
by luvcraft
Well, I figured out #1 and #3: They can both be done with an IMeshManipulator, as in the following code snippet:
Code: Select all
IAnimatedMesh* mesh = smgr->getMesh("sydney.md2");
IMeshManipulator *manipulator = smgr->getMeshManipulator();
manipulator->setVertexColors(mesh->getMesh(0),SColor(128,255,0,0));
/*
this sets the alpha for the whole mesh to 128, and colors it red. If the mesh already has a texture, it will "dye" the texture red, otherwise it will just color the whole thing red
*/
int alpha=128;
manipulator->setVertexColorAlpha(mesh->getMesh(0),alpha);
the API says NOT to use this to make adjustments in your main program loop, and that it's only to be used to fix meshes before you use them, but it worked just fine when I used it within my main loop, and I can't find anything better that I'm supposed to use in my main loop.
I still have not found an answer to question #2. Any help would be greatly appreciated.
Posted: Mon Mar 06, 2006 5:06 am
by luvcraft
vitek wrote:Hava a look at SMaterial::MaterialTypeParam.
Whoa, nevermind. I just tried that again and it did exactly what I needed for #2. I guess my texture was screwed up the first time I tried it. Thanks! :)X
Posted: Mon Mar 06, 2006 7:04 am
by vitek
Glad you figured #1 and 3 out. I didn't know and have been to busy to look. Now I know. :)
Posted: Mon Mar 06, 2006 12:30 pm
by Spintz
SetVertexColor is too slow. I'd use the materialTypeParam for #3 and "animate" the value.
Posted: Mon Mar 06, 2006 7:36 pm
by luvcraft
Spintz wrote:SetVertexColor is too slow. I'd use the materialTypeParam for #3 and "animate" the value.
If I just wanted one or two things to fade that would work, but since I need it to be more dynamic I'll just have to keep using SetVertexColor until something better gets implemented.
Posted: Wed Jul 12, 2006 6:18 am
by counter123
I have exactly the same problem as your problem #2.
I want to have a texture that gradually fades out towards the edges but Irrlicht just does a hard cut after a certain alpha value, so everything above a certain alpha value is completely transparent and below that value it's completely opaque.
Can you post how exactly you solved that problem?
Re: Solid color and alpha questions
Posted: Wed Jul 12, 2006 3:34 pm
by Emil_halim
luvcraft wrote:
3. Is there any way to adjust the overall alpha for a texture, for instance if I want a scene node to slowly fade out to total transparency?
see Magic3D library here is a base class of Magic3D library
Code: Select all
/******************************************************
base Magic class
part of Magic Library
By Emil Halim
******************************************************/
#ifndef __I_base_Magic_H_INCLUDED__
#define __I_base_Magic_H_INCLUDED__
/// Base class for doing color and alpha blending effectes,
/// fade in and out effectes, by using Shader Language.
class CBaseMagicSceneNode : public scene::ISceneNode // public IMagic3DObject
{
protected:
IShaderProgram* Sprogram; ///< pointer to a shader program
f32 col[4]; ///< hold the current color component and alpha as float value
u8 red; ///< holds the current color red component as integer value
u8 green; ///< holds the current color green component as integer value
u8 blue; ///< holds the current color blue component as integer value
f32 alpha; ///< holds the current alpha value
f32 factor; ///< using in fading system
u32 oldtick; ///< using in fading system
u32 flag; ///< using in fading system
public:
/// constructor
CBaseMagicSceneNode(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id);
/// distructor
~CBaseMagicSceneNode();
/// attach a shader program to this scene node
void setShaderProgram(IShaderProgram* Sp);
/// set the color component red,green,blue
void setColor(u8 r,u8 g, u8 b);
/// set the aplha value
void setAlpha(f32 a);
/// fade in function
void FadeIn(f32 time);
/// fade out function
void FadeOut(f32 time);
/// cycle fading function
void FadeInOut(f32 in,u32 sty,f32 out,bool flg = false);
/// return fade factor
f32 getFadeFactor();
/// set fade factor
void setFadeFactor(f32 fctr);
};
//==============================================================================
/// constructor of the class
/// set the defulte value for each members
CBaseMagicSceneNode::CBaseMagicSceneNode(scene::ISceneNode* parent, scene::ISceneManager* mgr, s32 id) : ISceneNode(parent, mgr, id)
{
Sprogram = 0;
red =255;
green =255;
blue =255;
alpha =1.0f;
flag = 1;
setAutomaticCulling(false);
}
/// distructor of the class
CBaseMagicSceneNode::~CBaseMagicSceneNode()
{
}
/// allows you to create your own shader program then attach it to this node
/// or attach the program created in IniMagic Function
void CBaseMagicSceneNode::setShaderProgram(IShaderProgram* Sp)
{
Sprogram = Sp;
}
/// set the color component red,green,blue
void CBaseMagicSceneNode::setColor(u8 r,u8 g, u8 b)
{
red =r;
green =g;
blue =b;
}
/// set the aplha value
void CBaseMagicSceneNode::setAlpha(f32 a)
{
alpha=a;
}
/// fade in our scene node
/// time is the time of fading operation
/// it changes 50 times per second
void CBaseMagicSceneNode::FadeIn(f32 time)
{
u32 tick = GetTickCount();
if(tick-oldtick > 20)
{
oldtick = tick;
factor += 20.0/time;
if(factor>1.0)factor=1.0;
}
setAlpha(factor);
}
/// fade out our scene node
void CBaseMagicSceneNode::FadeOut(f32 time)
{
u32 tick = GetTickCount();
if(tick-oldtick > 20)
{
oldtick = tick;
factor -= 20.0/time;
if(factor<0.0)factor=0.0;
}
setAlpha(factor);
}
/// cycle fading of our scene node
/// in is the time to fade in
/// sty is the time befor it start to fade out
/// in is the time to fade out
/// flg true to cycle fading operation
void CBaseMagicSceneNode::FadeInOut(f32 in,u32 sty,f32 out,bool flg)
{
u32 tick = GetTickCount();
if((tick-oldtick > 20) && flag == 1)
{
oldtick = tick;
factor += 20.0/in;
if(factor>1.0){factor=1.0; flag = 2;}
}
if((tick-oldtick > sty) && flag == 2)
{
oldtick = tick;
flag = 3;
}
if((tick-oldtick > 20) && flag == 3)
{
oldtick = tick;
factor -= 20.0/out;
if(factor<0.0)
{
factor=0.0;
if(flg)flag=4;
}
}
if((tick-oldtick > sty) && flag == 4)
{
oldtick = tick;
flag = 1;
}
setAlpha(factor);
}
/// return fade factor
f32 CBaseMagicSceneNode::getFadeFactor()
{
return factor;
}
/// set fade factor
void CBaseMagicSceneNode::setFadeFactor(f32 fctr)
{
factor= fctr;
}
#endif
as you see , you could assign a solid color for each Obaject,and set it's
alpha value,and fading in and out it.
here is the link of Magic3D library
http://irrlicht.sourceforge.net/phpBB2/ ... &start=225
Posted: Wed Jul 12, 2006 4:52 pm
by vitek
Emil,
You posted all that code, and all it does is show how to set a flag to different values over time. It doesn't solve his problem because you don't show how you are rendering the node using the alpha value.
Travis
Posted: Wed Jul 12, 2006 7:38 pm
by Emil_halim
vitek wrote:Emil,
You posted all that code, and all it does is show how to set a flag to different values over time. It doesn't solve his problem because you don't show how you are rendering the node using the alpha value.
Travis
Hi vitek
yes , i post only part of magic3D library, it is not good idea to post all the code here, so if he see this part is usful he could download the library and see all the classes, and if he not like it , no problem no big code have posted.
Posted: Wed Jul 12, 2006 10:51 pm
by Pazystamo
For #2 it is very easy... I alredy post it in forum somewhere:
Code: Select all
bill->setMaterialTexture(0, driver->getTexture("sun.tga"));
bill->getMaterial(0).MaterialTypeParam = 0.01f; //this
bill->setMaterialType(video::EMT_TRANSPARENT_ALPHA_CHANNEL);//and this line
You can find it in my atmosphere source code.
0.01f is very small number,so texture has nice smooth edge, you can try to animate this value (rise it) to get sharp edge until texture disappere.
Posted: Thu Jul 13, 2006 6:02 am
by counter123
Pazystamo wrote:For #2 it is very easy... I alredy post it in forum somewhere:
Code: Select all
bill->setMaterialTexture(0, driver->getTexture("sun.tga"));
bill->getMaterial(0).MaterialTypeParam = 0.01f; //this
bill->setMaterialType(video::EMT_TRANSPARENT_ALPHA_CHANNEL);//and this line
You can find it in my atmosphere source code.
0.01f is very small number,so texture has nice smooth edge, you can try to animate this value (rise it) to get sharp edge until texture disappere.
Well, it seems to work for the edges, but if I make the alpha channel all grey, it doesn't look transparent. Until now I've been using EMT_TRANSPARENT_ADD_COLOR which looks a lot better than any of my alpha channel experiments. However EMT_TRANSPARENT_ADD_COLOR doesn't work very well if the background is very bright...
Posted: Thu Jul 13, 2006 9:56 am
by Pazystamo
counter123 wrote:Well, it seems to work for the edges, but if I make the alpha channel all grey, it doesn't look transparent. Until now I've been using EMT_TRANSPARENT_ADD_COLOR which looks a lot better than any of my alpha channel experiments. However EMT_TRANSPARENT_ADD_COLOR doesn't work very well if the background is very bright...
Everything is working, maybe your textures are bad?
![Image](http://img208.imageshack.us/img208/6594/a6nw.th.jpg)
![Image](http://img208.imageshack.us/img208/2504/b2iw.th.jpg)