상세 컨텐츠

본문 제목

텍스쳐를 잘라서 복사하기~ 텍스쳐 자르기 관련

프로그래밍 관련/게임프로그래밍

by AlrepondTech 2011. 3. 29. 14:49

본문

반응형

 

 

 

 

=======================

=======================

=======================

 

 

 

 

텍스쳐를 잘라서 복사하기~ 텍스쳐 자르기 관련

제 코딩이 오크코딩이기 때문에 가독성이 떨어지시더라두 이해해주세요 ㅠㅠ

  

 

함수(카피본텍스쳐,카피텍스쳐,int _left,int _right,int _top,int _bottom) // 어느 공간만큼 자를것인지 결정한다.

 

D3DXCreateTexture( pdevice, _right-_left, _bottom-_top, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &카피텍스쳐 );

 

//구조체를 선언하고 클리어 한다    
D3DLOCKED_RECT rect;
ZeroMemory( &rect, sizeof(rect) );

D3DLOCKED_RECT rect2;
ZeroMemory( &rect2, sizeof(rect2) );


//텍스쳐를 락한다. 실패하면 리턴 E_FAIL
if( FAILED( 카피본텍스처->LockRect(0, &rect, 0, 0) ) )
{
    exit(0);
}


//텍스쳐를 락한다. 실패하면 리턴 E_FAIL
if( FAILED(카피텍스쳐->LockRect(0, &rect2, 0, 0) ) )
{
 exit(0);
    //return E_FAIL;
}

 

 

//바이트형의 포인트 선언    
BYTE *pBuf;
BYTE *pBuf2;

//락을 한 텍스쳐의 포인트를 얻어온다    .
pBuf = (BYTE *)rect.pBits;
pBuf2 = (BYTE *)rect2.pBits;
 

 for( int k = 0; k < 카피본텍스쳐세로크기  ; k++)
 {
    for( int j = 0; j < 카피본텍스쳐가로크기; j++)
    {
   
        
  //pBuf += 4; <- 이렇게 써주면 한픽셀 삑살난다 왜? 먼저 한번 더해주므로 
  if( (_left<=j && j<_right)  && (_top<=k && k<_bottom) )
  {
     pBuf2[0]=pBuf[0];
        pBuf2[1]=pBuf[1];
        pBuf2[2]=pBuf[2];
        pBuf2[3]=pBuf[3];
  pBuf2 += 4;//4개씩 건너 뜀
  }
  pBuf += 4;//4개씩 건너 뜀 //주소 더하는 위치 틀리지않도록 그림위치 삑살난다 
         //pBuf += 4; 위에다 써주면 한픽셀 삑살이 난다 
    }
 }


 //모두 대입했으니 락 해제
 카피본텍스쳐->UnlockRect(0);
 카피텍스쳐->UnlockRect(0);

 

 

 

=======================

=======================

=======================

 

 

 

 

반응형

 

 

728x90

 

 

 

 

텍스쳐 자르기 입니다~ 지금것은 32비트 일때이구(그냥 락걸어서 영역만큼 카피하는것이 끝;;)

24비트일때(아시겠지만^^;)에는 알파값 빼고 3개값을 넘겨 주시면 됩니다 

 pBuf2[0]=pBuf[0]; ,pBuf2[1]=pBuf[1];,pBuf2[2]=pBuf[2];pBuf += 3;주석은 실수했던 부분을 애교로 남겨두었습니다 자잘한 부분;; (애교로 봐주시는 센스~)  

 

//추가~~~

본이미지 그대로 복사본텍스쳐 만들때 width,height :D3DX_DEFAULT_NONPOW2 으로 MipLevels: 은 1로 설정

 

//------------------------------

더 좋은 방법 있으면 리플 달아주시는 센스 +.+ 그엄 (--)(__) 꾸벅~~ 

 

 


//------------------------------

[팁] 텍스쳐를 잘라서 복사하기2~ 불필요한 for문 넘기기    

 

 

bool CopyRectImgLoad(카피본텍스쳐,카피텍스쳐, int nLeft,int nRight,int nTop,int nBottom,D3DFORMAT fmt )
{

 HRESULT hr;

 if((m_pGraphics = pGraphics) == NULL)
  return false;

 if(pGraphics->GetD3DDevice() == NULL)
  return false;
 
 int nWidth = nRight-nLeft;     //잘라낼 이미지의 가로크기
 int nHeight = nBottom-nTop; //잘라낼 이미지의 세로크기
 
 
 SetRect(&m_rcTexture, 0, 0, nWidth, nHeight);

 D3DXCreateTexture(m_pGraphics->GetD3DDevice(),nWidth, nHeight, 1, 0, fmt, D3DPOOL_MANAGED, &카피텍스쳐);

 

 //구조체를 선언하고 클리어 한다    
 D3DLOCKED_RECT rect;
 ZeroMemory( &rect, sizeof(D3DLOCKED_RECT) );
 D3DLOCKED_RECT tmpRect;
 ZeroMemory( &tmpRect, sizeof(D3DLOCKED_RECT) );

 //텍스쳐를 락한다. 실패하면 리턴 E_FAIL
 if( FAILED( 카피본텍스쳐->LockRect(0, &rect, 0, 0) ) ){return false;}
 //텍스쳐를 락한다. 실패하면 리턴 E_FAIL
 if( FAILED(카피텍스쳐->LockRect(0, &tmpRect, 0, 0) ) ){return false;}


 //바이트형의 포인트 선언    
 BYTE *pBuf;
 BYTE *pTmpBuf;

 
 //락을 한 텍스쳐의 포인트를 얻어온다    .
 pBuf = (BYTE *)rect.pBits;
 pTmpBuf = (BYTE *)tmpRect.pBits;
  

 pBuf=pBuf+((카피본이미지Width*4)*nTop)+(4*nLeft); //읽을 이미지 만큼 넘긴다..
 for( int k = 0; k < nHeight;k++) //자른이미지의 height만큼만 돌립니다. 
 {
  for( int j = 0; j < nWidth; j++)  //자른이미지의 width만큼만 돌립니다. 

  {
       pTmpBuf[0]=pBuf[0];
    pTmpBuf[1]=pBuf[1];
    pTmpBuf[2]=pBuf[2];
    pTmpBuf[3]=pBuf[3];
    pTmpBuf += 4;//4개씩 건너 뜀
    pBuf += 4;
  }
  pBuf = pBuf+( (카피본이미지Width*4)-(nWidth*4) ); // 아래칸으로 한칸넘어갈떄 본이미지의 width의 길이만큼 더해서 넘어가야겠죠
 }

 //모두 대입했으니 락 해제
 카피본텍스쳐->UnlockRect(0);
 카피텍스쳐->UnlockRect(0);
 return true;
}

 

//------------------------------

//이로서 필요한 공간에만 루프를 돌고 쓸데없는 공간의 루프는 뺐습니다 ^^

//언제나 오크코딩 +.+ ~~~(오크 만쉐이~~~)

//------------------------------

 

//언제나~후렴: 더 좋은방법 있으면 공유 부탁 드립니다~+.+  


 

=======================

=======================

=======================

 

 

  

 

 

반응형


관련글 더보기

댓글 영역