GL_ADD blendfunc

New Message Reply Date view Thread view Subject view Author view

Paolo Farinelli (paolof++at++infobyte.it)
Mon, 01 Feb 1999 17:21:41 +0100


Hello Performers,

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



New Message Reply Date view Thread view Subject view Author view

This archive was generated by hypermail 2.0b2 on Mon Feb 01 1999 - 09:23:55 PST

This message has been cleansed for anti-spam protection. Replace '++at++' in any mail addresses with the '@' symbol.