Fixed function and shader not doing same thing?

Started by
2 comments, last by Warwick Michael Dumas 11 years, 10 months ago
[font=verdana,geneva,sans-serif]Hi, first time I have posted here. I am more-or-less a novice with DirectX. I am working on a graphical output for my scientific simulation. The reason I chose DX over ray-tracing is partly that I already started learning DX, and partly just that I am not actually looking for realistic graphics - e.g. I want to light things arbitrarily with silly ambient lighting inside a deep dark well, but enough about that.[/font]

[font=verdana,geneva,sans-serif]The problem I am having is the following.[/font]

[font=verdana,geneva,sans-serif]I make my surface graph using a shader which is pretty simple and based on the book by Frank Luna.[/font]
[font=verdana,geneva,sans-serif]I am feeding a vertex buffer which (I have checked with watches) has x,z coordinates that populate a square (-3,3)x(-3,3).[/font]
[font=verdana,geneva,sans-serif]That appeared to work.[/font]

[font=verdana,geneva,sans-serif]Then I am also trying to draw axes, in the fixed function pipeline, by using DrawPrimitiveUP. At the moment I am trying to draw one line with D3DPT_LINESTRIP and passing data (-3.02,0,3.02),(-3.02,0,-3.02).[/font]
[font=verdana,geneva,sans-serif]The line appears, but well away from the edge of the graph! If I instead set (-2.4,0,2.4),(-2.4,0,-2.4) then it appears still a bit outside the graph square.[/font]
[font=verdana,geneva,sans-serif](Meanwhile, if I draw line (3,0,3),(3,10,3) then it looks like it appears in the correct place, though I'm still checking that further.)[/font]

[font=verdana,geneva,sans-serif]I have checked, checked, checked that the view*projection matrix being used in SetTransform is the same as is passed to the shader, and the shader does not do anything funny.[/font]

[font=verdana,geneva,sans-serif]Any ideas what could be going on I would welcome. Quite happy to provide more information if there's anything you'd like to ask. [/font]
Advertisement
There are different rasterization rules for lines as there are for triangles which can cause this. See: http://msdn.microsof...4(v=vs.85).aspx

It was also once the case that shaders may not give the same result as the fixed pipeline; OpenGL specifies that this is allowed (or at least doesn't specify that it's not) (and it was known to happen in the old days - hence the existence of ftransform and option ARB_position_invariant) but I haven't found anything specific to D3D, and I doubt if it's relevant anymore as all modern gfx hardware emulates the fixed pipeline using shaders anyway.

Direct3D has need of instancing, but we do not. We have plenty of glVertexAttrib calls.

I remember a long time ago I also encountered a problem when I was rendering some objects using the FFP and other objects using shaders - there were visual glitches when the objects were touching each other. It looked quite like a z buffer precision problem, I think it may be caused by a slightly different way how the FFP handles W / V / P matrices and how I handled them in the vertex shader - of course the basic math was the same, but probably rounding errors related to floating point precision or something like that...
(It certainly wasn't z-fighting, it all got fixed just by rendering everything using shaders.)
Thank you v much for responses.

I now established that the error was in the eye of the beholder - the two things aren't meant to touch, they are at different y-coordinates. The axes are in the right place.

My first query and it was unintentionally a windup.

Now I just have to work out how to make text appear at device coordinates instead of screen coordinates.

This topic is closed to new replies.

Advertisement