[C# XNA][texture2D.Setdata] XNA에서 픽셀을 하나하나 다루어 보자.
xna의 API 가 익숙하지 않았던때, 픽셀을 다루기 위해 C#의 기본 GDI를 이용해여
마샬링 하여 텍스쳐에 붙였다.
그런데,. 반전이.. zune hd 에서 사용할수 있는 네임스페이스가 극히 제한적이라..
Bitmap은 가져 오지 못한다.
그래서 텍스쳐하나당 한픽셀을 그려야 된다고 생각하자 말도안되는 리소스 낭비이다.
텍스쳐2D 와 Draw메소드를 엄청나게 사용해야되서, 도저히 용납할수 없는 코딩이 될것이다.
고민끝에, ,.XNA짱인,. 곰동님에게 긴급 질문했다. 그리고 친절히 답해 주셨다.
( http://blog.naver.com/fly33499 )

위의 그림처럼 하나의 Texture2D에 여러개의 setData를 이용해 픽셀들을 다룰수 있다.
드디어 2D 비트맵을 다룰수 있게 되었다 마치 bitmapData의 setPixel 처럼 자유롭다.
기본적인 사용법은 이러하다.
주석 위주로 보면 됨
마샬링 하여 텍스쳐에 붙였다.
그런데,. 반전이.. zune hd 에서 사용할수 있는 네임스페이스가 극히 제한적이라..
Bitmap은 가져 오지 못한다.
그래서 텍스쳐하나당 한픽셀을 그려야 된다고 생각하자 말도안되는 리소스 낭비이다.
텍스쳐2D 와 Draw메소드를 엄청나게 사용해야되서, 도저히 용납할수 없는 코딩이 될것이다.
고민끝에, ,.XNA짱인,. 곰동님에게 긴급 질문했다. 그리고 친절히 답해 주셨다.
( http://blog.naver.com/fly33499 )

위의 그림처럼 하나의 Texture2D에 여러개의 setData를 이용해 픽셀들을 다룰수 있다.
드디어 2D 비트맵을 다룰수 있게 되었다 마치 bitmapData의 setPixel 처럼 자유롭다.
기본적인 사용법은 이러하다.
주석 위주로 보면 됨
Created with colorer-take5 library. Type 'csharp' using System; using System.Collections.Generic; using System.Linq; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.GamerServices; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Media; using Microsoft.Xna.Framework.Net; using Microsoft.Xna.Framework.Storage; namespace WindowsGame9 { public class Game1 : Microsoft.Xna.Framework.Game { GraphicsDeviceManager graphics; SpriteBatch spriteBatch; Texture2D tx; public Game1() { graphics = new GraphicsDeviceManager(this); Content.RootDirectory = "Content"; graphics.PreferredBackBufferWidth = 272; graphics.PreferredBackBufferHeight = 480; } protected override void Initialize() { base.Initialize(); } protected override void LoadContent() { spriteBatch = new SpriteBatch(GraphicsDevice); tx = new Texture2D(GraphicsDevice, graphics.PreferredBackBufferWidth, graphics.PreferredBackBufferHeight); //픽셀����그리기 (레벨 , 위��(x좌표,y좌표,1,1), 컬러값 ~ ) tx.SetData<Color>(0, new Rectangle(0, 0, 1, 1),new Color[]{Color.Black} ,0, 1, SetDataOptions.None); //응용! 면적 체우기 //화려한?컬러값을 위해 랜덤 함�� ��출 Random r = new Random(); Color c; //가로크기 for (int i = 0; i < graphics.PreferredBackBufferWidth; ++i) { //세로크기 for (int j = 0; j < graphics.PreferredBackBufferHeight; ++j) { //랜덤 컬러 c = new Color(new Vector3(r.Next(i), r.Next(j), r.Next(3))); //픽셀만들기 , 총 272 * 280 개 만큼 그린다. tx.SetData<Color>(0, new Rectangle(i, j, 1, 1), new Color[]{ c } , 0, 1, SetDataOptions.None); } } } protected override void UnloadContent(){ } protected override void Update(GameTime gameTime) { if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit(); base.Update(gameTime); } protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); //시작��고 그리고 끝내고 는 기본. spriteBatch.Begin(); spriteBatch.Draw(tx, new Vector2(0, 0), Color.White); spriteBatch.End(); base.Draw(gameTime); } } }
아직 깊게 봐야 할것이 많이 있지만, 우선 요것 가지고 쉽게 사용할수있도록
AS3 스타일로 클래스를 랩핑하면 매우 유용할듯하다.
원하는대로 Circle 이라던지 Line 이라던지 이제 루프만 잘 돌리면 된다.
다시한번 곰동님께 감사입니다~
※ zune hd의 해상도가 272 * 480 이라서 이러한 크기에서 테스트중..
'XNA' 카테고리의 다른 글
[XNA4.0] windows phone Test Deploy (53) | 2010.12.04 |
---|---|
[XNA3.1 index buffer vertex buffter] 교과서와는 다른 버퍼메모리 사용법 (158) | 2010.12.04 |
[XNA Rectangle on 3D] 사각형을 그려보자 (제발) (250) | 2010.12.04 |
[C# XNA][texture2D.Setdata] XNA에서 픽셀을 하나하나 다루어 보자. (364) | 2010.12.04 |
[XNA] 64bit 운영체제에서 FileNotFoundException 발생시 (144) | 2010.12.03 |
XNA 시작하기 (3) | 2010.12.03 |
XNA
2010.12.04 00:08