Paolo Farinelli (paolof++at++infobyte.it)
Mon, 01 Feb 1999 17:21:41 +0100
I am trying to implement two-pass BumpMapping as suggested
by Angus Dorby's BumpLogo source code and documentation.
I am having trouble using the GL_ADD mode for my first pass,
in which I am supposed to add bump-texture intensity to
vertex color.
I include a small sample code, in which I create a textured
quad, with a GL_ADD TexEnv, set gset's color to grey, and
set tex-env bias and scale to 0s and 1s in a predraw callback.
Unfortunately, GL_ADD doesn't seem to be working.. :(
Could Angus or anyone else spot my mistake(s) and help me get
this right?
Thank you in advance for any feedback,
Paolo
PS: find attached a small .bw image to be used with the code below..
/********************************************************************************/
#include <stdlib.h>
#include <Performer/pf.h>
#include <Performer/pfutil.h>
#include <Performer/pfdu.h>
/********************************************************************************/
static int PreDrawPass0(pfTraverser * trav, void *data)
{
GLfloat biasparams[] = { 0.0f, 0.0f, 0.0f, 0.0f };
GLfloat colorparams[] = { 1.0f, 1.0f, 1.0f, 1.0f };
/*glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD);*/
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_BIAS_SGIX, biasparams);
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, colorparams);
return PFTRAV_CONT;
}
static int PostDrawPass0(pfTraverser * trav, void *data)
{
return PFTRAV_CONT;
}
/********************************************************************************/
void main(int argc, char* argv[])
{
float t = 0.0f;
pfScene *scene;
pfPipe *p;
pfPipeWindow *pw;
pfChannel *chan;
pfCoord view;
pfGeode *geode;
pfGeoSet *gset;
pfGeoState *gstate;
pfVec3 *coords;
pfVec4 *colours;
pfTexture *tex;
pfTexEnv *tenv;
pfVec2 *texCoord;
pfInit();
pfMultiprocess( PFMP_DEFAULT );
pfConfig();
scene = pfNewScene();
coords= pfCalloc( 4, sizeof(pfVec3), pfGetSharedArena());
pfSetVec3( coords[0], 0.0f, 0.0f, 10.0f );
pfSetVec3( coords[1], 0.0f, 0.0f, 0.0f );
pfSetVec3( coords[2], 10.0f, 0.0f, 0.0f );
pfSetVec3( coords[3], 10.0f, 0.0f, 10.0f );
colours = pfCalloc( 4, sizeof(pfVec4), pfGetSharedArena());
pfSetVec4( colours[0], 0.5f, 0.5f, 0.5f, 1.0f );
pfSetVec4( colours[1], 0.5f, 0.5f, 0.5f, 1.0f );
pfSetVec4( colours[2], 0.5f, 0.5f, 0.5f, 1.0f );
pfSetVec4( colours[3], 0.5f, 0.5f, 0.5f, 1.0f );
texCoord= pfCalloc( 4, sizeof(pfVec2), pfGetSharedArena());
pfSetVec2( texCoord[0], 0.0f, 1.0f );
pfSetVec2( texCoord[1], 0.0f, 0.0f );
pfSetVec2( texCoord[2], 1.0f, 0.0f );
pfSetVec2( texCoord[3], 1.0f, 1.0f );
gset = pfNewGSet(pfGetSharedArena());
pfGSetAttr( gset, PFGS_COORD3, PFGS_PER_VERTEX, coords, NULL );
pfGSetAttr( gset, PFGS_COLOR4, PFGS_PER_VERTEX, colours, NULL );
pfGSetPrimType( gset, PFGS_QUADS );
pfGSetNumPrims( gset, 1 );
pfGSetAttr( gset, PFGS_TEXCOORD2, PFGS_PER_VERTEX, texCoord, NULL );
tenv = pfNewTEnv(pfGetSharedArena());
pfTEnvMode( tenv, GL_ADD );
pfTEnvBlendColor( tenv, 1.0f, 1.0f, 1.0f, 1.0f );
tex = pfNewTex( pfGetSharedArena());
pfLoadTexFile( tex, "./brick.bw" );
/*pfTexFormat( tex, PFTEX_INTERNAL_FORMAT, PFTEX_I_8 );*/
gstate = pfNewGState(pfGetSharedArena());
pfGStateMode( gstate, PFSTATE_TRANSPARENCY, PFTR_OFF);
pfGStateMode( gstate, PFSTATE_ENTEXTURE, PF_ON);
pfGStateMode( gstate, PFSTATE_ENLIGHTING, PF_OFF);
pfGStateMode( gstate, PFSTATE_CULLFACE, PFCF_BACK);
pfGStateAttr( gstate, PFSTATE_TEXENV, tenv );
pfGStateAttr( gstate, PFSTATE_TEXTURE, tex );
pfGSetGState( gset, gstate );
geode = pfNewGeode();
pfAddGSet( geode, gset );
pfNodeTravFuncs( geode, PFTRAV_DRAW, PreDrawPass0, PostDrawPass0);
pfAddChild(scene, geode);
p = pfGetPipe(0);
pw = pfNewPWin(p);
pfPWinType(pw, PFPWIN_TYPE_X);
pfPWinName(pw, "IRIS Performer");
pfPWinOriginSize(pw, 0, 0, 500, 500);
/* Open and configure the GL window. */
pfOpenPWin(pw);
/* Create and configure a pfChannel. */
chan = pfNewChan(p);
pfChanScene(chan, scene);
pfChanFOV(chan, 45.0f, 0.0f);
pfChanNearFar(chan, 0.05f, 100.0f );
pfSetVec3(view.hpr, 0.0f, 0.0f, 0.0f);
pfSetVec3(view.xyz, 5.0f, -20.0f, 5.0f);
pfChanView(chan, view.xyz, view.hpr);
/* Simulate for twenty seconds. */
while (pfGetTime() < 20.0f)
{
pfSync();
pfFrame();
}
pfExit();
}
/********************************************************************************/
--
Paolo Farinelli Infobyte Spa - Virtual Reality Division
VR Software Engineer Via della Camilluccia 67 - 00135 Roma - Italy
E-mail paolof++at++infobyte.it World Wide Web http://www.infobyte.it
Phone +39-06-35572219 Phone +39-06-355721 Fax +39-06-35572300
This archive was generated by hypermail 2.0b2 on Mon Feb 01 1999 - 09:23:55 PST