0

我正在尝试创建一个体素风格的游戏,并且我想使用 GL_POINTS 来模拟球形体素。

我的目标是让它们看起来像 3d 球体,而不必渲染具有许多顶点的实际球体。

然而,当我创建大量 GL_POINTS 时,它们以某种方式重叠,这使得它们显然是扁平的圆形精灵。

这是一个示例:我的 gl_points 重叠显示圆形精灵的图像示例:

图像

我想让圆形 GL_POINTS 以某种方式重叠,使它们看起来像被挤压在一起的球体并相互隐藏部分。

举个我想要实现的例子,这里是 Eric Gurt 的 Star Defenders 3D 图像,他在 Javascript 中使用球形点作为他的关卡中的体素:

显示看起来像球体的点的示例图像:

图像

如您所见,在点重叠的地方,它们隐藏了彼此的一部分,从而产生了它们是 3d 球体而不是圆形精灵的错觉。

有没有办法在openGL中复制它?我正在使用 OpenGL 3.3.0。

4

1 回答 1

0

我终于实现了一种通过更改 gl_FragDepth 使点看起来像球体的方法。

这是我的片段着色器中用于将方形 gl_point 变成球体的代码。(无灯光)

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);
}
于 2020-10-26T08:18:09.360 回答