I've had a try with a shader using advice from
here. Not sure if it's what you're after but it seems near.
DBP:
set display mode desktop width(), desktop height(), 32, 1
sync on : sync rate 60 : sync
load effect "worldposgridtest.fx", 1, 0
`perform checklist for effect errors : print checklist string$(1):sync:nice wait key
// setup scene
make object sphere 1, 10 : position object 1, 0, 5, 0 : set object effect 1, 1
make object plane 2, 32, 32 : xrotate object 2, 70 : set object effect 2, 1
for n = 3 to 40
make object plane n, 5, 5, 1
rotate object n, rnd(15), rnd(15), rnd(15)
position object n, cos(rnd(360))*20, sin(rnd(360))*20, cos(rnd(360))*20
set object effect n, 1
next n
zd# = 48.0
xOn = 1
yOn = 1
zOn = 1
do
// object control
if spacekey() then position object 1, cos(hitimer()*0.1)*5.0, 5.0, sin(hitimer()*0.1)*5.0
if controlkey() then xrotate object 2, object angle x(2) + 0.1
if shiftkey() then rotate object 2, object angle x(2) + 0.05, object angle y(2) + 0.1, object angle z(2) + 0.2
// camera control
position camera 0,0,0
rotate camera camera angle x() + mousemovey(), camera angle y() + mousemovex(), 0
if keystate(19) then rotate camera 0,-90,0 : zd# = 2048.0 : set camera fov 1
if keystate(20) then rotate camera 90,0,0 : zd# = 2048.0 : set camera fov 1
if keystate(33) then rotate camera 0,0,0 : zd# = 2048.0 : set camera fov 1
if keystate(25) then zd# = 48.0 : set camera fov 61.962
zd# = zd# + (downkey()-upkey())*0.75
move camera -zd#
// grid toggling
if keystate(45) then xOn = 1 - xOn : nice wait 200
if keystate(21) then yOn = 1 - yOn : nice wait 200
if keystate(44) then zOn = 1 - zOn : nice wait 200
if vector exist(1) = 0 then tmp = make vector4(1)
set vector4 1, (1-xOn)*10000, (1-yOn)*10000, (1-zOn)*10000, 0
set effect constant vector 1, "gridlineDistModifier", 1
print "try: spacebar (spin ball), control/shift (rotate plane), F/T/R keys for pseudo-ortho views, P key returns to perspective view"
print "mouse to orbit, up/down keys to zoom"
print "press key to show/hide gridlines: ", padleft$(left$("X",xOn),1), padleft$(left$("Y",yOn),1), padleft$(left$("Z",zOn),1)
sync
set cursor 0,0
nice wait 20
loop
worldposgridtest.fx:
float4x4 world : World;
float4x4 view : View;
float4x4 wvp : WorldViewProjection;
float4x4 wit : WorldInverseTranspose;
float3 gridlineDistModifier = float3(0,0,0);
struct VertexShaderInput
{
float4 Position : POSITION0;
float4 Normal : NORMAL0;
float2 TextureCoordinate : TEXCOORD0;
};
struct VertexShaderOutput
{
float4 Position : POSITION0;
float4 Color : COLOR0;
float2 TextureCoordinate : TEXCOORD0;
float3 CoordWorld : TEXCOORD1;
};
VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
{
VertexShaderOutput output;
output.Position = mul(input.Position, wvp);
output.CoordWorld = mul(input.Position, world);
output.Color = float4(1.0,1.0,1.0,1.0);
output.TextureCoordinate = input.TextureCoordinate;
return output;
}
float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
{
float4 output = float4(0.0, 0.0, 0.0, 1.0);
output.rgb = input.CoordWorld*0.01;
float3 gridlineDist = float3(
abs(input.CoordWorld.x) - floor(abs(input.CoordWorld.x)) + gridlineDistModifier.x,
abs(input.CoordWorld.y) - floor(abs(input.CoordWorld.y)) + gridlineDistModifier.y,
abs(input.CoordWorld.z) - floor(abs(input.CoordWorld.z)) + gridlineDistModifier.z
);
if (gridlineDist.x < 0.1) {
output.rgb = float3(1.0, 0.0, 0.0);
} else if (gridlineDist.y < 0.1) {
output.rgb = float3(0.0, 1.0, 0.0);
} else if (gridlineDist.z < 0.1) {
output.rgb = float3(0.0, 0.33, 1.0);
}
return output;
}
technique Technique1
{
pass Pass1
{
VertexShader = compile vs_3_0 VertexShaderFunction();
PixelShader = compile ps_3_0 PixelShaderFunction();
}
}
screen:
.