【问题标题】:How can i make GL_POINTS overlap to look like spheres?我怎样才能使 GL_POINTS 重叠看起来像球体?
【发布时间】:2020-04-26 09:26:46
【问题描述】:

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

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

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

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

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

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

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

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

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

【问题讨论】:

  • 一个选项是设置深度(gl_FragDepth)取决于到Fragment Shader中球体中心的距离
  • @Rabbid76 感谢您的评论!我什至不知道 gl_fragdepth 是什么。我对此进行了一些研究,仍在试图弄清楚如何让它发挥作用......
  • 查看How can i make gradient sphere on glsl? 只需设置glPointSize() 以使用实际视图缩放/FOV 覆盖您的球体,并在着色器中计算球体表面片段...glPointSize 的另一种替代方法是几何着色器从点...不要忘记按照 Rabbid76 的建议更新片段深度
  • @Spektre 感谢您的回复,我仍在学习并尽力使其正常工作
  • @Spektre 这允许您在着色器程序中控制 gl_PointSize :glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); 此外,gl 点大小不只是控制 2d 精灵的宽度(以像素为单位)吗?我不认为这与深度有任何关系..

标签: c++ opengl points glpointsize


【解决方案1】:

我终于实现了一种通过更改 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    相关资源
    最近更新 更多