Skip to main content
GameDev.net gamedev.net
🔒 Locked

Voxel structure programming implementation

Started by Leo Oz Sep 8, 2012 at 11:06 AM 10 replies 4k views
Original Post
Leo Oz
Leo Oz
Hello, everybody!

The 3D scene consist of 20 objects based on polygonal model structure. I wanna convert polygonal objects to voxel data structure (i think it's array 3D map) . And voxel objects will be used for constructing distance field of all environment world.

Please, tell me, do you have any ideas about using c# structure class to store voxel data and be able for further using in code or any algorithms and methods?

Do you know any API or wrap that could realize this functionality?

Thanks.
Leo Oz
Leo Oz
Come on, ladies and gentlemen !
Auskennfuchs
Auskennfuchs
Thinking about it brought me to one idea. You can use a zbuffer to voxelize your objects. With the size of this ZBuffer you can scale the density of your voxelgrid. Now render each object or the whole scene at origin from all six sides and stay at same distance from origin for each side with an orthogonal projectionmatrix. For every "side-rendering" you know x,y,z position for every pixel and can set visibility-flag for all voxels. If you also need color for a voxel use an additonal diffuse-buffer and save the color from same position.
Leo Oz
Leo Oz
No, man.

I don't need rendering voxelized object. I need structure of voxelizard object in program code, for exapmle, type - array of byte.
oggs91
oggs91
according to the detailed question .... my answer is: octree
oggs91
oggs91

Thinking about it brought me to one idea. You can use a zbuffer to voxelize your objects. With the size of this ZBuffer you can scale the density of your voxelgrid. Now render each object or the whole scene at origin from all six sides and stay at same distance from origin for each side with an orthogonal projectionmatrix. For every "side-rendering" you know x,y,z position for every pixel and can set visibility-flag for all voxels. If you also need color for a voxel use an additonal diffuse-buffer and save the color from same position.

interesting idea !
DracoLacertae
DracoLacertae
Look up the Sparse Voxel Octree. It's probably the best way to squeeze voxel data down to a reasonable size.

What's your end goal of the project? What do you want to use the distance fields for?
Leo Oz
Leo Oz

Look up the Sparse Voxel Octree. It's probably the best way to squeeze voxel data down to a reasonable size.

What's your end goal of the project? What do you want to use the distance fields for?
DracoLacertae, thanks so. I'm planing to use distance field for definition distance between objects. It's very difficult to build distance field for Sparse Voxel Octree, 3D array is more better I think. If you have another mind about it, please, post me material reference.
MrOMGWTF
MrOMGWTF
Make sure your model has uv coordinates. Render your model to a texture. Set each vertex position to its vertex coordinates. Set each vertex color to its position. For each pixel, create a voxel at the position from pixel's color.
Leo Oz
Leo Oz

Make sure your model has uv coordinates. Render your model to a texture. Set each vertex position to its vertex coordinates. Set each vertex color to its position. For each pixel, create a voxel at the position from pixel's color.
man, I don't catch what you have in mind! Could you show me class structure?
MrOMGWTF
MrOMGWTF
First, render your model to a texture. Vertex shader:

// Authors : Sinje Thiedemann, Niklas Henrich,
// Thorsten Grosch, Stefan Mueller

varying vec3 P;

void main()
{
// Transform atlas texture coordinate into NDC
gl_Position = vec4((gl_MultiTexCoord0.xy * 2.0) - vec2(1.0), 0.0, 1.0);

// Pass world-space position to fragment shader
P = (gl_ModelViewMatrix * gl_Vertex).xyz;
}


Frag shader:

varying vec3 P;

void main()
{
// Store world-position in atlas texture
gl_FragColor = vec4(P, 1.0);
}


Then, for each pixel, to something like this:

foreach pixel:
addVoxelAtPosition(pixel.color);


Got it?
Leo Oz
Leo Oz

First, render your model to a texture. Vertex shader:

// Authors : Sinje Thiedemann, Niklas Henrich,
// Thorsten Grosch, Stefan Mueller

varying vec3 P;

void main()
{
// Transform atlas texture coordinate into NDC
gl_Position = vec4((gl_MultiTexCoord0.xy * 2.0) - vec2(1.0), 0.0, 1.0);

// Pass world-space position to fragment shader
P = (gl_ModelViewMatrix * gl_Vertex).xyz;
}


Frag shader:

varying vec3 P;

void main()
{
// Store world-position in atlas texture
gl_FragColor = vec4(P, 1.0);
}


Then, for each pixel, to something like this:

foreach pixel:
addVoxelAtPosition(pixel.color);


Got it?
Man, I got it, thanks. But how can I use voxel data in program code? Do you read my question?
I asked about "c# structure class to store voxel data and be able for further using in code". Capish?

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.