2011-07-29 91 views
4

我最近開始學習HLSL後,決定我想要比BasicEffect提供更好的照明。通過很多教程去後,我發現這一點,並決定從中吸取教訓: http://brooknovak.wordpress.com/2008/11/13/hlsl-per-pixel-point-light-using-phong-blinn-lighting-model/HLSL點光源着色引起瓷磚分開着色

看來,着色器上面並沒有在我的比賽很好地工作,但因爲我的遊戲採用了基於圖塊的方法,這意味着網格狀陣列中的多個模型。

會發生什麼情況是我的每個瓷磚都會與其他瓷磚分開着色。請參閱此圖像以供可視化參考: http://i.imgur.com/1Sfi2.png 我知道這是因爲每個圖塊都有自己的模型,並且着色器在模型的網格上執行時沒有考慮其他模型。

現在,對於這個問題。一個人怎麼把所有的瓷磚遮蓋在一起?我知道我可能必須從頭開始編寫着色器來完成這個任務,但如果任何人都可以給我一些關於如何達到我想要的效果的提示,我會非常感激。

這很晚,所以我有可能忘記了一些事情。如果您需要更多信息,請告訴我,我會添加它。

感謝,Merigrim

編輯:

這裏是我畫一個型號代碼:

public void DrawModel(Model model, Matrix modelTransform, Matrix[] absoluteBoneTransforms, Vector3 color, float alpha = 1.0f, Texture2D texture = null) 
{ 
    foreach (EffectPass pass in effect.CurrentTechnique.Passes) 
    { 
     foreach (ModelMesh mesh in model.Meshes) 
     { 
      foreach (ModelMeshPart part in mesh.MeshParts) 
      { 
       part.Effect = effect; 
       Matrix world = absoluteBoneTransforms[mesh.ParentBone.Index] * modelTransform; 
       effect.Parameters["World"].SetValue(absoluteBoneTransforms[mesh.ParentBone.Index] * modelTransform); 
       effect.Parameters["View"].SetValue(camera.view); 
       effect.Parameters["Projection"].SetValue(camera.projection); 
       effect.Parameters["CameraPos"].SetValue(camera.cameraPosition); 
       Vector3 lookAt = camera.cameraPosition + camera.cameraDirection; 
       effect.Parameters["LightPosition"].SetValue(new Vector3(lookAt.X, 1.0f, lookAt.Z - 5.0f)); 
       effect.Parameters["LightDiffuseColor"].SetValue(new Vector3(0.45f, 0.45f, 0.45f)); 
       effect.Parameters["LightSpecularColor"].SetValue(new Vector3(0.45f, 0.45f, 0.45f)); 
       effect.Parameters["LightDistanceSquared"].SetValue(40.0f); 
       effect.Parameters["DiffuseColor"].SetValue(color); 
       effect.Parameters["AmbientLightColor"].SetValue(Color.Black.ToVector3()); 
       effect.Parameters["EmissiveColor"].SetValue(Color.White.ToVector3()); 
       effect.Parameters["SpecularColor"].SetValue(Color.White.ToVector3()); 
       effect.Parameters["SpecularPower"].SetValue(10.0f); 
       if (texture != null) 
       { 
        effect.Parameters["DiffuseTexture"].SetValue(texture); 
       } 
       mesh.Draw(); 
      } 
     } 
     pass.Apply(); 
    } 
} 
+0

看起來你的問題不是由於瓷磚分離造成的,因爲照明計算應該考慮到這一點,並且由此產生的照明將在所有瓷磚之間平滑地混合。你可以發佈你的繪圖代碼嗎? – tweetypi

+1

好吧,我將代碼添加到了我的帖子中。 – Merigrim

+0

只是一個簡單的建議,嘗試在mesh.Draw()的頂部添加'pass.Apply()'。 – tweetypi

回答

1

看來,法線是小人這一次。在更正Blender中的法線之後,現在一切似乎都奏效了。

我想感謝meds和Andrew Russell。沒有你的幫助,我不會想出來的!

所以,現在我知道,當您的照明有問題時,請務必首先檢查法線。