簡體   English   中英

如何在OpenGL片段着色器中創建此球形漸變?

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

我是OpenGL新手。 我希望我的背景看起來像玩家在下面的球體內。 玩家向上看時為白色,玩家向下看時為黑色,並沿此方向漸變。

我嘗試將相機封裝在菱形棱鏡中,並將白色分配給頂部頂點,將灰色分配給中間頂點,將黑色分配給底部。 但是三角形的接縫非常明顯,我不完全理解為什么。 制作更多的頂點以更好地近似一個球體似乎有些矯kill過正。 我覺得我應該能夠在片段着色器中完成所有這些工作,但是對實現它的了解還不夠。 我可以將相機的y方向[-1,1]統一傳遞給着色器。

我該如何實施?

球體漸變

解決方案A:添加更多三角形。 這樣,它們將不那么引人注目。 現代GPU可以輕松渲染3或3000個三角形。

解決方案B:將漸變色紋理應用於“菱形棱鏡”

解決方案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); 
  • 不要忘記,tis僅在玩家坐標系中起作用

現在如何擺脫三角剖分偽像?

  • 在應用上述內容之前規范化片段坐標
  • 所以令vec3 p為玩家坐標系中渲染的片段位置
  • 您正在渲染球體的表面,因此與(0,0,0)的距離應為r
  • 所以將p標准化
  • p.xyz*=r/length(p);
  • 現在使用py

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM