Trying to find hidden agendas you say? I guess that makes two of us then!
I am not trying to find hidden agenda's. I simply assume that if you work on a game for 5 years, and come up with ONE surface shader, you have a DAMN GOOD reason for writing it the way you did.
Now when people replace a single instruction, and get noticable performance increases on the hardware that this shader was supposed to be targeting, I want to know WHY?
I just thought it was funny that in most D3 threads I've seen, it's WinRAR that's mentioned (seemingly perpetuated), which, you should agree, certainly implies RAR compression.
No? RAR reads a variety of formats, I believe it can even open ISOs and .CABs for example. Surely everyone knows those aren't compressed with RAR?
The only thing it implies is that it is in a format that RAR can understand.
Dump the register combiner calls using your favourite GL logger.
I'm not into OpenGL, I don't know how to do that. Besides, I don't have any NV-hardware at the moment. If anyone else does, feel free and post the results here.
No, it has similarities to pow(). They felt it was necessary for artistic reasons to retain the properties of their hacked specular function in the arb2 path.
It's still backwards, no matter how you put it. Why do you think it has similarities to pow()? Perhaps because that is what it approximates?!
And I think the artistic reasons are a bit of a silly excuse. They could also have tried to make the artwork look as good as possible on the high-end hardware.
Besides, when I run the R200 path on my R3x0 card, it doesn't look the same at all, the specular highlights look very different. If they were going for the same appearance, that should not have happened. The difference might actually be larger than the difference that pow() would give vs the LUT. In which case the pow() would be perfectly acceptable.
Did you not take on board the point that (N.H)^P is an approximation in itself?
So the excuse to an approximation of an approximation is the fact that you are approximating an approximation?
If you go down that road, you might aswell state that 3d graphics are only trying to approximate reality anyway, so it doesn't matter how 3d graphics look.
Bottom line is still that pow() is a decent approximation, giving nicely defined highlights. The highlights in Doom3 aren't that well-defined, and I can't imagine an artist actually preferring such washed-out undetailed highlights over the pow()-ones. I wonder how many Hollywood movies use the same function as Doom3 does, rather than a pow() or a falloff-function that is based on artistic demands, rather than demands of ancient hardware (note that the texture is a precalced version of the shading capable by NV1x/2x, the texture cannot contain an arbitrary function, since NV1x/2x cannot do the dependent reads required to use a texture as a falloff function for specular).
But the arb2 path targets R3xx, R4xx, NV3x and NV4x. I don't think there's single (non-trivial) shader that is going to be completely 'optimal' for all of these chips. It's a matter of compromising: for the nv30 path to been ditched, any nv30 accommodations to the arb2 path shouldn't hurt performance all that much for other chips, and they don't seem to in typical situations.
The silly thing is that he didn't ditch the NV3x-path until after he found out that NV3x could render the ARB2-path at the same speed with the new 'magic' drivers (as we know from his .plan at the time, the NV3x series was about twice as slow on the ARB2 path as the R3x0, so that would be plenty suspicious), so he knew about the driver replacements before he made the decision to abandon the NV3x path.