PDA

View Full Version : Adding 2 vectors & normalizing result in RegCombiners using nvparse



knackered
01-16-2002, 03:35 AM
I'm using a geforce3. Bear in mind I'm pretty new to nvparse (and its odd syntax).
I have an animated 'normal' texture (tex1), and a static 'normal' texture (tex2).
In the register combiners, I want to add a normal from tex1 to tex2, and normalise the result - then dot product this vector with the light vector (col0).
I'm getting 'white-out' when I try this:-

nvparse(
"!!RC1.0 \n"
// add normal from animated texture (tex1) onto normal from static texture (tex2)
"{ \n"
" rgb { \n"
" discard = expand(tex1); \n"
" discard = expand(tex2); \n"
" spare0 = sum(); \n"
" } \n"
"} \n"

// normalise this vector
"{ \n"
" rgb { \n"
" spare1 = spare0 . spare0; \n"
" } \n"
"} \n"
"{ \n"
" rgb { \n"
" discard = spare0; \n"
" discard = half_bias(spare0) * unsigned_invert(spare1); \n"
" spare0 = sum(); \n"
" } \n"
"} \n"

// dot product the normalised vector with the light vector
"{ \n"
" rgb { \n"
" spare1 = spare0 . expand(col0); \n"
" } \n"
"} \n"

// output the dot product result directly, for testing purposes
"out.rgb = spare1; \n"
"out.a = unsigned_invert(zero); \n" );

Zeno
01-16-2002, 09:43 AM
Just a guess, but I think that things in register combiners are always clamped to
[-1,1] so maybe when you add your two normals it is getting truncated.

Try multiplying each normalmap normal by 0.5 before summing them. You could do this either by pre-multiplying the normal maps or using register combiner constants.

-- Zeno

Carmacksutra
01-16-2002, 11:28 AM
I think your error comes from the fact the second normalization stage expects spare0 to be unexpanded (so that half_bias(spare0) effect is expanding and multiplying by 0.5)

try this:

combiner #0:
change both expand to half_bias
(this will do what Zeno suggested)

combiner #2:
discard = signed_identity(spare0)
discard = signed_identity(spare0) * half_bias_negate(spare1)
pare0 = sum()

tested only on paper (i use different equotation)

knackered
01-16-2002, 12:49 PM
Damn, I forgot that values are clamped to (-1,1) within the combiners! I remember now, from when I used the reg combiner function calls directly....
Why are they clamped even within a general stage? I can understand them having to be clamped before being outputed to the next stage...
Also, why the strange syntax for addition? why can't we just write "spare0 = expand(tex1) + expand(tex2)" ?
I'll try out your suggestions when I get back to my code...thanks for the replies chaps!

knackered
01-17-2002, 08:53 AM
Carmacksutra, I don't know if you were using psuedo code there, but if you were not, then there are no keywords (or equivelents) like "signed_identity" or "half_bias_negate" when using nvparse.
I've got round this though, and it works rather nicely now. Thanks for all the help.