我怎样才能在 OpenGL 片段着色器中制作这个球形渐变?

How can I make this spherical gradient in an OpenGL fragment shader?

我是 OpenGL 新手。我希望我的背景看起来好像玩家在下图所示的球体内。玩家向上看时为白色,向下看时为黑色,沿途渐变。

我尝试将相机封闭在菱形棱镜中,并将白色分配给顶部顶点,灰色分配给中间,黑色分配给底部。但是三角形的接缝非常明显,我不完全明白为什么。使更多的顶点更好地近似球体似乎有些矫枉过正。我觉得我应该能够在片段着色器中完成这一切,但对实现它的了解还不够。我可以将相机的 y 方向 [-1,1] 作为统一传递给着色器。

我该如何实现?

解决方案 A:添加更多三角形。这样他们就不会那么引人注目了。现代 GPU 可以在您的情况下轻松渲染 3 个或 3000 个三角形。

解决方案 B:将带有渐变的纹理应用到 "diamond shaped prism"

解决方案 C:编写自定义片段着色器,根据垂直位置分配像素颜色

为什么不使用 y 坐标作为颜色强度而不是纹理...

  • 在玩家坐标系中它看起来像这样:
  • (0,0,0) 成为玩家的位置(球心)
  • r为球体的半径
  • 所以在片段着色器中像这样计算颜色:

    float i=0.5f+(0.5f*y/r);
    if (i>1.0f) i=1.0f; // white for out of sphere fragments
    if (i<0.0f) i=1.0f; // here you could have 0.0 if triangles are outer not inner
    vec3 col; col=vec3(i,i,i);
    
  • 不要忘记它只能在玩家坐标系中局部工作

现在如何消除三角测量伪像?

  • 在应用上述
  • 之前标准化片段坐标
  • 所以让vec3 p成为玩家坐标系中的渲染片段位置
  • 您正在渲染球体的表面,因此与 (0,0,0) 的距离应该是 r
  • 因此将 p 规范化为它
  • p.xyz*=r/length(p);
  • 现在使用 p.y