Can we store 3d vertices in GPU memory?

Questions about the LÖVE API, installing LÖVE and other support related questions go here.
Forum rules
Before you make a thread asking for help, read this.
Post Reply
User avatar
kicknbritt
Citizen
Posts: 58
Joined: Sat May 30, 2015 2:15 am
Location: Chicago, IL/Anchorage,AK

Can we store 3d vertices in GPU memory?

Post by kicknbritt » Sat Nov 09, 2019 7:36 pm

So I'm working with GroverBurgers SS3D library (Thanks a ton dude.) and I'm working on a voxel game where I create meshes made up of 24x24x24 blocks.
The problem Im having is I have to store all those vertices in tables, and that takes up around 500-800 mb for only about ‭216‬ chunks!
Is there any way I can store vertices in a more efficient way? This seems like way too much memory usage.

This is what I use to draw models

Code: Select all

        
        -- go through all models in modelList and draw them
        for i=1, #self.modelList do
            local model = self.modelList[i]
            if model ~= nil and model.visible and #model.verts > 0 then
                self.threeShader:send("model_matrix", model.transform)
                self.threeShader:send("model_matrix_inverse", TransposeMatrix(InvertMatrix(model.transform)))

                love.graphics.setWireframe(model.wireframe)
                if model.culling then
                    love.graphics.setMeshCullMode("back")
                end

                love.graphics.draw(model.mesh, -self.renderWidth/2, -self.renderHeight/2)

                love.graphics.setMeshCullMode("none")
                love.graphics.setWireframe(false)
            end
        end
And this is the "self.threeShader" called above

Code: Select all

	-- define the shaders used in rendering the scene
    scene.threeShader = love.graphics.newShader[[
        uniform mat4 view;
        uniform mat4 model_matrix;
        uniform mat4 model_matrix_inverse;
        uniform float ambientLight;
        uniform vec3 ambientVector;

        varying mat4 modelView;
        varying mat4 modelViewProjection;
        varying vec3 normal;
        varying vec3 vposition;

        #ifdef VERTEX
            attribute vec4 VertexNormal;

            vec4 position(mat4 transform_projection, vec4 vertex_position) {
                modelView = view * model_matrix;
                modelViewProjection = view * model_matrix * transform_projection;

                normal = vec3(model_matrix_inverse * vec4(VertexNormal));
                vposition = vec3(model_matrix * vertex_position);

                return view * model_matrix * vertex_position;
            }
        #endif

        #ifdef PIXEL
            vec4 effect(vec4 color, Image texture, vec2 texture_coords, vec2 screen_coords) {
                vec4 texturecolor = Texel(texture, texture_coords);

                // if the alpha here is zero just don't draw anything here
                // otherwise alpha values of zero will render as black pixels
                if (texturecolor.a == 0.0)
                {
                    discard;
                }

                float light = max(dot(normalize(ambientVector), normal), 0);
                texturecolor.rgb *= max(light, ambientLight);

                return color*texturecolor;
            }
        #endif
    ]]
"I AM THE ARBITER!!!" *Pulls out Energy sword and kills everything*

User avatar
raidho36
Party member
Posts: 1932
Joined: Mon Jun 17, 2013 12:00 pm

Re: Can we store 3d vertices in GPU memory?

Post by raidho36 » Sat Nov 09, 2019 7:48 pm

Firstly a note, unless you use those as pixels in 3d, those are not voxels, just 3d blocks - Minecraft is not voxel.

Do you store your voxels as 3d cubes? If you do, you can only store geometry that's visible from the outside, which will cut down massively on amount of vertices in a typical object. Additionally, you can use volumetric compression such as octree representation, which reduces the amount of memory needed by simply storing less data. If you store them as textures, you can use texture compression, for example by using 8 bit palette color, or by generating hardware-supported compressed textures.

User avatar
kicknbritt
Citizen
Posts: 58
Joined: Sat May 30, 2015 2:15 am
Location: Chicago, IL/Anchorage,AK

