تو XNA 4 تغییرات زیادی داده شده که تعدادی از این تغییرات هم به نظر برای سازگاری نسخه های اینده XNA با DirectX10 یا 11 بوده.کلا برای port کردنشون باید یه کمی درد سر بکشی:20:البته اگه پروژه های بزرگی نباشن راحت می شه تبدیلشون کرد.نقل قول:
Printable View
تو XNA 4 تغییرات زیادی داده شده که تعدادی از این تغییرات هم به نظر برای سازگاری نسخه های اینده XNA با DirectX10 یا 11 بوده.کلا برای port کردنشون باید یه کمی درد سر بکشی:20:البته اگه پروژه های بزرگی نباشن راحت می شه تبدیلشون کرد.نقل قول:
اینکه دونه دونه Content ها و کد های پروژه های ورژن های قبل رو وارد یه پروژه جدید کنم نه؟...واقعا دردسر داره!
مشکل شما تو conversion هستش؟تو این مورد خودمم نمی دونم چرا بعضی از پروژه ها به درستی به نسخه بالاتر تبدیل نمی شن.به هر حال می تونین از همون روشی که خودتون گفتید استفاده کنید ولی تو XNA 4 تغییراتی تو کدها هم داده شده که خودتون باید کدها رو تغییر بدید.نقل قول:
برای تغییر کد ها هم یه سری از تغییرات تو این جا گفته شده:
بلاگ خود Shawn Hargreaves یه اطلاعاتی داره.کد:http://www.nelxon.com/blog/xna-3-1-to-xna-4-0-cheatsheet/
مگه به جز همین روشی که من گفتن راهه دیگه ای هم هست؟
تو VS 2010 که میخوای پروژه های 3.1 رو باز میکنی هیچکدوم باز نمیشن و Unavailable میدن.
فکر کنم اون بازی هایی که دارم با XNA 2 باشن چون الان یه پروژه که با XNA 3 بود تو VS 2010 باز شد.
حالا این بازی ها چی هستن؟سورساشون بدرد بخور هست.
راستی شما چقدر با XNA کار کردین؟
راستی مگه اسم این تاپیک معرفی و اموزش XNA نیست.یه چندتا نکته ای اموزشی چیزی بذارید:31:ما شیفته اموختن چیزای جدیدیم.
اینا رو از سایت xnaprojects.net گرفتم همشون هم ورژن 2 یی هستن.
من تازه اول کارم با xna هست شما که 7-8 ماهه xna کارکردی یه چند تا اموزش بزار.:31:
حالا که شروع به یادگیری XNA کردی برنامه خاصی هم داری؟یعنی با هدف خاصی شروع به یادگیری کردی یا نه گفتی همین طوری شروع کنیم بعد از یه مدتی هم دیدیم فایده نداشت ولش می کنیم.
در مورد اموزشم که ما کوچیک تر از اینیم که بخوایم اموزش بذاریم:27:ولی اگه می تونستم سعی می کردم حتا به صورت نکته ای هر چی بلد بودیم بگیم(وقت)
حالا که تا اینجا اومدیم یه نکته کوچیک بذاریم.با استفاده از 2 متد زیر می تونید 2 عدد 8 بیتی رو تو 1 عدد 16 بیتی ذخیره کنید.این فشرده سازی در Deferred rendering به کار میاد.اگه از target های RGBA64 استفاده کنید می تونید حجم زیادی از اطلاعات رو تو target های خودتون ذخیره کنید.برای مثال می تونید علاوه بر نرمال های bump شده نرمال های معمولی صحنه را ذخیره کنید.این نرمال های بدون bump در افکت هایی مثل SSAO یا edge detection کاربرد دارند.معمولا تو 4 تا render target 32 بیتی اطلاعات زیادی نمی شه ذخیره کرد ولی اگه از 3 تا target 64 بیتی استفاده کنید می تونید حجم زیادی از اطلاعات مختلف رو ذخیره کنید و از رندر دوباره ابجکت ها صرف نظر کنید.
چه نکته باقالیی:31:کد:float Pack2(float2 value)
{
int tempX,tempY;
tempX = (int)floor(value.x * 255);
tempY = (int)floor(value.y * 255);
int value1 = tempX;
value1 += tempY * 256;
float result = (float)value1;
return result / max2Bytes;
}
float2 UnPack2(float value)
{
float2 result = float2(0,0);
int tempValue = (int)floor(value * max2Bytes);
result.x = tempValue % 256;
tempValue /= 256;
result.y = tempValue;
return result / 255;
}
راستش بین C++ و XNA دارم هنوز تحقیق میکنم کدوم رو برای شروع برنامه نویسی سه بعدی انتخاب کنم.
از اونجا که C++ بهترین زبان به دلیل سطح پایین بودن برای ساخت بازی و همینطور Multi Platform هست انتخابم C++ هست ولی از اون ور به قول یکی از بزرگترین برنامه نویسان دنیا (اسمشو یادم نیست) C++ زبان جوجه برنامه نویسا نیست میترسم وسط راه کم بیارم.:41:
ولی C# رو در حد متوسط به بالا بلدم:20:.
در XNA 4 نمی توان از depth buffer کارت یک پشتیبان تهیه کرد.برای مثال اگر شما یک render target ست کنید و یک سری ابجکت رندر کنید وقتی render target را غیر فعال کنید depth buffer کارت از بین می ره.این مورد تو deferred lighting می تونه مشکل ساز باشه.وقتی شما در مرحله Gbuffer اشیای خودتون رو رندر می کنید پس از غیر فعال کردن target ها depth buffer کارت هم از بین خواهد رفت.در مرحله بعد که باید ابجکت های شفاف را رندر کنید خودتون باید depth test را درون shader پیاده سازی کنید.
راه حل دیگر برای این مشکل اینه که یه جوری depth buffer کارت رو برگردونیم.به این ترتیب دیگه نیازی به پیاده سازی depth test در shader نیز نمی باشد.برای این کار از semantic به نام Depth در خروجی Pixel Shader استفاده می کنیم.
توجه کنید که تکسچر depth باید حاوی nonLinear Depth یا screenSpace depth باشد.کد:
float2 screenSize;
texture Depth;
sampler Depth_Sampler = sampler_state
{
texture = <Depth>;
MinFilter = POINT;
MagFilter = POINT;
MipFilter = POINT;
AddressU = Clamp;
AddressV = Clamp;
};
texture SceneColor;
sampler SceneColor_Sampler = sampler_state
{
texture = <SceneColor>;
MinFilter = POINT;
MagFilter = POINT;
MipFilter = POINT;
AddressU = Clamp;
AddressV = Clamp;
};
struct PPVertexToPixel
{
float4 Position : POSITION;
float2 TexCoord : TEXCOORD0;
};
struct DepthRestore_PixelToFrame
{
float4 color : COLOR0;
float depth : DEPTH;
};
PPVertexToPixel VS(float4 inPos: POSITION0, float2 inTexCoord: TEXCOORD0)
{
PPVertexToPixel Output = (PPVertexToPixel)0;
Output.Position = inPos;
Output.TexCoord = inTexCoord;
// Offset the position by half a pixel to correctly align texels to pixels
Output.Position.x = Output.Position.x - (1.0f / screenSize.x);
Output.Position.y = Output.Position.y + (1.0f / screenSize.y);
return Output;
}
DepthRestore_PixelToFrame depthRestore_PS(PPVertexToPixel PSIn)
{
DepthRestore_PixelToFrame Output = (DepthRestore_PixelToFrame)0;
//PSIn.TexCoord -= (float2(0.5f,0.5f) / screenSize);
Output.color.rgb = tex2D(SceneColor_Sampler, PSIn.TexCoord).rgb;
float depthSample = tex2D(Depth_Sampler, PSIn.TexCoord).r;
Output.depth = depthSample;
return Output;
}
technique DepthRestore
{
pass Pass0
{
VertexShader = compile vs_2_0 VS();
PixelShader = compile ps_2_0 depthRestore_PS();
}
}
ولی در deferred lighting معمولا Linear Depth را ذخیره می کنند که ما باید با روشی این Linear Depth را تبدیل به nonLinear depth کنیم.چرا که کارت گرافیک از nonLinearDepth برای depth test استفاده می کند.
این شیدر Linear Depth را تبدیل به nonLinear Depth می کنه. پارامتر cornerFustrum هم باید در خارج از شیدر محاسبه و به شیدر فرستاده شود.برای محاسبه cornerFustrum می تونید از متد زیر استفاده کنید.کد:
texture Depth;
sampler Depth_Sampler = sampler_state
{
texture = <Depth>;
MinFilter = POINT;
MagFilter = POINT;
MipFilter = POINT;
AddressU = Clamp;
AddressV = Clamp;
};
float4x4 Projection;
float3 cornerFustrum;
float2 screenSize;
struct VSToSSDepth_VertexToPixel
{
float4 Position : POSITION;
float2 TexCoord : TEXCOORD0;
float3 ViewDirection : TEXCOORD1;
};
struct VSToSSDepth_PixelToFrame
{
float4 color : COLOR0;
};
VSToSSDepth_VertexToPixel VSToSSDepth_VS(float4 inPos: POSITION0, float2 inTexCoord: TEXCOORD0)
{
VSToSSDepth_VertexToPixel Output = (VSToSSDepth_VertexToPixel)0;
Output.Position = inPos;
Output.TexCoord = inTexCoord;
// Offset the position by half a pixel to correctly align texels to pixels
Output.Position.x = Output.Position.x - (1.0f / screenSize.x);
Output.Position.y = Output.Position.y + (1.0f / screenSize.y);
inPos.xy = sign(inPos.xy);
float3 corner = float3(-cornerFustrum.x * inPos.x,
cornerFustrum.y * inPos.y, cornerFustrum.z);
Output.ViewDirection = corner;
return Output;
}
VSToSSDepth_PixelToFrame VSToSSDepth_PS(VSToSSDepth_VertexToPixel PSIn)
{
VSToSSDepth_PixelToFrame Output = (VSToSSDepth_PixelToFrame)0;
//PSIn.TexCoord -= (float2(0.5f,0.5f) / screenSize);
normalize (PSIn.ViewDirection);
float depthSample = tex2D(Sampler , PSIn.TexCoord).r;
float3 VS = -depthSample * PSIn.ViewDirection;
float4 SS = mul(float4(VS,1), Projection);
float ssDepth = SS.z / SS.w;
Output.color = ssDepth;
return Output;
}
technique VSToSSDepth
{
pass Pass0
{
VertexShader = compile vs_2_0 VSToSSDepth_VS();
PixelShader = compile ps_2_0 VSToSSDepth_PS();
}
}
کد:private static Vector3 calculateCorner(float FarPlane, float AspectRatio)
{
float farY = (float)Math.Tan(Math.PI / 3.0 / 2.0) * FarPlane;
float farX = farY * AspectRatio;
return new Vector3(farX, farY, FarPlane);
}