[간단메모] Texture2D , Alpha Color

private Texture2D tx;
        private Rectangle txRect;
        private Color txColor;
        protected override void LoadContent()
        {

            spriteBatch = new SpriteBatch(GraphicsDevice);
            using (System.IO.FileStream fs = new System.IO.FileStream
(
@"d:\logo2.jpg" ,System.IO.FileMode.Open)) { tx = Texture2D.FromStream(GraphicsDevice, fs); }; txRect = new Rectangle(0, 0, tx.Width, tx.Height); txColor = new Color(255, 255, 255, 0); } protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.CornflowerBlue); txColor.A +=1; spriteBatch.Begin(); spriteBatch.Draw(tx, txRect, txColor); spriteBatch.End(); base.Draw(gameTime); }

txColor 를 보면 마지막 인자인 A(alpha) 값을 설정할수 있다.
이를 업데이트 시켜주면 알파블렌딩을 할수 있다.
Yamecoder 야매코더_
tags : Alpha, texture2D, XNA
XNA 2011.04.27 10:43

[XNA , Texture2D] Texture2D from Bitmap (fast copy)


종전의 방식 (http://scripter.egloos.com/2548511) 으로는 너무 느려 실시간으로 이미지를 갱신하는데에
무리가 있었다.

그래서 아에 Stream 으로 복사하는 방법을 찾았고 Aforge 의 영상을 붙이는데 성공했다.







이전의 http://www.codeproject.com/KB/game/VidTextureClassWebcamApp.aspx?msg=2630927
보다 화질은 좋아졌다.(쨍 .. 하다..)
간혹 보이는 계단현상이 없어졌다.

속도는 .. 처음엔 조금 딜레이가 생기다가 곧 VideoTexture 만큼 복귀 되었으나 약간 속도가
불안정하긴 했다.

하지만 VideoTexture 에서 런타임중 간헐적으로 나오는 오퍼레이터 에러는 없어 덜컥? 거리는 현상이
없다.

그리고 VideoTexture 보다는 시피유 점유율이 조금 높게 나왔다.

Created with colorer-take5 library. Type 'csharp'

private Texture2D tx;
        //Aforge �� 플레이어
        VideoSourcePlayer player = new VideoSourcePlayer();

        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
            tx = new Texture2D(graphics.GraphicsDevice, 1024, 768);//dummy;


            //Aforge �� 디바이스 설정 
            FilterInfoCollection device = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            VideoCaptureDevice cam = new VideoCaptureDevice(device[0].MonikerString);
            
            player.VideoSource = cam;
            player.Start();

            //플레이어가 갱신될때 마다 ��출
            player.NewFrame += new VideoSourcePlayer.NewFrameHandler(player_NewFrame);
        }


        //인��로 비트맵을 받음
        void player_NewFrame(object sender, ref Bitmap _image)
        {
            //비트맵�� 고속 복사
            MemoryStream camStream = new MemoryStream();
            player.GetCurrentVideoFrame().Save(camStream, ImageFormat.Bmp);
            camStream.Position = 0;
            tx = Texture2D.FromFile(graphics.GraphicsDevice, camStream);
            
        }
 
 
 
포인트 : 비트맵의 고속복사. 


나중에 곧.. ? Aforge의 VideoSourcePlayer의 stream 을 직접 참조 할수 있는 방법을 모색하여 좀더
높은 퍼포먼스를...
Yamecoder 야매코더_
tags : bitmap, copy, texture2D, XNA
분류없음 2010.12.04 03:48

[Texture2D] Texture2D에 일정역역만 복사하기



원본 텍스쳐에서 일부분만 그리는 방법에서 기초적인 방법은 Draw 에서

그릴 영역을 지정하는것인데 리소스 낭비가 발생할수 있어서

아에 처음부터 영역을 정하고 들어가도록 하는 방법이다.

Created with colorer-take5 library. Type 'csharp'

//http://scripter.egloos.com
        //원본 이미지 텍스쳐
        Texture2D targetTx;

        //복제할 이미지 텍스쳐
        Texture2D copyTx;
        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);

            //원본 이미지를 가져��다
            targetTx = Texture2D.FromFile(GraphicsDevice,@"c:\a.jpg");

            //복제할 이미지를 만든다.
            copyTx = CloneImage(targetTx, 0, 0, 200, 200);
        }


        //복제 메소드 :: 매개변��로는 원본이미지,좌표,크기 이다. 
        public Texture2D CloneImage(Texture2D image, int x, int y, int w, int h)
        {
            //면적을 만든다.
            Rectangle srcRect = new Rectangle(x, y, w, h);

            //면적만큼�� 바이트 배열을 생성한다
            // *4 인이유는 ���� 정���� 메모리 크기가 4바이트이기때문은 상식
            byte[] data = new byte[srcRect.Width * srcRect.Height * 4];
            
            //원본이미지에서 면적만큼 가져와 바이트배열에 저장한다.
            image.GetData(0, srcRect, data, 0, data.Length);
            
            //새로운 텍스쳐를 생성한다.
            //주��할점은 TextureFormat을 원본이미지�� Format과 같게해야 된다.
            Texture2D result = 
                new ResolveTexture2D(this.GraphicsDevice, srcRect.Width, srcRect.Height, 0, image.Format);
            
            //데이터를 채워주고..
            result.SetData(data);
            
            //����한다.
            return result;
        }
 
 
 
참고 :: http://xna.omgsoft.com.cn/education/graphicex_class.aspx


중요한점은 복제될 Texture2D의 Format  과 원본 Texture2D 의 Format 이 일치해야 되더라



Yamecoder 야매코더_
XNA 2010.12.04 02:30

[XNA , Texture2D] Texture2D from Bitmap (very Simple)


Content.Load<T> 로 불러올수 있는것은 *.xnb밖에 없다.

동적으로 캡춰되거나 연산된 비트맵을 받아오기가 영 까다롭다.

그래서 매우 간단한 비트맵 복사 방법을 생각했다.


Created with colorer-take5 library. Type 'csharp'

private Texture2D tx;
        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);

            //비트맵을 만든다.
            Bitmap b = new Bitmap(@"c:\a.jpg");
            //xna �� 컬러배열을 타겟 비트맵 크기만큼 생성한다.
            xColor[] pixels = new xColor[b.Width * b.Height];
            //x , y 루프를 돌려 비트맵�� 컬러를 검출��여 xna 컬러배열에 넣는다.
            for (int y = 0; y < b.Height; ++y)
                for (int x = 0; x < b.Width; ++x)
                {
                    cColor c = b.GetPixel(x, y);
                    pixels[(y * b.Width) + x] = new xColor(c.R, c.G, c.B, c.A);
                }
            //texture2d를 생성��고 컬러를 적용한다.
            tx = new Texture2D(graphics.GraphicsDevice, b.Width, b.Height, 1, TextureUsage.None, SurfaceFormat.Color);
            tx.SetData<xColor>(pixels);


        }
실시간으로 캡춰가 될때 퍼포먼스는 아직 무리수
 
 
Yamecoder 야매코더_
XNA 2010.12.04 02:28

하나의 BasicEffect 에 여러 텍스쳐 그리기


대신 루프에 한줄씩 더 추가되어 시피유 올라감 --;
Yamecoder 야매코더_
XNA 2010.12.04 02:23

[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 처럼 자유롭다.

기본적인 사용법은 이러하다.

주석 위주로 보면 됨


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 이라서 이러한 크기에서 테스트중..
 
Yamecoder 야매코더_
XNA 2010.12.04 00:08
Powerd by Tistory, designed by criuce
rss