如何在OpenGL片段着色器中制作此球形渐变?

时间:2015-05-06 19:33:07

标签: c++ opengl shader

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

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

我该如何实现?

Sphere Gradient

2 个答案:

答案 0 :(得分:1)

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

解决方案B:在你的"菱形棱镜上涂上带渐变的纹理"

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

答案 1 :(得分:0)

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

  • 在玩家坐标系中,它看起来像这样:
  • overview
  • 所以让(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);
    
  • 不要忘记tis仅适用于玩家坐标系

现在如何摆脱三角测量工件?

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