简体   繁体   中英

How can i make GL_POINTS overlap to look like spheres?

I am attempting to create a voxel style game, and I want to use GL_POINTS to simulate spherical voxels.

I am aiming to have them look like 3d spheres without having to render an actual sphere with many vertices.

However, when I created a mass of GL_POINTS, they overlap in a way that makes it obvious that they are flat circle sprites.

Here is an example: my image example of gl_points overlapping showing circular sprite:

图像

I would like to have the circular GL_POINTS overlap in a way that makes them look like spheres being squished together and hiding parts of each other.

For an example of what I would like to achieve, here is an image showing Star Defenders 3D by Eric Gurt, in which he used spherical points as voxels in Javascript for his levels:

Example image showing points that look like spheres:

图像

As you can see, where the points overlap, they hide parts of each other creating the illusion that they are 3d spheres instead of circular sprites.

Is there a way to replicate this in openGL? I am using OpenGL 3.3.0.

I have finally implemented a way to make points look like spheres by changing gl_FragDepth.

This is the code from my fragment shader to make a square gl_point into a sphere. (no lighting)

void makeSphere()
{
    //clamps fragments to circle shape. 
    vec2 mapping = gl_PointCoord * 2.0F - 1.0F;
    float d = dot(mapping, mapping);

    if (d >= 1.0F)
    {//discard if the vectors length is more than 0.5
        discard;
    }
    float z = sqrt(1.0F - d);
    vec3 normal = vec3(mapping, z);
    normal = mat3(transpose(viewMatrix)) * normal;
    vec3 cameraPos = vec3(worldPos) + rad * normal;


    ////Set the depth based on the new cameraPos.
    vec4 clipPos = projectionMatrix * viewMatrix * vec4(cameraPos, 1.0);
    float ndcDepth = clipPos.z / clipPos.w;
    gl_FragDepth = ((gl_DepthRange.diff * ndcDepth) + gl_DepthRange.near + gl_DepthRange.far) / 2.0;

    //calc ambient occlusion for circle
    if (bool(fAoc))
        ambientOcclusion = sqrt(1.0F - d * 0.5F);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM