Archived

This topic is now archived and is closed to further replies.

Intamin AG

ATI_fragment_program (resolved)

Recommended Posts

Hi! If I just enable the ATI fragment shaders (I HAVE BOUND AND BUILT A SHADER) the whole scene is invisible. BTW I dont have any textures applied. Anyone has ideas? [edited by - Intamin AG on November 17, 2003 11:17:48 AM]

Share this post


Link to post
Share on other sites
I allready enabeled it.

No textures, and only one light (GL_LIGHT0);

The shader, enabled and bound, is the one from it's specification document:


glBeginFragmentShaderATI();

// Pass 1

glPassTexCoordATI(GL_REG_1_ATI, GL_TEXTURE1_ARB, GL_SWIZZLE_STR_ATI); // N

glPassTexCoordATI(GL_REG_2_ATI, GL_TEXTURE2_ARB, GL_SWIZZLE_STR_ATI); // light to vertex vector in light space

glPassTexCoordATI(GL_REG_3_ATI, GL_TEXTURE3_ARB, GL_SWIZZLE_STR_ATI); // H

glSampleMapATI(GL_REG_4_ATI, GL_TEXTURE4_ARB, GL_SWIZZLE_STR_ATI); // L (sample cubemap normalizer)


// reg4 = N.L

glColorFragmentOp2ATI(GL_DOT3_ATI, GL_REG_4_ATI, GL_NONE, GL_NONE,
GL_REG_1_ATI, GL_NONE, GL_NONE,
GL_REG_4_ATI, GL_NONE, GL_2X_BIT_ATI|GL_BIAS_BIT_ATI);

// reg1 = N.H

glColorFragmentOp2ATI(GL_DOT3_ATI, GL_REG_1_ATI, GL_NONE, GL_NONE,
GL_REG_1_ATI, GL_NONE, GL_NONE,
GL_REG_3_ATI, GL_NONE, GL_NONE);

// reg1(green) = H.H (aka |H|^2)

glColorFragmentOp2ATI(GL_DOT3_ATI, GL_REG_1_ATI, GL_GREEN_BIT_ATI, GL_NONE,
GL_REG_3_ATI, GL_NONE, GL_NONE,
GL_REG_3_ATI, GL_NONE, GL_NONE);

// reg2 = |light to vertex|^2

glColorFragmentOp2ATI(GL_DOT3_ATI, GL_REG_2_ATI, GL_NONE, GL_NONE,
GL_REG_2_ATI, GL_NONE, GL_NONE,
GL_REG_2_ATI, GL_NONE, GL_NONE);

// Pass 2

glSampleMapATI(GL_REG_0_ATI, GL_TEXTURE5_ARB, GL_SWIZZLE_STR_ATI); // sample enviroment map using eye vector

glSampleMapATI(GL_REG_2_ATI, GL_REG_2_ATI, GL_SWIZZLE_STR_ATI); // sample attenuation map

glSampleMapATI(GL_REG_3_ATI, GL_REG_1_ATI, GL_SWIZZLE_STR_ATI); // sample specular NHHH map = (N.H)^256

glPassTexCoordATI(GL_REG_4_ATI, GL_REG_4_ATI, GL_SWIZZLE_STR_ATI); // pass N.L through


// reg3 = (N.H)^256 * (N.L)

// this ensures a pixel is only lit if facing the light (since the specular exponent

// makes negative N.H positive we must do this)

glColorFragmentOp2ATI(GL_MUL_ATI, GL_REG_3_ATI, GL_NONE, GL_NONE,
GL_REG_3_ATI, GL_NONE, GL_NONE,
GL_REG_4_ATI, GL_NONE, GL_NONE);

// reg3 = specular * environment map

glColorFragmentOp2ATI(GL_MUL_ATI, GL_REG_3_ATI, GL_NONE, GL_NONE,
GL_REG_0_ATI, GL_NONE, GL_NONE,
GL_REG_3_ATI, GL_NONE, GL_NONE);

// reg4 = diffuse * environment map

glColorFragmentOp2ATI(GL_MUL_ATI, GL_REG_4_ATI, GL_NONE, GL_NONE,
GL_REG_0_ATI, GL_NONE, GL_NONE,
GL_REG_4_ATI, GL_NONE, GL_NONE);

// reg0 = (specular * environment map) + (diffuse * environment map)

glColorFragmentOp2ATI(GL_ADD_ATI, GL_REG_0_ATI, GL_NONE, GL_NONE,
GL_REG_3_ATI, GL_NONE, GL_NONE,
GL_REG_4_ATI, GL_NONE, GL_NONE);

// apply point light attenuation

glColorFragmentOp2ATI(GL_MUL_ATI, GL_REG_0_ATI, GL_NONE, GL_SATURATE_BIT_ATI,
GL_REG_0_ATI, GL_NONE, GL_NONE,
GL_REG_2_ATI, GL_RED, GL_NONE);
glEndFragmentShaderATI();


EDIT: I obviously do need textures for the reflection, but does it HAVE to be GL_MULTITEXTURE_ARB or can it also be GL_CUBE_MAP_ARB ??

and what happens when I enable it in a scene with a rotating non-textured pyramid and only one light enabeled, it shows a black, empty screen (the grid i draw isnt shown too)


[edited by - Intamin AG on November 17, 2003 8:11:50 AM]

Share this post


Link to post
Share on other sites