[김재진]행렬의 곱셈 및 항등행렬 설명

Programming/DirectX 2010. 5. 27. 19:27 Posted by 알 수 없는 사용자

 행렬의 곱셈
   
 
행렬의 곱셈에서는 순서가 바뀌면 값도 바뀝니다. 위의 행렬 순서를 아래와 같이 바꾸면...

그래서 행렬 곱셈시에는 순서가 중요합니다.


 항등행렬  

  어떤 행렬에 항등행렬을 곱하면(단 차수가 동일할 것), 원래의 행렬값이 됩니다.
  A * I = A = I * A = A

  하지만 항등행렬은 행렬곱셈에서 봤던 것처럼 순서가 중요하지 않습니다.  순서가 바뀌어도 결과가 동일하기 때문이죠
  항등행렬이 되려면 n * n 과 같은 정사각형의 행렬이어야 하며, 대각선이 모두 1로 구성되어 있고, 나머지는 0으로 채워져 있다는 점입니다.  
 
  3차원 항등행렬을 보겠습니다.  
 

위의 행렬을 곱하는 순서에 관계없이 어떤 행렬에 곱셈을 할경우 동일한 결과가 나오는데 이를 항등행렬이라 합니다

출처 : http://eecs.tistory.com/entry/3D프로그래밍의-첫걸음-행렬

'Programming > DirectX' 카테고리의 다른 글

[손동진] 빌보드 (Billboard)  (0) 2010.06.07
[김재진]3D그래픽스의 개념과 렌더링파이프라인  (0) 2010.05.27
[손동진] 재질과 광원  (0) 2010.05.27
[김재진] 3D 행렬  (1) 2010.05.24
DirectX-정점  (1) 2010.05.20

[손동진] 재질과 광원

Programming/DirectX 2010. 5. 27. 17:27 Posted by 알 수 없는 사용자
1. 재질
재질이란 메시(또는 물체)의 표면 상태를 말하는 것으로 빛이 물체의 표면에서 반사되어 변화된 뒤 사람의 눈에 들어오기까지의 과정을 수학적으로 모델링하기 위해서 사용하는 값들이다.

1.1 재질의 종류
  • 주변색 (ambient)
    • 광원의 위치와 무관하게 똑같은 양으로 모든 점에서 반사되는 색
  • 확산색 (diffuse)
    • 광원에서 반사될 때 출력되는 가장 주된 색
  • 반사색 (specular)
    • 특정한 방향으로만 반사되는 색. 광원의 위치와 카메라의 위치에 따라서 달라진다.
  • 방출색 (emissive)
    • 메시 표면에서 자체적으로 방출되는 색. 단, 이 빛이 다른 메시에 영향을 주지는 못 한다.

2. 광원의 종류
  • 주변 광원 (ambient light)
    • 3차원 공간 내에서 메시의 배치나 위치와는 전혀 상관없이 똑같은 양으로 모든 곳을 비추는 빛의 강도를 말한다. 방향, 위치가 없으며 색과 강도만이 존재한다.
  • 점 광원 (point light)
    • 직관적으로 가장 쉽게 생각할 수 있는 빛이다. 예를 들면, 백열전구를 생각하면 된다. 광원의 위치에 따라 빛의 강도가 달라진다.
  • 방향성 광원 (directional light)
    • 모든 광원의 방향이 하나의 방향을 갖는 것으로 완벽하지는 않지만 태양을 예로 들 수 있다. 광원의 위치는 상관 없고, 방향이 가장 중요한 요소다.
  • 점적 광원 (spot light)
    • 정해진 위치와 범위에만 비추는 특수한 조명을 말한다. 흔히 영화나 쇼무대에서 사용하는 스포트라이트 조명을 생각하면 된다.

이들 광원 모델은 D3D의 고정함수 파이프라인을 사용할 때만 유효하고, 정점 셰이더와 픽셀 셰이더를 사용하게 되면 모두 무용지물이 된다.



* 용책 요약 (p. 161)
  • Direct3D는 방향성 광원과 점 광원, 스포트 광원의 세 가지 광원 모델을 제공하며, 광원은 환경광(ambient)과 난반사광(diffuse), 정반사광(specular)의 세 가지 빛을 발산한다.
  • 펴면의 재질은 표면과 표면에 닿는 빛과의 상호작용을 정의한다. (반사 되거나 흡수될 빛의 양을 조정하여 표면의 컬러를 결정한다.)
  • 버텍스 법선은 버텍스의 방향을 정의하며 Direct3D는 버텍스 법선을 이용해 버텍스에 빛이 닿는 각도를 계산해낸다. 버텍스의 법선이 삼각형의 법선과 동일한 경우도 있지만 부드러운 표면(구체, 원통 등)을 표현하는 경우에는 그렇지 않은 경우도 있다.

[장영수]MFC-Cimage

Programming/MFC 2010. 5. 27. 17:11 Posted by 알 수 없는 사용자
cImage 사용하다가 막혀서 불펌 -ㅂ-ㅋㅋ

----

CImage는 MS에서 .net 이후부터 제공되는 그림 관련 클래스임.
이전 CBitmap의 bmp만 다루던거에서 좀더 확장하여 Png, Jpg, gif등 다양한 포멧을 지원한다.

기본적으로 사용은
CImage image; 로 한다.

CImage는 일종의 스케치북으로 볼수 있다.

사용법으로
CImage.Create(width, height, bpp); 로 새 스케치북을 만드거나
CImage.Load(CString("filename")); 으로 파일을 받아올수 있다.

이렇게 만들어진것중에서 자주 사용하는 매소드로
BitBlt ... : 기본 API 이다.
사용법은
CImage image;
image.Load("test.jpg");
image.BitBlt(pDC, 0, 0);

이러면 pDC의 0,0 지점에 test.jpg 그림이 복사된다.
좀더 응용하면

CImage a,b;
a.Load("test.jpg");
b.Create(a.GetWidth(), a.GetHeight(), a.GetBPP());
a.BitBlt(b.GetDC(), 0, 0);
b.ReleaseDC();

이렇게 하면 b에 a의 그림이 복사된다.
중요 포인트는 GetDC()를 해준뒤 바로 ReleaseDC를 해줘야 한다.

나머지 대충 사용하면되고..

GetPixel의 경우..
GetPixel과 SetPixel을 그대로 사용하는건 정말 CPU혹사시키는 짓이다.
다음 함수로 대체 하는것이 좋다

// SetPixel 대용
void PointColor(CImage *image, int x, int y, COLORREF c)
{
 // m_image.SetPixel() call ::SetPixel() which is too slow
 // since it has to work with all DCs.

 BYTE *p = (BYTE*)image->GetPixelAddress(x, y);
 if (m_nBitDepth == 16) {
  *(WORD *)p = (WORD)(((c&0xf80000) >> 19) | ((c&0xf800) >> 6) | ((c&0xf8) << 7));
 }
 else {
  *p++ = GetBValue(c);
  *p++ = GetGValue(c);
  *p = GetRValue(c);
 }
}

// GetPixel 대용
COLORREF GetPointColor(CImage *image, int x, int y)
{
 COLORREF result = *((COLORREF*)image->GetPixelAddress(x,y));

 // 메모리에서 가져올때, blue와 red위치가 바뀌어서 가져와진다
 BYTE r = GetBValue(result);
 BYTE g = GetGValue(result);
 BYTE b = GetRValue(result);
 
 return RGB(r,g,b);
}