簡體   English   中英

在GLSL中使相機正常

[英]Get the camera normal in GLSL

我有一個OpenGL場景,在這里我看到這樣的對象:

gluLookAt(10, 10, -10, -10, -10, 10, 0, 1, 0);

所以我知道如果我想在着色器中使用相機的z軸,它將看起來像是此對象的歸一化向量:

vec3(1.0, 1.0, -1,0);

有沒有一種方法可以在頂點着色器中計算此向量?

我曾考慮過要計算近/遠裁剪平面的法線,但找不到在頂點(或片段)着色器中執行此操作的方法。

我使用的是舊版本的流水線(OpenGL v2.0 / GLSL v.10),並且不想將矢量傳遞給着色器(盡管我知道這是通常的高效方法)。

(不建議使用的) gluLookAt的參數是(vec3)eye_,center_和up_的組成部分( x_表示矢量值基准x_

f: ℝ^3 x ℝ^3 x ℝ^3 -> ℝ4xℝ4 
eye_, center_, up_ -> ViewMatrix

因此,您可能會尋找的是

dir_ = normalize(center_ - eye_), 

如何最好地在着色器中使用它們以及在何處將它們最佳化取決於您使用的GL和GLSL版本。

這個向量

 vec3(1.0, 1.0, -1,0); 

btw的長度為sqrt(3),因此未規范化。

編輯

了解OpenGL和GLSL版本后,您可以從

舊版GLSL 1.10.59 doc

GLSL 1.10.59已經具有自定義的制服( 我從內存中肯定還記得2.0 / 1.10太久了 ); 因此,您只需將該向量作為制服傳遞就可以了。

因為它用於每個頂點,所以與一次在着色器中再次對每個頂點進行計算相比,一次計算它的效率更高(當然,考慮到渲染的頂點塊很大)。

將其作為制服傳遞給着色器。 參見文檔glUniform3f

在客戶端代碼中,執行以下操作:

auto cameraUp = camera.getUp();
glUniform3f(uniformLocationInShader, cameraUp.x, cameraUp.y, cameraUp.z)

在頂點着色器中,為攝像機向上矢量添加一個統一的,然后按預期使用它。

uniform vec3 cameraUp;

void main() 
{
   // do stuff with cameraUp
} 

固定函數頂點變換通過應用兩個矩陣來工作:

  1. “ ModelView”矩陣從對象空間轉換為眼睛空間
  2. 從眼睛空間到剪輯空間的“投影”矩陣

gluLookAt()作用是通過在world space中定義一些相機來指定視圖矩陣。 您似乎想要重建的是這個世界空間中的觀看方向。

但是,這對於固定功能GL是不可能的 您所擁有的只是產品 view * model 沒有更多信息,您無法將其分解為viewmodel零件。 固定功能GL中沒有這些信息-它永遠不會世界空間,也不會關心單獨的視圖矩陣。 這種區別確實發生在應用程序邏輯中(如果有的話)。

有趣的問題是:您甚至需要世界空間的觀看方向是什么? 固定函數GL在視線方向為(0,0,-1,0)的眼部空間中進行此類計算。

因此,我為您提供了兩種選擇:

  1. 使用統一的方法(或將數據傳輸到着色器的其他方法)來指定一些其他信息,例如已經提出的其他答案
  2. 直接在眼部空間進行計算

暫無
暫無

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

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