2012-04-27 62 views
1

我很長一段時間推遲了在我正在OpenTK中工作的一個項目中修復燈光。問題基本上是,當我旋轉相機,顯示在我所顯示的地形上的照明也旋轉。燈光正在被相機改變

這裏是我的onRenderFrame代碼片段:

protected override void OnRenderFrame(FrameEventArgs e) 
    { 
     base.OnRenderFrame(e); 

     GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); 

     float dist = (float)Math.Sin(Math.PI/3) * camZoom; 

     Matrix4 view = Matrix4.LookAt(new Vector3(-(float)Math.Cos(camRot) * dist, dist, -(float)Math.Sin(camRot) * dist) + camPos, camPos, new Vector3(0, 1, 0)); 
     //Note: camPos isn't actually the position of the camera, rather the target of it. The actual camera position is calculated above. 


     GL.MatrixMode(MatrixMode.Modelview); 

     GL.LoadMatrix(ref view); 

     float tx = 50; 
     float ty = 20; 
     float tz = -15; 

     GL.Light(LightName.Light0, LightParameter.Position, new float[] { tx, ty, tz}); 

     GL.Begin(BeginMode.Lines); 
     DrawBox(tx - 2, tx + 2, ty - 2, ty + 2, tz - 2, tz + 2); 
     GL.End(); 

...地形的繪畫是在這裏

我用我的快捷DrawBox函數來繪製周圍光線的位置,一個簡單的框。它工作正常,我甚至在地球周圍實施了一些運動,比如太陽。雖然相機還沒有移動,但這很好。但是一旦我轉動照相機,照明就不再顯示它應該具備的東西,它似乎已經「移動」了燈光,而沒有實際移動燈光(燈箱沒有移動,只有燈光效果)。

回答

1

按照OpenGL spec爲glLight與GL_POSITION參數:

GL_POSITION: PARAMS包含四個整數或浮點值指定的光的位置在均質物體座標。整數值和浮點值都直接映射。整數和浮點值都不會被鉗位。

當調用glLight(就像它是一個點)時,位置由模型視圖矩陣轉換,並存儲在眼睛座標中。 如果位置的w分量爲0,則光線將被視爲方向源。漫射和鏡面光照計算會考慮光線的方向,但不考慮其實際位置,並且禁用衰減。否則,漫反射和鏡面光照計算基於眼睛座標中光的實際位置,並啓用衰減。初始位置是(0,0,1,0);因此,初始光源是定向的,平行於並且在-z軸的方向上。

你只能通過三個浮標。我無法確定OpenTK作爲第四個(W)組件的用途,但我猜想它會使任何未指定的參數爲0,從而使您的光線變爲方向並忽略您提供的位置。我會嘗試添加一個1.0到你傳入的數組的末尾,看看是否能解決問題。