Voxels are discolored
Moderator: Graf Zahl
-
- Posts: 29
- Joined: Fri Nov 28, 2008 1:18
Voxels are discolored
This seems to have always been the case, but it's still there in the latest (r1175). As the attached screenshot shows, the voxels seem to have a red/blue discoloration to them.
nVidia Geforce 8600GT, drivers 260.19.29
[spoiler] [/spoiler]
nVidia Geforce 8600GT, drivers 260.19.29
[spoiler] [/spoiler]
- Gez
- Developer
- Posts: 1399
- Joined: Mon Oct 22, 2007 16:47
Re: Voxels are discolored
Strange. I don't have this issue.
- Enjay
- Developer
- Posts: 4748
- Joined: Tue Aug 30, 2005 23:19
- Location: Scotland
- Contact:
Re: Voxels are discolored
I'm not getting those huge levels of discolouration, but the undersides of some of the voxels are the wrong colour for me.



Pics taken with r1175
They look correct in Zdoom.
Geforce 285 GTX Driver 260.99



Pics taken with r1175
They look correct in Zdoom.
Geforce 285 GTX Driver 260.99
- Gez
- Developer
- Posts: 1399
- Joined: Mon Oct 22, 2007 16:47
Re: Voxels are discolored
Voxels don't have undersides in ZDoom. :p
In ZDoom, each voxel is basically a 2D texel positioned in a volumetric space. The way to approximate that in GZDoom would be to have models created not of little cubes, but of many billboarded planes. If you look with angles extreme enough (easier to notice when looking down since ZDoom doesn't let you look up as much), you'll manage to see "through" the voxels. You can also notice the tell-tale distortion from Y-shearing.

GZDoom turns voxels into little cubes, but they don't seem to be painted with the right color on each face. This underface problem was not introduced by my change, it was there before r1175.
In ZDoom, each voxel is basically a 2D texel positioned in a volumetric space. The way to approximate that in GZDoom would be to have models created not of little cubes, but of many billboarded planes. If you look with angles extreme enough (easier to notice when looking down since ZDoom doesn't let you look up as much), you'll manage to see "through" the voxels. You can also notice the tell-tale distortion from Y-shearing.



GZDoom turns voxels into little cubes, but they don't seem to be painted with the right color on each face. This underface problem was not introduced by my change, it was there before r1175.
-
- Posts: 29
- Joined: Fri Nov 28, 2008 1:18
Re: Voxels are discolored
Running it in Valgrind, I see errors like this:
Code: Select all
==24793== Conditional jump or move depends on uninitialised value(s)
==24793== at 0x842E57F: FVoxelVertexHash::Compare(FVoxelVertex const&, FVoxelVertex const&) (gl_models.h:255)
==24793== by 0x842EAC2: TMap<FVoxelVertex, unsigned int, FVoxelVertexHash, FIndexInit>::FindKey(FVoxelVertex) (tarray.h:789)
==24793== by 0x842E7F5: TMap<FVoxelVertex, unsigned int, FVoxelVertexHash, FIndexInit>::GetNode(FVoxelVertex) (tarray.h:809)
==24793== by 0x842E697: TMap<FVoxelVertex, unsigned int, FVoxelVertexHash, FIndexInit>::operator[](FVoxelVertex) (tarray.h:520)
==24793== by 0x842DA5B: FVoxelModel::AddVertex(FVoxelVertex&, TMap<FVoxelVertex, unsigned int, FVoxelVertexHash, FIndexInit>&) (gl_voxels.cpp:288)
==24793== by 0x842DBA4: FVoxelModel::AddFace(int, int, int, int, int, int, int, int, int, int, int, int, unsigned char, TMap<FVoxelVertex, unsigned int, FVoxelVertexHash, FIndexInit>&) (gl_voxels.cpp:314)
==24793== by 0x842E0FD: FVoxelModel::MakeSlabPolys(int, int, kvxslab_t*, TMap<FVoxelVertex, unsigned int, FVoxelVertexHash, FIndexInit>&) (gl_voxels.cpp:378)
==24793== by 0x842E1CA: FVoxelModel::Initialize() (gl_voxels.cpp:402)
==24793== by 0x842D6A3: FVoxelModel::FVoxelModel(FVoxel*, bool) (gl_voxels.cpp:261)
==24793== by 0x842A8CE: gl_InitModels() (gl_models.cpp:274)
==24793== by 0x83D7358: gl_InitData() (gl_data.cpp:453)
==24793== by 0x83DC406: gl_PreprocessLevel() (gl_setup.cpp:651)
==24793==
==24793== Invalid read of size 1
==24793== at 0x842E05E: FVoxelModel::MakeSlabPolys(int, int, kvxslab_t*, TMap<FVoxelVertex, unsigned int, FVoxelVertexHash, FIndexInit>&) (gl_voxels.cpp:378)
==24793== by 0x842E1CA: FVoxelModel::Initialize() (gl_voxels.cpp:402)
==24793== by 0x842D6A3: FVoxelModel::FVoxelModel(FVoxel*, bool) (gl_voxels.cpp:261)
==24793== by 0x842A8CE: gl_InitModels() (gl_models.cpp:274)
==24793== by 0x83D7358: gl_InitData() (gl_data.cpp:453)
==24793== by 0x83DC406: gl_PreprocessLevel() (gl_setup.cpp:651)
==24793== by 0x82A0AD0: P_SetupLevel(char*, int) (p_setup.cpp:4023)
==24793== by 0x81FB3FF: G_DoLoadLevel(int, bool) (g_level.cpp:875)
==24793== by 0x81FA75D: G_InitNew(char const*, bool) (g_level.cpp:447)
==24793== by 0x81D3496: D_DoomMain() (d_main.cpp:2304)
==24793== by 0x81976B3: main (i_main.cpp:325)
==24793== Address 0x9179260 is 0 bytes after a block of size 416 alloc'd
==24793== at 0x4025D8E: operator new[](unsigned int) (vg_replace_malloc.c:258)
==24793== by 0x82D5613: R_LoadKVX(int) (r_data.cpp:507)
==24793== by 0x82F45C1: R_InitSpriteDefs() (r_things.cpp:484)
==24793== by 0x82F67A8: R_InitSprites() (r_things.cpp:1309)
==24793== by 0x82A0D3C: P_Init() (p_setup.cpp:4145)
==24793== by 0x81D3104: D_DoomMain() (d_main.cpp:2207)
==24793== by 0x81976B3: main (i_main.cpp:325)
- Gez
- Developer
- Posts: 1399
- Joined: Mon Oct 22, 2007 16:47
Re: Voxels are discolored
That one is in ZDoom code.Chris wrote:Running it in Valgrind, I see errors like this:Code: Select all
==24793== Address 0x9179260 is 0 bytes after a block of size 416 alloc'd ==24793== at 0x4025D8E: operator new[](unsigned int) (vg_replace_malloc.c:258) ==24793== by 0x82D5613: R_LoadKVX(int) (r_data.cpp:507) ==24793== by 0x82F45C1: R_InitSpriteDefs() (r_things.cpp:484) ==24793== by 0x82F67A8: R_InitSprites() (r_things.cpp:1309) ==24793== by 0x82A0D3C: P_Init() (p_setup.cpp:4145) ==24793== by 0x81D3104: D_DoomMain() (d_main.cpp:2207) ==24793== by 0x81976B3: main (i_main.cpp:325)
-
- Posts: 29
- Joined: Fri Nov 28, 2008 1:18
Re: Voxels are discolored
That's just referencing where the pointer was allocated. P_LoadKVX new[]'d a pointer that FVoxelModel::MakeSlabPolys is reading too many elements from.Gez wrote:That one is in ZDoom code.Chris wrote:Running it in Valgrind, I see errors like this:Code: Select all
==24793== Address 0x9179260 is 0 bytes after a block of size 416 alloc'd ==24793== at 0x4025D8E: operator new[](unsigned int) (vg_replace_malloc.c:258) ==24793== by 0x82D5613: R_LoadKVX(int) (r_data.cpp:507) ==24793== by 0x82F45C1: R_InitSpriteDefs() (r_things.cpp:484) ==24793== by 0x82F67A8: R_InitSprites() (r_things.cpp:1309) ==24793== by 0x82A0D3C: P_Init() (p_setup.cpp:4145) ==24793== by 0x81D3104: D_DoomMain() (d_main.cpp:2207) ==24793== by 0x81976B3: main (i_main.cpp:325)
EDIT:
The function has:
Code: Select all
int z = ztop;
while (z < ztop+zleng)
{
int c = 0;
while (z+c < ztop+zleng && col[c] == col[0]) c++;
if (cull & 1)
{
AddFace(x, y, z, x, y+1, z, x, y, z+c, x, y+1, z+c, *col, check);
}
if (cull & 2)
{
AddFace(x+1, y+1, z, x+1, y, z, x+1, y+1, z+c, x+1, y, z+c, *col, check);
}
if (cull & 4)
{
AddFace(x, y, z, x+1, y, z, x, y, z+c, x+1, y, z+c, *col, check);
}
if (cull & 8)
{
AddFace(x+1, y+1, z, x, y+1, z, x+1, y+1, z+c, x, y+1, z+c, *col, check);
}
z+=c;
col+=c;
}
if (cull & 32)
{
int z = ztop+zleng-1;
AddFace(x+1, y, z+1, x, y, z+1, x+1, y+1, z+1, x, y+1, z+1, *col, check);
}
- Graf Zahl
- GZDoom Developer
- Posts: 7148
- Joined: Wed Jul 20, 2005 9:48
- Location: Germany
- Contact:
Re: Voxels are discolored
fixed the bottom face problem. The discoloration looks like some kind of driver related issue though.
-
- Posts: 29
- Joined: Fri Nov 28, 2008 1:18
Re: Voxels are discolored
Okay, I seem to have found the source of the discoloration. I had the texture mode set to DXT5, and I guess the texture that gets used for the voxel is compressed accordingly. Setting it to RGBA8 cleared it up (I normally set ScaleX2 and format DXT5, which results in slightly nicer looking texturing for the same video memory usage). Since the voxel's texture seems to be more of a palette, though, wouldn't it be better to force them to RGB8? Or better, allow different formats for textures, sprites, voxels, and models.
- Graf Zahl
- GZDoom Developer
- Posts: 7148
- Joined: Wed Jul 20, 2005 9:48
- Location: Germany
- Contact:
Re: Voxels are discolored
Ok, thanks for that piece of info. Yes, this texture needs to be forced to an RGB mode. Obviously it can't work with compression.
- Gez
- Developer
- Posts: 1399
- Joined: Mon Oct 22, 2007 16:47
Re: Voxels are discolored
Interestingly, with DXT5, I guess strong discoloration if HQR is off, weaker with Scale 2X, nearly none with Scale 3X, and I can't see any discoloration with Scale 4X. Same deal for the HQnX options: discolored in HQ2X, not obviously so in HQ3X, looks fine in HQ4X.
Compressed RGBA yields the same results as S3TC-DXT5, and DXT3 and DXT1 are the same as well.
Compressed RGBA yields the same results as S3TC-DXT5, and DXT3 and DXT1 are the same as well.
- Enjay
- Developer
- Posts: 4748
- Joined: Tue Aug 30, 2005 23:19
- Location: Scotland
- Contact:
Re: Voxels are discolored
Yes, the test map looks fine for me now.Graf Zahl wrote:fixed the bottom face problem.