=======================
=======================
=======================
텍스쳐를 잘라서 복사하기~ 텍스쳐 자르기 관련
제 코딩이 오크코딩이기 때문에 가독성이 떨어지시더라두 이해해주세요 ㅠㅠ
함수(카피본텍스쳐,카피텍스쳐,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);
=======================
=======================
=======================
텍스쳐 자르기 입니다~ 지금것은 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;
}
//------------------------------
//이로서 필요한 공간에만 루프를 돌고 쓸데없는 공간의 루프는 뺐습니다 ^^
//언제나 오크코딩 +.+ ~~~(오크 만쉐이~~~)
//------------------------------
//언제나~후렴: 더 좋은방법 있으면 공유 부탁 드립니다~+.+
=======================
=======================
=======================
'프로그래밍 관련 > 게임프로그래밍' 카테고리의 다른 글
다이렉트X 비디오 메모리 구하기 (0) | 2016.05.26 |
---|---|
게임개발 가변 프레임율이 지원되는 FrameSkip (1) | 2012.11.08 |
DirectX9를 이용한 3D GAME 프로그래밍 입문 ppt자료 (0) | 2011.03.30 |
[정보] MFC + DXUT 기본적으로 붙인것~ (타일붙인 파일포함) (0) | 2011.03.29 |
가변프레임 (0) | 2011.01.31 |