There are still some things I’m having trouble doing. Maybe someone could help me decompose the following fragment program (taken from the ATI_text_fragment_shader spec):
The following is an example that performs bumped
cubic environment mapping:
!!ATIfs1.0
StartPrelimPass;
PassTexCoord r0, t0.str; # 1st row of 3x3 basis matrix
PassTexCoord r1, t1.str; # 2nd row of 3x3 basis matrix
PassTexCoord r2, t2.str; # 3rd row of 3x3 basis matrix
PassTexCoord r3, t3.str; # Eye vector
SampleMap r4, t5.str; # Sample normal mapThree dot products transform from tangent space to cube map space
DOT3 r0.r, r0, r4;
DOT3 r0.g, r1, r4;
DOT3 r0.b, r2, r4;DOT3 r2.2x, r0, r3; # 2 * (N dot Eye)
MUL r2, r0, r2; # 2 * N * (N dot Eye)
DOT3 r1, r0, r0; # N dot N
MAD r1, r3.neg, r1, r2; # 2 * N * (N dot Eye) - Eye * (N dot N)
EndPass;StartOutputPass;
SampleMap r0, r0.str; # Sample diffuse cubic env map
SampleMap r1, r1.str; # Sample specular cubic env map
SampleMap r2, t5.str; # Sample the base map (gloss in a)MUL r0, r0, r2; # diffuse * base
MAD r0, r0, r2.a, r1; # (diffuse * base) + (spec * gloss)
EndPass;
Obviously just running this as my fragment program doesn’t work since I don’t have the proper values in the registers. But I can’t quite figure out what these values should be from the comments.
PassTexCoord r0, t0.str; # 1st row of 3x3 basis matrix
PassTexCoord r1, t1.str; # 2nd row of 3x3 basis matrix
PassTexCoord r2, t2.str; # 3rd row of 3x3 basis matrix
PassTexCoord r3, t3.str; # Eye vector
By “basis matrix” I’m guessing they mean a change of basis matrix. But for which bases? Is it a transformation from the standard basis? To the standard basis? I guess I’m just not familiar enough with OpenGL to understand that implicitly.
PassTexCoord r3, t3.str; # Eye vector
SampleMap r4, t5.str; # Sample normal map
“Eye vector” - is this the vector from the current fragment to the eye vector? How is this generated?
“normal map” - ok, I understand that this is the normal corresponding to the current fragment, but how do you specify that in your program (i.e., how do you generate the normal map other than a static texture you generate beforehand)? Why is it stored in texture register 5 (instead of the next one sequentially, 4)?
In general I’d like to know what these things are and how you assign them to the proper registers before they go to the fragment program. Sorry to say my knowledge of OpenGL is pretty hacked-together, which may explain some basic misunderstanding.
Thanks,
Keenan Crane
kcrane@uiuc.edu