我最近開始學習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();
}
}
看起來你的問題不是由於瓷磚分離造成的,因爲照明計算應該考慮到這一點,並且由此產生的照明將在所有瓷磚之間平滑地混合。你可以發佈你的繪圖代碼嗎? – tweetypi
好吧,我將代碼添加到了我的帖子中。 – Merigrim
只是一個簡單的建議,嘗試在mesh.Draw()的頂部添加'pass.Apply()'。 – tweetypi