Re: Can we store 3d vertices in GPU memory?

Post by kicknbritt » Sun Nov 10, 2019 11:03 am

Yes I am culling non visible faces/vertices.
The data structure I use to store the "Blocks" in data is only storing 2 bytes of information per block so 27,648‬ bytes a chunk, and since lua strings are stored by reference that is little to nothing.
My problem is each block face is generating 2 triangles, 6 vertices so 36 total vertices.
but that is 36 Nested tables, and with many blocks the memory quickly becomes infeasible even with Culling and Greedy Meshing.
I guess I just want to know if there is any way to store the vertices for love.graphics.newMesh more efficiently?
Because lua tables are not working very well for me.

See how thousands and thousands of these could add up?

Code: Select all

VertList[#VertList+1] = {x+VertSize,y+VertSize,z+VertSize, BlockTypeTable.TopUV[1],BlockTypeTable.TopUV[2],BlockLight,BlockLight,BlockLight}
"I AM THE ARBITER!!!" *Pulls out Energy sword and kills everything*

User avatar
raidho36
Party member
Posts: 1932
Joined: Mon Jun 17, 2013 12:00 pm

Re: Can we store 3d vertices in GPU memory?

Post by raidho36 » Sun Nov 10, 2019 11:32 am

You can create blank mesh and populate it with plain values. Anyway if you actually intend to use voxels, which implies absolutely massive amount of them, I suggest you store them as textures and use volumetic texture rendering, e.g. cube marching.
Last edited by raidho36 on Sun Nov 10, 2019 11:33 am, edited 1 time in total.

User avatar
pgimeno
Party member
Posts: 1895
Joined: Sun Oct 18, 2015 2:58 pm
Location: Valencia, ES

Re: Can we store 3d vertices in GPU memory?

Post by pgimeno » Sun Nov 10, 2019 11:32 am

kicknbritt wrote:
Sun Nov 10, 2019 11:03 am
My problem is each block face is generating 2 triangles, 6 vertices so 36 total vertices.
Using a vertex list should reduce that to 8, adding the overhead of the list of course which is 36 single numbers. If you manage to share them between blocks, the 8 would be reduced even further, to 1 per block plus the ones in the boundaries. For 24x24x24 blocks, that's 15625 vertices and a list of 497,664 numbers if my math is correct.

Anyway, to answer your question in the OP, as far as I know the mesh object is stored more efficiently than the Lua code used to generate it. I'm not sure about where it's stored; it may depend on the SpriteBatchUsage you give to the mesh.

User avatar
kicknbritt
Citizen
Posts: 58
Joined: Sat May 30, 2015 2:15 am
Location: Chicago, IL/Anchorage,AK

Re: Can we store 3d vertices in GPU memory?

Post by kicknbritt » Sun Nov 10, 2019 12:07 pm

Okay. Well thanks for all the feedback. Im going to try to check out vertex lists and the "static" mode on SpriteBatchUsage looks promising.
"I AM THE ARBITER!!!" *Pulls out Energy sword and kills everything*

User avatar
pgimeno
Party member
Posts: 1895
Joined: Sun Oct 18, 2015 2:58 pm
Location: Valencia, ES

Re: Can we store 3d vertices in GPU memory?

Post by pgimeno » Sun Nov 10, 2019 5:34 pm

Note I meant Mesh:setVertexMap. But now that I think about it, you probably can't use that, since the UVs need to be different depending on the face the vertex belongs to.

User avatar
kicknbritt
Citizen
Posts: 58
Joined: Sat May 30, 2015 2:15 am
Location: Chicago, IL/Anchorage,AK

Re: Can we store 3d vertices in GPU memory?

Post by kicknbritt » Sun Nov 10, 2019 6:43 pm

Oh rip. Well thanks anyway
[Edit] Actually it looks like it supports textures. Ill check it out
"I AM THE ARBITER!!!" *Pulls out Energy sword and kills everything*

Post Reply

Who is online

Users browsing this forum: No registered users and 6 guests