brainval (brainval++at++onyx.montesa)
Tue, 16 Jul 1996 18:14:57 -0700
During our porting from IRISGL to OPENGL, of some Performer programs,
we have found a problem with the transparency in the OPENGL version.
In the case of a tree like this one:
GROUP
/ \
GEODE GEODE
| |
GSET+GSTATE1 GSET+GSTATE2
With these properties of GeoStates :
GSTATE1:
pfMat = pfNewMtl(arena);
pfMtlColorMode( pfMat, PFMTL_FRONT, PFMTL_CMODE_OFF);
pfMtlAlpha(pfMat, 0.5);
gstate = pfNewGState (arena);
pfGStateMode (gstate, PFSTATE_ENLIGHTING, PF_ON);
pfGStateMode (gstate, PFSTATE_TRANSPARENCY, PFTR_OFF);
pfGStateAttr(gstate, PFSTATE_FRONTMTL, pfMat);
pfGStateAttr(gstate, PFSTATE_BACKMTL, pfMat);
pfGStateMode(gstate, PFSTATE_CULLFACE, PFCF_OFF);
GSTATE2:
pfMat = pfNewMtl(arena);
pfMtlColorMode( pfMat, PFMTL_FRONT, PFMTL_CMODE_OFF);
pfMtlAlpha(pfMat, 1);
gstate = pfNewGState (arena);
pfGStateMode (gstate, PFSTATE_ENLIGHTING, PF_OFF);
pfGStateMode (gstate, PFSTATE_TRANSPARENCY, PFTR_HIGH_QUALITY);
pfGStateAttr(gstate, PFSTATE_FRONTMTL, pfMat);
Then the second geode is drawn with the Transparency of the first one.
We have make a small program (based in simple) with two geodes, with these
properties in the geostates.
The expected behavior was that the alpha output of the first geode change but
nothing affects the second one. (OK in IRISGL version).
The behavior found was that the second Geode is changing his transparency while
his alpha value is constant. (Result of OPENGL version).
We include it as an attachment:
error.c
Makefile
We can compile in Both versions IRISGL and OPENGL, the first one is working,
while the second one has this problem with transparency.
Is there something wrong in the source code ?
Is it a Bug ?
Someone has the same problem ?
Does Silicon Graphics know about that ?
Thank you, in advance:
Hector Viguer Segui.
Brainstorm Multimedia.
Software Development.
-- brainval++at++ehome.encis.es
#include <stdlib.h> #include <stdio.h> #include <math.h>
#include <Performer/pf.h> #include <Performer/pfutil.h>
static pfVec2 texcoords[]={ {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f}, {0.0f, 1.0f} };
static ushort texlist[] = { 0, 1, 2, 3 };
static pfVec3 coords[] ={ {-1.0f, 0.0f, -1.0f }, { 1.0f, 0.0f, -1.0f }, { 1.0f, 0.0f, 1.0f }, {-1.0f, 0.0f, 1.0f } };
static ushort vertexlist[] = { 0, 1, 2, 3 }; typedef struct { pfMaterial * globalMatGeo1; pfMaterial * globalMatGeo2; } TShared;
TShared * Shared;
/*=============================================================*/
static pfGeoSet * GetGeoset(void){ void * arena = pfGetSharedArena(); pfGeoSet *gset = pfNewGSet(arena); pfGSetAttr(gset, PFGS_COORD3, PFGS_PER_VERTEX, coords, vertexlist); pfGSetAttr(gset, PFGS_TEXCOORD2, PFGS_PER_VERTEX, texcoords, texlist);
pfGSetPrimType(gset, PFGS_QUADS); pfGSetNumPrims(gset, 1); return gset; }
static pfGeode * GetGeode1(void){ pfGeode * geode; pfGeoSet *gset; pfGeoState *gstate; pfMaterial * pfMat; void * arena = pfGetSharedArena();
pfMat = pfNewMtl(arena); pfMtlColorMode( pfMat, PFMTL_FRONT, PFMTL_CMODE_OFF); pfMtlAlpha(pfMat, 0.5); Shared->globalMatGeo1 = pfMat;
gstate = pfNewGState (arena); pfGStateMode (gstate, PFSTATE_ENLIGHTING, PF_ON); pfGStateMode (gstate, PFSTATE_TRANSPARENCY, PFTR_OFF); pfGStateAttr(gstate, PFSTATE_FRONTMTL, pfMat); pfGStateAttr(gstate, PFSTATE_BACKMTL, pfMat); pfGStateMode(gstate, PFSTATE_CULLFACE, PFCF_OFF); gset = GetGeoset(); pfGSetGState (gset, gstate); geode = pfNewGeode(); pfAddGSet(geode, gset); return geode; }
static pfGeode * GetGeode2(void){ pfGeode * geode; pfGeoSet *gset; pfGeoState *gstate; pfMaterial * pfMat; void * arena = pfGetSharedArena();
pfMat = pfNewMtl(arena); pfMtlColorMode( pfMat, PFMTL_FRONT, PFMTL_CMODE_OFF); pfMtlAlpha(pfMat, 1); Shared->globalMatGeo2 = pfMat;
gstate = pfNewGState (arena); pfGStateMode (gstate, PFSTATE_ENLIGHTING, PF_OFF); pfGStateMode (gstate, PFSTATE_TRANSPARENCY, PFTR_HIGH_QUALITY); pfGStateAttr(gstate, PFSTATE_FRONTMTL, pfMat); gset = GetGeoset(); pfGSetGState (gset, gstate); geode = pfNewGeode(); pfAddGSet(geode, gset); return geode; }
/*===================================================*/
static void DrawFunc(pfChannel *chan, void *data) { static float r = 0;
r += 1.0/100.0; if (r >= 1) r = 0; pfMtlAlpha(Shared->globalMatGeo1, r); pfMtlAlpha(Shared->globalMatGeo2, 1); pfClear(PFCL_DEPTH | PFCL_COLOR , NULL); pfDraw(); }
int main (int argc, char *argv[]) { float t = 0.0f; pfScene *scene; pfPipe *p; pfPipeWindow *pw; pfChannel *chan; pfSphere bsphere; pfGroup *root; pfGeode *geode1,*geode2; pfDCS *dcs1,*dcs2; pfCoord view;
pfInit(); pfMultiprocess(PFMP_DEFAULT);
Shared = (TShared *) pfMalloc(sizeof(TShared), pfGetSharedArena());
pfConfig();
/* Configure and open GL window */ p = pfGetPipe(0); pw = pfNewPWin(p); pfPWinName(pw, "Error Error"); pfPWinType(pw, PFWIN_TYPE_X); /* pfPWinConfigFunc(pw, winOpenDraw); */ pfPWinConfigFunc(pw, pfOpenPWin); pfPWinOriginSize(pw, 100, 100, 500, 500); pfConfigPWin(pw);
pfFrame();
root = pfNewGroup();
dcs1 = pfNewDCS(); pfDCSTrans (dcs1, -2.0f, 0.1f, 0.5f); pfDCSScale (dcs1, 0.5); pfAddChild(dcs1, GetGeode1());
dcs2 = pfNewDCS(); pfAddChild(dcs2, GetGeode2()); pfDCSTrans (dcs2, 2.0f, 0.1f, 0.5f);
pfAddChild(root, dcs1); /* first child is base */ pfAddChild(root, dcs2); /* subsequent children are offset-layered */
scene = pfNewScene(); pfAddChild(scene, root);
/* determine extent of scene's geometry */ pfGetNodeBSphere (scene, &bsphere);
/* Create and configure a pfChannel. */ chan = pfNewChan(p); pfChanScene(chan, scene); pfChanNearFar(chan, 1.0f, 10.0f * bsphere.radius); pfChanFOV(chan, 50.0f, -1.0f); pfSetVec3(view.hpr, 0, 0, 0); pfSetVec3(view.xyz, 0, -2.5f * bsphere.radius, 0); pfChanView(chan, view.xyz, view.hpr); pfChanTravFunc(chan, PFTRAV_DRAW, DrawFunc);
/* Simulate for twenty seconds. */ while (t < 30.0f) { pfSync(); pfFrame(); t = pfGetTime(); }
pfExit(); return 0; }
#!smake -J 1 #-------------------------------------------------------------------# #-- Makefile for Performer/src/pguide/libpf/C directory --# #-------------------------------------------------------------------# #-- RCS version information --# #-- $Revision: 1.68 $ --# #-- $Date: 1996/04/11 11:52:51 $ --# #-------------------------------------------------------------------#
#-------------------------------------------------------------------# #-- The default make target makes the IRISGL Dynamic Shared Object.-# #-- The targets are: --# #-- build debugging versions: igldbg (or ogldbg) --# #-- build optimized versions: iglopt (or oglopt) --# #-- build dynamic shared object versions: igldso ogldso --# #-- build debugging dynamic shared object versions: --# #-- iglddso oglddso --# #-- remove all unneeded files after a build: clean --# #-- remove all machine generated files: clobber --# #-- --# #-- --# #-------------------------------------------------------------------#
#-- #-- definitions #--
#if !defined(PFSTYLE) PFSTYLE = 32 #endif #if $(PFSTYLE) == "64" OBJECT_STYLE = 64 LIBBITSUF=64 PFRELEASE=N64 #endif #if $(PFSTYLE) == "N32" OBJECT_STYLE = N32_M3 LIBBITSUF=32 PFRELEASE=N32 #endif #if $(PFSTYLE) == "32" OBJECT_STYLE = 32 LIBBITSUF= PFRELEASE=O32 #endif
include $(ROOT)/usr/include/make/commondefs
PFROOT ?= $(ROOT)
DSOLINKS = \ -L$(PFROOT)/usr/lib$(LIBBITSUF) \ -L$(PFROOT)/usr/lib$(LIBBITSUF)/libpfdb \ -L$(PFROOT)/lib$(LIBBITSUF)
DDSOLINKS = \ -L$(PFROOT)/usr/lib$(LIBBITSUF)/Performer/Debug \ -L$(PFROOT)/usr/lib$(LIBBITSUF)/Performer/Debug/libpfdb \ -L$(PFROOT)/lib$(LIBBITSUF)
DBGLINKS = \ -L$(PFROOT)/usr/lib$(LIBBITSUF)/Performer/DebugStatic \ -L$(PFROOT)/usr/lib$(LIBBITSUF)/Performer/DebugStatic/libpfdb \ -L$(PFROOT)/lib$(LIBBITSUF)
OPTLINKS = \ -L$(PFROOT)/usr/lib$(LIBBITSUF)/Performer/Static \ -L$(PFROOT)/usr/lib$(LIBBITSUF)/Performer/Static/libpfdb \ -L$(PFROOT)/lib$(LIBBITSUF)
IGLLIB = -ignore_unresolved -lpf_igl -lpfdu_igl -lpfui -lpfutil_igl OGLLIB = -ignore_unresolved -lpf_ogl -lpfdu_ogl -lpfui -lpfutil_ogl
#if defined(PFSTATIC_CONVERTERS) IGLLIB += -all $(PFSTATIC_CONVERTERS) -none OGLLIB += -all $(PFSTATIC_CONVERTERS) -none #endif
LIBIGL = -ignore_unresolved -lgl LIBOGL = -ignore_unresolved -lGLU -lGL -lXext
#if $(RELEASE) < 6.2 IRIXREL=-DIRIX5 #else IRIXREL=-DIRIX6 #LIBIGL += -lXsgivc ##LIBOGL += -lXsgivc #endif
SYSTEM_IRISGL = \ -lmpc \ -limage \ -lfm \ ${LIBIGL} \ -lXirisw \ -lXm \ -lXt \ -lfpe \ -lXmu \ -lX11 \ -lm \ -lmalloc \ -lC
SYSTEM_OPENGL = \ -lmpc \ -limage \ -lGLw \ ${LIBOGL} \ -lfpe \ -lXm \ -lXt \ -lXmu \ -lX11 \ -lm \ -lmalloc \ -lC
#if $(PFSTYLE) == "64" SYSTEM_OPENGL = \ -limage \ -lGLw \ ${LIBOGL} \ -lXm \ -lXmu \ -lX11 \ -lm \ -lC #endif
#if $(PFSTYLE) == "N32" SYSTEM_IRISGL = \ -limage \ ${LIBIGL} \ -lXm \ -lXmu \ -lX11 \ -lm \ -lfm \ -lC
SYSTEM_OPENGL = \ -limage \ -lGLw \ ${LIBOGL} \ -lXm \ -lXmu \ -lX11 \ -lm \ -lC #endif
#-- targets are the executables TARGETS = error texture
OBJECTS = \ $(TARGETS:=.o)\ culldl.o \ billboard.o
#-- #-- #-- generic targets #--
#-- make optimized dso version of program by default default: ogldso
#-- synonym targets debug: ogldbg optimize: oglopt
#-- make all versions of program all: ogldbg oglopt ogldso oglddso
igldso: $(TARGETS:=.igldso) iglopt: $(TARGETS:=.iglopt) igldbg: $(TARGETS:=.igldbg) iglddso: $(TARGETS:=.iglddso)
ogldso: $(TARGETS:=.ogldso) oglopt: $(TARGETS:=.oglopt) ogldbg: $(TARGETS:=.ogldbg) oglddso: $(TARGETS:=.oglddso)
#-- clean up directories {remove junk} clean: if test -d DBG.$(PFRELEASE).IRISGL; then cd DBG.$(PFRELEASE).IRISGL ; rm -f ${OBJECTS} core ; cd .. ; fi if test -d DBG.$(PFRELEASE).OPENGL; then cd DBG.$(PFRELEASE).OPENGL ; rm -f ${OBJECTS} core ; cd .. ; fi if test -d OPT.$(PFRELEASE).IRISGL; then cd OPT.$(PFRELEASE).IRISGL ; rm -f ${OBJECTS} core ; cd .. ; fi if test -d OPT.$(PFRELEASE).OPENGL; then cd OPT.$(PFRELEASE).OPENGL ; rm -f ${OBJECTS} core ; cd .. ; fi
#-- remove all machine-built files clobber: clean if test -d OPT.$(PFRELEASE).IRISGL ; then rm -rf OPT.$(PFRELEASE).IRISGL ; fi if test -d OPT.$(PFRELEASE).OPENGL ; then rm -rf OPT.$(PFRELEASE).OPENGL ; fi if test -d DBG.$(PFRELEASE).IRISGL ; then rm -rf DBG.$(PFRELEASE).IRISGL ; fi if test -d DBG.$(PFRELEASE).OPENGL ; then rm -rf DBG.$(PFRELEASE).OPENGL ; fi rm -f ${TARGETS}
#-- #-- library targets #--
$(TARGETS): $(++at++:=.igldso)
$(TARGETS:=.igldbg): .MAKE ++at++echo "\nmaking IrisGL DBG version of $++at++" ++at++if test ! -d DBG.$(PFRELEASE).IRISGL ; then mkdir -p DBG.$(PFRELEASE).IRISGL ; fi ++at++ rm -f $(++at++:S/.igldbg//) ++at++cd DBG.$(PFRELEASE).IRISGL ; \ ${MAKE} -f ../Makefile OPTIMIZER=-g LCDEFS=-DIRISGL LCXXDEFS=-DIRISGL \ LIBRARIES='$(IGLLIB) ${SYSTEM_IRISGL}' \ $(++at++:S/igl//)cmd ; ++at++echo "making symbolic links to DBG versions" ln -s DBG.$(PFRELEASE).IRISGL/$(++at++:S/igl//)cmd $(++at++:S/.igldbg//) ;
$(TARGETS:=.iglopt): .MAKE ++at++echo "\nmaking IrisGL OPT version of $++at++" ++at++if test ! -d OPT.$(PFRELEASE).IRISGL ; then mkdir -p OPT.$(PFRELEASE).IRISGL ; fi ++at++ rm -f $(++at++:S/.iglopt//) ++at++cd OPT.$(PFRELEASE).IRISGL ; \ ${MAKE} -f ../Makefile OPTIMIZER="-O -Olimit 2000" LCDEFS=-DIRISGL LCXXDEFS=-DIRISGL \ LIBRARIES='$(IGLLIB) ${SYSTEM_IRISGL}' \ $(++at++:S/igl//)cmd ; cd .. ++at++echo "making symbolic links to OPT versions" ln -s OPT.$(PFRELEASE).IRISGL/$(++at++:S/igl//)cmd $(++at++:S/.iglopt//) ;
$(TARGETS:=.igldso): .MAKE ++at++echo "\nmaking IrisGL DSO version of $++at++" ++at++if test ! -d OPT.$(PFRELEASE).IRISGL ; then mkdir -p OPT.$(PFRELEASE).IRISGL ; fi ++at++ rm -f $(++at++:S/.igldso//) ++at++cd OPT.$(PFRELEASE).IRISGL ; \ ${MAKE} -f ../Makefile OPTIMIZER="-O -Olimit 2000" LCDEFS=-DIRISGL LCXXDEFS=-DIRISGL \ LIBRARIES='$(IGLLIB) ${SYSTEM_IRISGL}' \ $(++at++:S/igl//)cmd ; cd .. ++at++echo "making symbolic links to DSO versions" ln -s OPT.$(PFRELEASE).IRISGL/$(++at++:S/igl//)cmd $(++at++:S/.igldso//) ;
$(TARGETS:=.iglddso): .MAKE ++at++echo "\nmaking IrisGL DDSO version of $++at++" ++at++if test ! -d DBG.$(PFRELEASE).IRISGL ; then mkdir -p DBG.$(PFRELEASE).IRISGL ; fi ++at++ rm -f $(++at++:S/.iglddso//) ++at++cd DBG.$(PFRELEASE).IRISGL ; \ ${MAKE} -f ../Makefile OPTIMIZER=-g LCDEFS=-DIRISGL LCXXDEFS=-DIRISGL \ LIBRARIES='$(IGLLIB) ${SYSTEM_IRISGL}' \ $(++at++:S/igl//)cmd ; cd .. ++at++echo "making symbolic links to DDSO versions" ln -s DBG.$(PFRELEASE).IRISGL/$(++at++:S/igl//)cmd $(++at++:S/.iglddso//) ;
$(TARGETS:=.ogldbg): .MAKE ++at++echo "\nmaking OpenGL DBG version of $++at++" ++at++if test ! -d DBG.$(PFRELEASE).OPENGL ; then mkdir -p DBG.$(PFRELEASE).OPENGL ; fi ++at++ rm -f $(++at++:S/.ogldbg//) ++at++cd DBG.$(PFRELEASE).OPENGL ; \ ${MAKE} -f ../Makefile OPTIMIZER="-g " \ LIBRARIES='$(OGLLIB) ${SYSTEM_OPENGL}' \ $(++at++:S/ogl//)cmd ; cd .. ++at++echo "making symbolic links to DBG versions" ln -s DBG.$(PFRELEASE).OPENGL/$(++at++:S/ogl//)cmd $(++at++:S/.ogldbg//) ;
$(TARGETS:=.oglopt): .MAKE ++at++echo "\nmaking OpenGL OPT version of $++at++" ++at++if test ! -d OPT.$(PFRELEASE).OPENGL ; then mkdir -p OPT.$(PFRELEASE).OPENGL ; fi ++at++ rm -f $(++at++:S/.oglopt//) ++at++cd OPT.$(PFRELEASE).OPENGL ; \ ${MAKE} -f ../Makefile OPTIMIZER="-O -Olimit 2000" \ LIBRARIES='$(OGLLIB) ${SYSTEM_OPENGL}' \ $(++at++:S/ogl//)cmd ; cd .. ++at++echo "making symbolic links to OPT versions" ln -s OPT.$(PFRELEASE).OPENGL/$(++at++:S/ogl//)cmd $(++at++:S/.oglopt//) ;
$(TARGETS:=.ogldso): .MAKE ++at++echo "\nmaking OpenGL DSO version of $++at++" ++at++if test ! -d OPT.$(PFRELEASE).OPENGL ; then mkdir -p OPT.$(PFRELEASE).OPENGL ; fi ++at++ rm -f $(++at++:S/.ogldso//) ++at++cd OPT.$(PFRELEASE).OPENGL ; \ ${MAKE} -f ../Makefile OPTIMIZER="-O -Olimit 2000" \ LIBRARIES='$(OGLLIB) ${SYSTEM_OPENGL}' \ $(++at++:S/ogl//)cmd ; cd .. ++at++echo "making symbolic links to DSO versions" ln -s OPT.$(PFRELEASE).OPENGL/$(++at++:S/ogl//)cmd $(++at++:S/.ogldso//);
$(TARGETS:=.oglddso): .MAKE ++at++echo "\nmaking OpenGL DDSO version of $++at++" ++at++if test ! -d DBG.$(PFRELEASE).OPENGL ; then mkdir -p DBG.$(PFRELEASE).OPENGL ; fi ++at++ rm -f $(++at++:S/.oglddso//) ++at++cd DBG.$(PFRELEASE).OPENGL ; \ ${MAKE} -f ../Makefile OPTIMIZER="-g " \ LIBRARIES='$(OGLLIB) ${SYSTEM_OPENGL}' \ $(++at++:S/ogl//)cmd ; cd .. ++at++echo "making symbolic links to DDSO versions" ln -s DBG.$(PFRELEASE).OPENGL/$(++at++:S/ogl//)cmd $(++at++:S/.oglddso//);
dso: ogldso ddso: oglddso dbg: ogldbg opt: oglopt
#-- #-- internal targets #--
.SUFFIXES: .dbgcmd .optcmd .dsocmd .ddsocmd
.o.dbgcmd: ${CC} ${CFLAGS} -o $++at++ $< $(DBGLINKS) -all ${LIBRARIES}
.o.optcmd: ${CC} ${CFLAGS} -o $++at++ $< $(OPTLINKS) -all ${LIBRARIES}
.o.dsocmd: ${CC} ${CFLAGS} -o $++at++ $< $(DSOLINKS) -all ${LIBRARIES}
.o.ddsocmd: ${CC} ${CFLAGS} -o $++at++ $< $(DDSOLINKS) -all ${LIBRARIES}
#-- #-- internal targets #--
#-- look for sources in this directory when recursing .PATH: ..
======================================================================= List Archives, FAQ, FTP: http://www.sgi.com/Technology/Performer/ Submissions: info-performer++at++sgi.com Admin. requests: info-performer-request++at++sgi.com
This archive was generated by hypermail 2.0b2 on Mon Aug 10 1998 - 17:53:11 PDT