Adding 2 vectors & normalizing result in RegCombiners using nvparse

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
"
// add normal from animated texture (tex1) onto normal from static texture (tex2)
"{
"
" rgb {
"
" discard = expand(tex1);
"
" discard = expand(tex2);
"
" spare0 = sum();
"
" }
"
"}
"

	// normalise this vector
	"{                                            

"
" rgb {
"
" spare1 = spare0 . spare0;
"
" }
"
"}
"
"{
"
" rgb {
"
" discard = spare0;
"
" discard = half_bias(spare0) * unsigned_invert(spare1);
"
" spare0 = sum();
"
" }
"
"}
"

	// dot product the normalised vector with the light vector
	"{                                            

"
" rgb {
"
" spare1 = spare0 . expand(col0);
"
" }
"
"}
"

	// output the dot product result directly, for testing purposes
	"out.rgb = spare1;								

"
"out.a = unsigned_invert(zero);
" );

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

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)

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!

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.