
ããã«ã¡ã¯ãHabrahabrïŒ æ®å¿µãªããšã«ãç§ã¯éåžžã«é·ãéãç§ã¯ã«æžããŸããã§ãã å人çãªåé¡ã¯ãgamedevã«åº§ã£ãŠããã€ãã®èšäºãæžãããšã«å®å
šã«å察ããŸããã ãã¶ãããã¯æé«ã ããããã®2幎éã§ç§ã¯å€ãã®çµéšãç©ãã§ããããããããã€ãåãã§å
±æããŠããã 2Dã²ãŒã ã®äœæãå®å
šã«æåŠããããšã¯æ³šç®ã«å€ããŸãã2Dã²ãŒã ã«å察ããããã§ã¯ãããŸãããã3Dã§ã²ãŒã ãéçºããæ¹ãã¯ããã«é¢çœããŠæ¥œããã§ãïŒ äŒçµ±çã«ã
XNA 4.0ã¯ããŒã«ã«ãªããŸããããªã
XNA 4.0ã¯é«äŸ¡ãªãªã¹ããŒã§ããïŒ ãããŠãããã¯ãã¹ãŠãã€ã³ãã£ãŒéçºè
ã«ãšã£ãŠäŸç¶ãšããŠé¢é£æ§ãé«ãããã§ãã åºçŸé »åºŠãéåžžã«äœãèšèªïŒCïŒïŒããããŸãã å¿
èŠãªåæã¯ã©ã¹/æ§é ããã³ã¢ã«ãŽãªãºã ãåããåã
XNAãã¬ãŒã ã¯ãŒã¯ããããŸãã ãŸãã
ã·ã§ãŒããŒã¢ãã«3.0ãŸã§ã®ã·ã§ãŒããŒããµããŒããã
DirectXããããŸãã
ïŒ
usernameïŒ
ãåããŠèªãã å Žåã2012幎ã®ç§ã®èšäºãåæã«èªãããšãã§ããŸãã ãããã100ïŒ
é¢é£ããŠãããšã¯éããããšã©ãŒããªããšã¯éããŸããããäžå®ã®æ ¹æ ãäžããããšãã§ããŸãã ãããããããã¯æããã§ã-ç§ã¯
3Dã«ã€ããŠã®ã¿æžãã€ããã§ãïŒãããã¯ã®ãªã¹ããæåŸãŸã§æ±ºããŠããŸããããç§ã¯ããªãæ©ããããã圢æãããšæããŸãã
ãããŸã§ã®ãšããã2ã€ã®èšäºãæ£ç¢ºã«æãã€ããŠããŸãã
- ãXNA 3DïŒ ã«ã¹ã¿ã ã·ã§ãŒããŒãšå°ããªãããã¿ã€ãã®ç޹ä»ã
- ãXNA 3DïŒ HDR vs LDR ã HDRå®è£
ã
次ã«ã
ã«ã¹ã¿ã ã·ã§ãŒããŒã玹ä»ãã
FEZã²ãŒã ã®ç°¡åãªãããã¿ã€ããå®è£
ããŸãã
ã¯ããã«
2Dã§äœæ¥ãããšãããããªãã¯ã¹ã
æ°ã«
ãã ããã¯ã¹ãã£ãšãã®äœçœ®ãããŒã«ã«ã®
SpriteBatchã«æž¡ã ã圌ããã€ã³ãããŠãããŸããã ãããã圌ãæããã®ã¯ãã¹ãŠ
3Dã§ãããšèšãããã§ãã座æšã®1ã€ã ãããŒãïŒ
XNAã§ã¯
Z座æšïŒã§ããããŸããç¹å¥ãªæåœ±ã䜿çšãããŸãïŒãããã«ã€ããŠã¯å°ãåŸã§ïŒã æåœ±-3D空éãã2Dã¹ã¯ãªãŒã³ç©ºéãžã®åº§æšã®å€æã ãŸãã
SpriteBatchã¡ãœããã®ãªãŒããŒããŒãã®1ã€ã¯ããããªãã¯ã¹ã®åœ¢åŒã®ãã©ã¡ãŒã¿ãŒããµããŒãããŠããŸããããã«ãããã«ã¡ã©ãäœæããŸããã ãããŠä»ãç§ãã¡ã¯
3Dãšã®é¡æšãäžããŸãã ãã¯ã¹ãã£ã®äœçœ®ïŒããã³ãã®å転ãšãµã€ãºïŒãšããŠ
SpriteBatchã«æž¡ãã座æš-ããã¯ã
ã¯ãŒã«ã倿 ïŒããã³ã¯ãŒã«ããããªãã¯ã¹ïŒãšåŒã°ããŸãã
SpriteBatch.Beginã®ãããªãã¯ã¹ãã©ã¡ãŒã¿ãŒã¯ã
ãã¥ãŒãããªãã¯ã¹ã§ãã ãããŠã
SpriteBatchã§ã¯å€æŽã§ããªãç¹å¥ãªæåœ±ãããªãã¯ã¹ã ãããŠä»ããŸãå¥ã®è§åºŠããïŒã¢ãã«ã¯ç¹ã§æ§æãããŸã-
é ç¹ãšåŒã°ãããããã®é ç¹ã®å
šäœã®äœçœ®ïŒå€æïŒã¯ããŒã«ã«åº§æšç³»ã§ãã æ¬¡ã«ãããã®ãããã§ããããã°ããŒãã«ã«ããå¿
èŠããããŸã-åãã¢ãã«ã䜿çšããç°ãªãå Žæã§ç°ãªãå転/ãµã€ãºã§æç»ã§ããŸãã ãã®åŸãã«ã¡ã©ã«åãããŠãã®å€æãã·ããããå¿
èŠããããŸãã ãããŠãæçµçãªå€æãèšç®ããåŸããããã3D空éããã¹ã¯ãªãŒã³2Dã«æåœ±ããŸãã
ã°ã©ãã£ãã¯ããã€ã¹ïŒã·ã§ãŒããŒãšã¢ãã«
éå»ã®èšäºã§
ã·ã§ãŒããŒã®ãããã¯ãšããããã䜿çšããŠç»åã®åŸåŠçãè¡ãæ¹æ³ã«ã€ããŠè§ŠããŸããã ãã¯ã»ã«ã·ã§ãŒããŒã®ã¿ã䜿çšããŸããã å®éããã¹ãŠãããè€éã§ãã ãã¯ã»ã«ã·ã§ãŒããŒã«å ããŠãé ç¹ã·ã§ãŒããŒããããŸãïŒ
SM3.0ãŸã§ã®ç¶æ³ãæ€èšã
ãŸã ïŒã ãããã®ã·ã§ãŒããŒã¯ããã¯ã»ã«ã§ã¯ãªãé ç¹ã§åäœããŸãã ã€ãŸã åé ç¹ã«å¯ŸããŠå®è¡ãããŸãã ããã«ã倿ã®éæ³ããããŸãã
XNAã§æ°ãã
.fxãã¡ã€ã«ãäœæããŠè§£æããŠã¿ãŸãããã
float4x4 World; float4x4 View; float4x4 Projection;
æåã®3è¡ã¯åãªããããªãã¯ã¹ã§ãã ãããã®å€ã¯ãã¹ãŠããããã
宿°ãããã¡ãŒ ïŒå°ãåŸã®ãããã¡ãŒã«ã€ããŠïŒããååŸãããŸãã æ¬¡ã¯ãå
¥åºåæ§é ã®å®è£
ã§ãã
struct VertexShaderInput { float4 Position : POSITION0; }; struct VertexShaderOutput { float4 Position : POSITION0; };
ããã¯ãé ç¹ã·ã§ãŒããŒå
¥åºåã®æãåçŽãªå®è£
ã§ã
ãPOSITION0ãã£ãã«ã®é ç¹äœçœ®ãååŸããåºåãšããŠãã°ã©ãã£ãã¯ãã€ãã©ã€ã³ã®æ¬¡ã®éšåïŒå€ææžã¿ã®ããŒã¿ïŒã®æ
å ±ã
ã©ã¹ã¿ã©ã€ã¶ãŒã«å ±åããŸãã
ããŠã
.fxãã¡ã€ã«ã®æåŸã®éšåã¯ã·ã§ãŒããŒèªäœã§ãã
VertexShaderOutput VertexShaderFunction(VertexShaderInput input) { VertexShaderOutput output; float4 worldPosition = mul(input.Position, World); float4 viewPosition = mul(worldPosition, View); output.Position = mul(viewPosition, Projection); return output; } float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0 { return float4(1, 0, 0, 1); }
é ç¹ã·ã§ãŒããŒã¯ããã¢ãã«ã空éå
ã®é ç¹ã®äœçœ®ãååŸããã¯ãŒã«ãããã¥ãŒããããŠæçµçã«ç»é¢ã«ã€ãªãããŸãã ããŠããã¯ã»ã«ã·ã§ãŒããŒã¯ãã¹ãŠãèµ€ã§å¡ãã€ã¶ããŸãã
ãããªãã¯ã¹ã«ã€ããŠå°ã
ãããã®ãããªãã¯ã¹ã®è©³çްã«ã¯è§ŠããŸããïŒåæ§ã®æ
å ±ããããããããŸãïŒããã¯éåžžã«äžè¬çã ããã§ãïŒïŒç§ã¯ããã
XNAã§ã©ããªããã ããèšããŸãã
ã¯ãŒã«ããããªãã¯ã¹ã¯ã
Scale Rotation Translationãã¥ãŒã«ãã£ãŠå®çŸ©ãããŸãã
Matrix world = Matrix.CreateScale(x, y, z) * Matrix.CreateFromYawPitchRoll(y, p, r) * Matrix.CreateTranslation(x, y, z);
è¡åã®ä¹ç®ã¯é坿ã§ãããããããã§ã¯é åºãéèŠã§ãã
ãã¥ãŒãããªãã¯ã¹ïŒã«ã¡ã©ãããªãã¯ã¹ïŒïŒ
Matrix view = Matrix.CreateLookAt(vpos, targetpos, up);
äžè¬çã«ã
SRTãããªãã¯ã¹ã䜿çšã§ããŸããã
XNAã«ã¯ãããç°¡åã«ãã䟿å©ãªæ¹æ³ããããŸãã
Vposã¯ã«ã¡ã©ã®äœçœ®ã
targetposã¯ã«ã¡ã©ãèŠãŠãããã€ã³ãã
upã¯
äžåãã®ãã¯ãã«ïŒéåžžã¯
Vector3.Up ïŒã§ãã
ããŠãæåŸã®æãéèŠãªããšã¯ãå°åœ±è¡åã§ãã æãæšæºçãªå Žåã«ã¯ã
æ£å°æåœ±ãš
é è¿ æ³ã® 2ã€ããã
ãŸã ã å°æ¥çã«ã¯ãæ£å°æåœ±æ³ã¯2Dã«äœ¿çšããïŒã¢ã€ãœã¡ã«ãããçšåºŠäœ¿çšãããŸãïŒãä»ã®ã±ãŒã¹ïŒ3Dã·ã¥ãŒãã£ã³ã°ã²ãŒã ãªã©ïŒã§ææã§ãã
ç§ãã¡ã®ç®ã¯ããã¹ãŠã®ãªããžã§ã¯ããéèŠæåœ±ã§ç¥èŠããããã«èšèšãããŠããŸãã ãªããžã§ã¯ããé ããªãã»ã©ãç§ãã¡ã«ã¯èŠããªãããã«ãªããŸãã ãªããžã§ã¯ãã®ãµã€ãºã¯ãªããžã§ã¯ããŸã§ã®è·é¢ã«äŸåããªããããäžèŠãããšçŽäº€æåœ±ã¯å¥åŠã«èŠããŸãã ç¡éã«é·ãè·é¢ããã·ãŒã³ãèŠããããªãã®ã§ãã ãããã2Dã²ãŒã ã«äœ¿çšãããçç±ã§ãã ç¹å®ã®ããªãŽã³ãŸã§ã®è·é¢ãèæ
®ããå¿
èŠã¯ãããŸããã
ã¢ãã«ãã¥ãŒ
ããŒããã£ã¹ã¯ããã¢ãã«ãããŒãããå Žå-æ¬¡ã®æ
å ±ãããŒãããŸãïŒæãåçŽãªå ŽåïŒã
POSITION-é ç¹ã®äœçœ®ã
NORMALã¯é ç¹ã®æ³ç·ã§ãã
TEXCOORD-ãã¯ã¹ãã£åº§æšïŒUVã¹ãã£ã³ïŒã
ãã®æ
å ±ã¯ãé ç¹
ãã£ãã«ãšåŒã°ã
ãŸã ïŒRGB空éã®èµ€ãã£ãã«ãšåæ§ïŒã
ãŸãã
indexãšåŒã°ããç¹å¥ãªæ
å ±ãããŒãã
ãŸã ã ããã§ã¯ã詊ããŠã¿ãŸãããã
4ã€ã®ç¹ã§æ§æãããæ£æ¹åœ¢ãæç»ããå¿
èŠããããŸãã ã°ã©ãã£ãã¯ããã€ã¹ã¯
ãäžè§åœ¢ã§
ã®ã¿åäœ
ããŸãã ã©ã®å³åœ¢ãäžè§åœ¢ã«åå²ã§ããŸãã ãããŠä»ãã°ã©ãã£ãã¯ããã€ã¹ã«ãã®æ£æ¹åœ¢ãèšè¿°ããå Žåã
6ã€ã®é ç¹ãå¿
èŠã«ãªããŸãïŒåäžè§åœ¢ã«
3〠ïŒã ãããããã®å Žåãããã€ãã®é ç¹ïŒãŸãã¯ããããããã®äœçœ®ïŒãçãããªãããšã眮ãæããããšæããŸãã ãã®ããã«ãç¹å¥ãª
ã€ã³ããã¯ã¹ãããã¡ãçºæãããŸããã æ£æ¹åœ¢ã衚ã4ã€ã®ãµããŒãé ç¹
v1ãv2ãv3ãv4ããããšããŸãã ãããŠä»ãããªãã¯
ã€ã³ããã¯ã¹ãããã¡ãæ§ç¯ããããšãã§ããŸãïŒ
[0ã1ã2ã1ã2ã3] -ãããã®ã€ã³ããã¯ã¹ã䜿çšããã°ã©ãã£ãã¯ããã€ã¹ã¯ãé ç¹ãããã¡
[v1ãv2ãv3ãv2ãv3ãv4]ããé ç¹ãèŠã€ããŠäœ¿çšããŸãã ãã®ã¢ãããŒãã¯éåžžã«äŸ¿å©ã§ã
é ç¹ãããã¡ã®ããªã¥ãŒã ã倧å¹
ã«åæžããæç»æ©èœãæ¡åŒµããŸãã ããšãã°ã倧ããªé ç¹ãããã¡ãŒãæå®ããŠïŒéåžžã«é
ãæäœïŒãã¢ãã«ã®ç¹å®ã®éšåãæç»ããŸã-ã€ã³ããã¯ã¹ãããã¡ãŒã®ã¿ã倿ŽããŸãïŒé ç¹ãããã¡ãŒã®ã€ã³ã¹ããŒã«ã«æ¯ã¹ãŠéãæäœïŒã
XNAã«ã¯ã VertexBufferããã³
IndexBufferãšããã¯ã©ã¹ãååšããŸãã ã³ãŒãã§çŽæ¥äœæããããšã¯èæ
®ããŸãããããã®ããã«åçŽãªã¢ãã«ã®ããŒãã䜿çšããŸãã
åçŽãªã¢ãã«ãäœæããFBX圢åŒã§ä¿åããŸãã
ãã®åŸ-äœæ
æžã¿ã®VertexBufferãš
IndexBufferãæœåºã§ã
ãŸã ïŒ
_vertexBuffer = boxModel.Meshes[0].MeshParts[0].VertexBuffer; _indexBuffer = boxModel.Meshes[0].MeshParts[0].IndexBuffer;
泚æïŒ ãã®ãããªå Žåã¯ã倿ãããŠããªãã¡ãã·ã¥ã1ã€æã€æãåçŽãªã¢ãã«ã«ã®ã¿é©ããŠããŸãã è€éãªã¢ãã«ã«ã¯ãè€æ°ã®é ç¹/ã€ã³ããã¯ã¹ãããã¡ãŒããããŸãã ãŸããã¢ãã«ã®äžéšã¯ãã¢ãã«ç©ºéã§ç¬èªã®å€æãæã€ããšãã§ããŸããå®è£
ããã§æºåãæŽããŸããã®ã§ããããã¿ã€ããäœæããŸãããã ãã®ãããªçŽ æŽãããã€ã³ãã£ãŒãºã²ãŒã
-FEZããããŸãã ç§ã®å人ã®å€ãã¯ããã®ãããªã²ãŒã ãã¬ã€ãå®è£
ã®é¢ã§ã©ã®ããã«å¯èœã§ããããå°ããŸãããïŒ å®éãåçŽãªãã®ã§ã¯ãªããäžçãå転ãããæ©èœãåããçŽäº€ïŒæ£æåœ±ïŒæåœ±ïŒããã³å€å
žçãª2Dã²ãŒã ãšã¯ç°ãªããäžçã«é¢ããæ
å ±ã¯3Dã«å«ãŸããŠããŸãïŒã䜿çšããã ãã§ãã
ãŠã£ãããã£ã¢ã®ã²ãŒã ãã¬ã€ã®èª¬æïŒ
Fezã¯ãGomezããªããžã§ã¯ããæ©ãããããžã£ã³ãããããç»ã£ãããæäœãããã§ãã2Dãã©ãããã©ãŒããŒãšããŠæäŸãããŸãã ããã§ãããã¬ã€ã€ãŒã¯ãã€ã§ãèŠç¹ãã·ããããç»é¢ã«å¯ŸããŠäžçã90床å転ãããããšãã§ããŸãã ããã«ããããã¢ãéè·¯ãæ€åºã§ãããã©ãããã©ãŒã ãåæ§ç¯ã§ããŸãã ããªã¥ãŒã ã¯2Dã²ãŒã ã®ç¹åŸŽã§ã¯ãªãããããã¬ãŒã€ãŒã¯ãã®ã¡ã«ããºã ã䜿çšããŠãå®éã®3Dã®äžçã§ã¯éåžžäžå¯èœãªã¢ã¯ã·ã§ã³ãå®è¡ã§ããŸãïŒãŸããããããªããã°ãªããŸããïŒã ããšãã°ãç§»åãããã©ãããã©ãŒã ã®äžã«ç«ã£ãŠé è¿æ³ã90床ã·ãããããšãGomezã¯ä»¥åã¯ç»é¢ã®å察åŽã«ãã£ãå¥ã®ãã©ãããã©ãŒã ã«åãæ¿ããããšãã§ããŸãã ç§»ååŸã«å
ã®èŠç¹ã«æ»ããšãGomezã倧ããç§»åããããšãããããŸãã
ãããŠãã²ãŒã ãã¬ã€èªäœã®ãããªïŒ
ããå§ããŸãããïŒ
ããŒã¹ãžãªã¡ããªã®èªã¿èŸŒã¿ïŒ
Model boxModel = Content.Load<Model>("simple_cube"); _vertexBuffer = boxModel.Meshes[0].MeshParts[0].VertexBuffer; _indexBuffer = boxModel.Meshes[0].MeshParts[0].IndexBuffer;
2ã€ã®åçŽãª16x16ãã¯ã¹ãã£ãããŒãããŸãã
_simpleTexture1 = Content.Load<Texture2D>("simple_texture1"); _simpleTexture2 = Content.Load<Texture2D>("simple_texture2");
ãããŠã以åã«äœæããã·ã§ãŒããŒïŒãšãã§ã¯ãïŒïŒ.fxïŒãããŒãããŸãã
_effect = Content.Load<Effect>("simple_effect");
ããã¯ãã¹ãŠãã¡ãœãã
LoadContentã§è¡ããŸã ã
ãããŠãã¢ãã«ãæç»ããŠã¿ãŸãããïŒ
Drawã¡ãœããïŒïŒ
ã·ã³ãã«ãªã¬ã³ããªã³ã° // GraphicsDevice.SetVertexBuffer(_vertexBuffer); GraphicsDevice.Indices = _indexBuffer; // Matrix view = Matrix.CreateLookAt(Vector3.One * 2f, Vector3.Zero, Vector3.Up); Matrix projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45f), GraphicsDevice.Viewport.AspectRatio, 0.01f, 100f); float dt = (float)gameTime.TotalGameTime.TotalSeconds; Matrix world = Matrix.CreateFromYawPitchRoll(dt, dt, dt); // _effect.Parameters["View"].SetValue(view); _effect.Parameters["Projection"].SetValue(projection); _effect.Parameters["World"].SetValue(world); // _effect.CurrentTechnique.Passes[0].Apply(); // GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, _vertexBuffer.VertexCount, 0, _indexBuffer.IndexCount / 3);
泚æïŒ ãã®ãããªå Žåã¯ã1ã€ã®ãã¹ãæã€æãåçŽãªã·ã§ãŒããŒã«ã®ã¿é©ããŠããŸãã è€éãªã·ã§ãŒããŒã¯è€æ°ã®ãã¹ãæã€ããšãã§ããŸããããã§ã¯ãèŠéè§45床ã®éèŠæåœ±ã䜿çšããŸããã ãã¹ãŠãæ©èœããŸãã æ¬¡ã«ãã¢ãã«ã®ãã¯ã¹ãã£ãèšå®ããå¿
èŠããããŸãã ã¢ãã«ã
Cinema 4Dãã
FBX圢åŒã«ä¿åãããšããæ¬¡ã®ãã£ã³ãã«ããããŸããïŒ
POSITION ã
NORMAL ã
TEXCOORD ïŒUVïŒã ã·ã§ãŒããŒã«æ»ãããã£ã³ãã«ã®1ã€ãå
¥å/åºåããŒã¿ã«è¿œå ããŸãããã
struct VertexShaderInput { float4 Position : POSITION0; float2 UV : TEXCOORD0; }; struct VertexShaderOutput { float4 Position : POSITION0; float2 UV : TEXCOORD0; };
ãããããã¯ã¹ãã£åº§æšã«ãªããŸãã ãã¯ã¹ãã£åº§æšã¯ãé ç¹ã2次å
ãã¯ã¹ãã£äžã®äœçœ®ã«æ¥ç¶ããŸãã
ãããŠãé ç¹ã·ã§ãŒããŒã§ã¯å€æŽããã«æž¡ããŸãã
output.UV = input.UV;
ã©ã¹ã¿ã©ã€ãºæé ã®åŸãè£éããã
TEXCOORD0å€ïŒäžè§åœ¢ã«æ²¿ã£ãŠïŒãååŸãããã¯ã»ã«ã·ã§ãŒããŒã§ãã¯ã¹ãã£ã«ã©ãŒå€ãååŸã§ããŸãã
float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0 { return tex2D(TextureSampler, input.UV); }
ããããUVã«ãã£ãŠãã¯ã¹ãã£ã®è²ã®å€ãååŸããã«ã¯ããã®ãã¯ã¹ãã£ãèšå®ããå¿
èŠããããŸãã ãã®ããã«ããã¯ã¹ãã£èªäœã«å ããŠãã©ã¹ã¿ã©ã€ãºãããäžè§åœ¢ã®ç»é¢äžã®ãã¯ã¹ãã£ã倧ãããããå°ãããããããå Žåã®å¯ŸåŠæ¹æ³ã«é¢ããæ
å ±ãå«ã
ãµã³ãã©ãŒããããŸãã
ãªããªã ã·ã§ãŒããŒã§ãã©ã¡ãŒã¿ãŒãæç€ºçã«èšå®ããäŒçµ±ãå®ããã·ã§ãŒããŒã§ãµã³ãã©ãŒãäœæããŸãã
texture Texture; sampler2D TextureSampler = sampler_state { Texture = <Texture>; };
ããŠããã©ã¡ãŒã¿ãšããŠãã¯ã¹ãã£ãèšå®ããŸãããïŒ
_effect.Parameters["Texture"].SetValue(_simpleTexture1);
èŠãïŒ
ããããä»¥æ¥ ç»é¢äžã®ãã¯ã¹ãã£ã¯
16x16以äžã§ããããšã倿ããŸãã-ãµã³ãã©ãŒã®èšå®ã«åŸã£ãŠè£éãããŸããã å¿
èŠãªãã®ã§ããµã³ãã©ãŒã®ãã£ã«ã¿ãªã³ã°ã倿ŽããŸãã
texture Texture; sampler2D TextureSampler = sampler_state { Texture = <Texture>; MipFilter = POINT; MinFilter = POINT; MagFilter = POINT; };
ãšããã§ãç§ã¯
以åã®èšäºã§ãã£ã«ã¿ãªã³ã°ã«ã€ããŠè©±ããŸã
ã ã
ããã§ãã¹ãŠã®èšå®ãå®äºããŸããã2Dãš3Dãçµã¿åããããšãã§ãã
Blockã¯ã©ã¹ã玹ä»ããŸãããïŒ
public class Block { public enum BlockType { First, Second } public Matrix Transform; public BlockType Type; }
Transformã¯ãªããžã§ã¯ãã®ã¯ãŒã«ããããªãã¯ã¹ã§ãã
ãããŠããããã®ãããã¯ã®ç°¡åãªçæïŒ
ãããã¯çæ private void _createPyramid(Vector3 basePosition, int basesize, int baseheight, Block.BlockType type) { for (int h = 0; h < baseheight; h++) { int size = basesize - h * 2; for (int i = 0; i < size; i++) for (int j = 0; j < size; j++) { Block block = new Block(); Vector3 position = new Vector3( -(float)size / 2f + (float)i, (float)h, -(float)size / 2f + (float)j) + basePosition; block.Transform = Matrix.CreateTranslation(position); block.Type = type; _blocks.Add(block); } } }
ããŠãç°ãªã倿ã§å€ãã®ã¢ãã«ãæãèœåïŒ
ã¬ã³ããªã³ã° GraphicsDevice.SetVertexBuffer(_vertexBuffer); GraphicsDevice.Indices = _indexBuffer; Matrix view = Matrix.CreateLookAt(Vector3.One * 10f, Vector3.Zero, Vector3.Up); Matrix projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45f), GraphicsDevice.Viewport.AspectRatio, 0.01f, 100f); _effect.Parameters["View"].SetValue(view); _effect.Parameters["Projection"].SetValue(projection); foreach (Block block in _blocks) { Matrix world = block.Transform; _effect.Parameters["Texture"].SetValue(_simpleTexture1); _effect.Parameters["World"].SetValue(world); _effect.CurrentTechnique.Passes[0].Apply(); GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, _vertexBuffer.VertexCount, 0, _indexBuffer.IndexCount / 3); }
ãããŠæåŸã®æ®µé-ç§ãã¡ã¯äžçãåµé ããŸãïŒ
_createPyramid(new Vector3(-7f, 0f, 5.5f), 10, 5, Block.BlockType.First); _createPyramid(new Vector3(7f, 0f, 0f), 5, 3, Block.BlockType.Second); _createPyramid(new Vector3(7f, -7f, 7f), 7, 10, Block.BlockType.First);
æ®ãããæãéèŠãªããšã¯ãåžæããæåœ±ã®äœæãšäžçãå転ãããèœåã§ãã
次ã®ããã«æåœ±ãèšå®ããŸãã
Matrix projection = Matrix.CreateOrthographic(20f * GraphicsDevice.Viewport.AspectRatio, 20f, -100f, 100f);
20fã¯äžçš®ã®ããºãŒã ãã§ãã
-100fããã³
100fã®è¿ç«¯ããã³é 端ã
çš®ïŒ
Matrix view = Matrix.CreateRotationY(MathHelper.PiOver2 * _rotation);
_rotationã¯å転ã§ãã ããœãããå転ã®å Žåã
MathHelper.SmoothStep颿°ã䜿çšã§ããŸããããã¯
3次 lerpã«ãããŸããã
å転ãããããã«ã4ã€ã®å€æ°ãå°å
¥ããŸãã
float _rotation; float _rotationTo; float _rotationFrom; float _rotationDelta;
ãããŠãã¢ããããŒããæŽæ°ã
ãŸã ã
å転å¶åŸ¡ if (keyboardState.IsKeyDown(Keys.Left) && _prevKeyboardState.IsKeyUp(Keys.Left) && _rotationDelta >= 1f) { _rotationFrom = _rotation; _rotationTo = _rotation - 1f; _rotationDelta = 0f; } if (keyboardState.IsKeyDown(Keys.Right) && _prevKeyboardState.IsKeyUp(Keys.Right) && _rotationDelta >= 1f) { _rotationFrom = _rotation; _rotationTo = _rotation + 1f; _rotationDelta = 0f; } if (_rotationDelta <= 1f) { _rotationDelta += (float)gameTime.ElapsedGameTime.TotalSeconds * 2f; _rotation = MathHelper.SmoothStep(_rotationFrom, _rotationTo, _rotationDelta); }
ããã§
gameTime.ElapsedGameTimeã䜿çšãããŠããããšã«æ³šç®ããŠãã ãããã²ãŒã å
ã®å€æ°ã®å€åãåŸã
ã«çºçããå Žåããã®å€ãèæ
®ããå¿
èŠããããŸãã FPS
ã¯ãã¹ãŠã®äººã§ç°ãªãå ŽåããããŸã ã
ãããŠæåŸã«ãäžçã®å®è£
ã«é¢ããããã€ãã®èšèã ã¬ãã«ã®èªã¿èŸŒã¿æããã³å転äžã«ãåå転ããšã«ã¯ãŒã«ãïŒç©çïŒãçæããŠããã¬ãŒã€ãŒãçŸåšã®äœçœ®ããç®çã®ã¬ãã«ã«ç§»åã§ãããã©ãããããã³ã©ã®äœçœ®ã«ç§»åã§ãããã確èªã§ããŸãã
ãããã¿ã€ãã³ã¡ã³ã
ãã¡ããããã®ãããã¿ã€ãã«ã¯å€ãã®åé¡ããããŸããããšãã°ã決ããŠèŠãªãé¡ã§ãïŒãžãªã¡ããªã®åçãªæ§ç¯ã«ã€ããŠæžããå Žåãèšäºã¯äœåºŠãæé·ããŸãïŒã ããã«ããã®ãã¹ãŠ
-BasicEffectã䜿çšããŠã
ã«ã¹ã¿ã ã·ã§ãŒããŒãªãã§å®è£
ã§ããŸãã ããããä»åŸã®èšäºã§ã¯ãã¢ãã«ã«ãã€ã³ã
ããã« ã·ã§ãŒããŒã
ã«ã¹ã¿ãã€ãºããæ¹æ³ãçè§£ããããšãéèŠã§ãã
ãœãŒã¹ã³ãŒã+ãã€ããªïŒ
ãããããã«
ãã®èšäºã§ã¯ãããã€ãã®ç޹ä»ãè¡ããæåœ±ã§ã¯ãªãé è¿æã䜿çšããæåãªã²ãŒã ã®ãããã¿ã€ãã瀺ããŸããã ãã®ç޹ä»ã®åŸãã²ãŒã éçºã®æ©èœã®äžéšã3次å
ã§èª¬æããäºå®ã§ããã·ã§ãŒããŒã詳现ã«ïŒãã¯ã»ã«ãšé ç¹ã®äž¡æ¹ã§ïŒç޹ä»ããããšæããŸãã ãŸãã
HDR ã
é
å»¶ã¬ã³ããªã³ã° ïŒ2Dã§ãããè¡ãããã«äœ¿çšããŠããŸãããããã®ã¡ãœããã¯é
å»¶ã¡ãœãããããä¿®æ£ãããé æ¹åã¬ã³ããªã³ã°ïŒã
VTFãªã©ã®ã¡ãœãããå°å
¥ããŸãã ç§ã¯habrahabrã®ã¿ãå
¬éããŠããã®ã§ãææ¡ã«ã€ããŠã³ã¡ã³ãããã®ã¯ãã€ã§ãå¬ããã§ãïŒã²ãŒã ã§ãã¹ãŠãã©ã®ããã«æ©èœãããããããªãå ŽåïŒAAAã¯ã©ã¹ã®ã²ãŒã ã¯ç¹ã«æè¿ã§ãïŒããŸãã¯ãã®å¹æã®å®è£
ã«èå³ãããå Žåã¯ã
ã³ã¡ã³ããæžããŠãã ãã ã ã§ããéã話ãããããšæããŸãã
PSç§ã«ãšã£ãŠã®äžçªã®åæ©ã¯ããªãã®èå³ã§ãã
PSSç§ãã¡ã¯ãã¹ãŠäººéã§ãããééããç¯ããŸãããããã£ãŠãããã¹ãã«ééããèŠã€ããããç§ã«å人çãªã¡ãã»ãŒãžãæžããŠãã ããããããŠãæãã®ã³ã¡ã³ããæ¥ãã§æžããŠã¯ãããŸããïŒ