我怎样才能在 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
我是 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