DirectX 9 Ch5. 조명.

Slides:



Advertisements
Similar presentations
2. 속력이 일정하게 증가하는 운동 Ⅲ.힘과 운동 2.여러 가지 운동. 도입 Ⅲ.힘과 운동 2. 여러 가지 운동 2. 속력이 일정하게 증가하는 운동.
Advertisements

기계시스템디자인공학과 기계제도 SEOUL NATIONAL UNIVERSITY OF SCIENCE & TECHNOLOGY
1. 도형의 연결 상태 2. 꼭지점과 변으로 이루어진 도형 Ⅷ. 도형의 관찰 도형의 연결상태 연결상태가 같은 도형 단일폐곡선의 성질 연결상태가 같은 입체도형 뫼비우스의 띠.
작도에 대하여 조사자 : 이준호 담당선생님 : 박문열 선생님.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
Ch7. 블렌딩 “현재 래스터라이즈 과정에 있는 픽셀과 같은 위치에 있는 이전의 픽셀을 서로 섞는(조합)하는 테크닉!”
Report #5 - due: 4/13 다음 10*5의 희소 행렬 A, B를 고려하라.
Entity Relationship Diagram
고장률 failure rate 어떤 시점까지 동작하여 온 품목이 계속되는 단위기간내에 고장을 일으키는 비율(횟수). 고장률은 확률이 아니며 따라서 1 보다 커도 상관없다. 고장이 발생하기 쉬운 정도를 표시하는 척도. 일반으로 고장률은 순간고장률과 평균고장률을 사용하고 있지만.
원자 스펙트럼 1조 서우석 김도현 김종태.
#include <stdio.h> int main(void) { float radius; // 원의 반지름
제 9 장 구조체와 공용체.
Report #2 - Solution 문제 #1: 다음과 같이 프로그램을 작성하라.
Windows Server 장. 사고를 대비한 데이터 백업.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
질의 사항 Yield Criteria (1) 소재가 평면응력상태에 놓였을 때(σ3=0), 최대전단응력조건과 전단변형에너지 조건은σ1 – σ2 평면에서 각각 어떤 식으로 표시되는가? (2) σ1 =σ2인 등이축인장에서 σ = Kεn로 주어지는 재료의 네킹시 변형율을 구하라.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
23장. 구조체와 사용자 정의 자료형 2.
제4장 컬 러(COLOR) 컬러 표현 Direct3D는 RGB 세 성분을 이용해 컬러 표현
제5장 조명 학기 컴퓨터게임(DIrectX).
상관함수 correlation function
컴퓨터 프로그래밍 : 실습3 2장 데이터와 식.
3차원 객체 모델링.
Trigonometric Function
Ⅲ. 이 차 방 정 식 1. 이차방정식과 그 풀이 2. 근 의 공 식.
(생각열기) 옷가게에서 옷을 살 때와 옥가게 밖으로 나와 서 옷을 볼 때 옷 색이 달라져 보이는 이유는?
Chapter03 캔버스(1) HTML5 Programming.
군집 분석.
수학 토론 대회 -도형의 세가지 무게중심 안다흰 임수빈.
HTTP 프로토콜의 요청과 응답 동작을 이해한다. 서블릿 및 JSP 를 알아보고 역할을 이해한다.
(생각열기) 거울과 일반적인 물체에서 빛은 어떻게 반사 되는가?
TFT-LCD 구조 동작원리 응용분야.
Term Projects 다음에 주어진 2개중에서 한 개를 선택하여 문제를 해결하시오. 기한: 중간 보고서: 5/30 (5)
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
색체 인식과 영상 장치 빛의 합성과 색체 인식 백색광 ex) 햇빛, 형광등, 백열등
3D 프린팅 프로그래밍 01 – 기본 명령어 강사: 김영준 목원대학교 겸임교수.
Clipping 이진학.
정다면체, 다면체와 정다각형, 다각형의 관계 한림초등 학교 영제 6학년 5반 송명훈.
고체역학 2 - 기말고사 1. 단면이 정사각형이고 한번의 길이가 a 일 때, 최대굽힘응력과 최대전단응력의 비를 구하라(10).
다면체 다면체 다면체: 다각형인 면만으로 둘러싸인 입체도 형 면: 다면체를 둘러싸고 있는 다각형
게임수학 제 7 장 조명.
WPF 3D 그래픽 발표자 : 조 현 민.
Thevenin & Norton 등가회로 1등 : 임승훈 - Report 05 - 완소 3조 2등 : 박서연
평 면 도 형 삼각형 다각형 원과 부채꼴 다각형과 원 학습내용을 로 선택하세요 다각형과 원
객체기반 SW설계 팀활동지 4.
끓는점을 이용한 물질의 분리 (1) 열 받으면 누가 먼저 나올까? 증류.
Teaming pms.
디버깅 관련 옵션 실습해보기 발표 : 2008년 5월 19일 2분반 정 훈 승
Window, Viewport Window, Viewport.
에어 PHP 입문.
전반사(Total Reflection)와 광통신
Chapter 1 단위, 물리량, 벡터.
DA :: 퀵 정렬 Quick Sort 퀵 정렬은 비교방식의 정렬 중 가장 빠른 정렬방법이다.
Support Vector Machine
Chapter 1 단위, 물리량, 벡터.
1. 접선의 방정식 2010년 설악산.
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
1. 정투상법 정투상법 정투상도 (1) 정투상의 원리
광합성에 영향을 미치는 환경 요인 - 생각열기 – 지구 온난화 해결의 열쇠가 식물에 있다고 하는 이유는 무엇인가?
혼색 color mixture.
9 브라우저 객체 모델.
상관계수.
컴퓨터공학과 손민정 Computer Graphics Lab 이승용 교수님
Ⅳ. 제도의 기초 1. 물체를 나타내는 방법 3) 물체의 표현 방법 (2) 입체도법 지도학급 : 태화중학교 1학년 4반
게임수학 제 8 장 고급 렌더링.
수치해석 ch3 환경공학과 김지숙.
9장. spss statistics 20의 데이터 변수계산
: 3차원에서 입자의 운동 방정식 제일 간단한 경우는 위치만의 함수 : 시간, 위치, 위치의 시간미분 의 함수
7 생성자 함수.
6 객체.
Presentation transcript:

DirectX 9 Ch5. 조명

목표 Direct3D가 지원하는 광원의 종류에 대해 배우고 이들 광원에서 발생하는 빛의 종류에 대해 확인한다. 빛과 빛이 만나는 표면 간의 상호작용을 정의하는 방법을 이해한다. 삼각형이 바라보는 방향을 수학적으로 계산하여 빛이 삼각형과 만나는 각도를 알아내는 방법을 확인한다.

5.1 조명의 요소 Ambient light (환경광) - ambient light은 다른 표면에 반사되어 전반적인 장면을 밝게 하는 빛을 모델링한다. 예를 들어, 물체의 일부분은 광원의 직접적인 시야에서 가려져 있더라도 약간의 빛을 받는다. 이런 부분은 다른 표면에서 반사된 빛을 받는 것이다. ambient light은 이와 같이 반사된 빛을 비교적 저렴하고 간단하게 구현하는 방법이다. Diffuse light (난반사광) - dl은 특정한 방향으로 진행하며, 표면에 닿으면 모든 방향으로 동일하게 반사된다. 모든 방향으로 동일하게 반사되어 위치와는 관계없이 관찰자의 눈에 빛이 도달하므로 관찰자의 위치는 고려할 필요가 없다. 즉, diffuse light의 방정식에는 빛의 방향과 표면의 형태만을 고려하면 된다.__ diffuse light은 광원에서 발산되는 가장 일반적인 빛이다. Specular light (정반사광) - specular light은 특정한 방향으로 진행하며, 표면에 닿으면 한 방향으로 강하게 반사되어 특정한 각도에서만 관찰할 수 있다. 한 방향으로만 빛을 반사하기 때문에 specular light의 방정식에는 빛의 방향과 표면의 형태, 그리고 관찰자의 시점을 모두 고려해야 한다. specular light은 반짝이는 표면에 빛이 반사되는 효과를 모델링하는 데 이용된다.

5.1 조명의 요소 specular light은 다른 타입의 빛에 비해 좀 더 많은 계산을 필요로 하기 때문에 Direct3D는 이를 끌 수 있는 옵션을 제공한다. 실제로 비활성화가 디폴트 값이며, 활성화하기 위해서는 IDirect3DDevice9::SetRenderState의 D3DRS_SPECULARENABLE 상태를 true로 설정해야 한다. 각각의 빛의 형은 빛의 컬러를 표현하는 D3DCOLOR 나 D3DCOLORVALUE로 나타낼 수 있다. D3DCOLOR의 alpha 값은 빛의 컬러를 표현할 때는 사용되지 않는다. g_device->SetRenderState( D3DRS_SPECULARENABLE, true ); D3DXCOLOR ambientRed( 1.0f, 0.0f, 0.0f, 1.0f ); D3DXCOLOR diffuseBlue( 0.0f, 0.0f, 1.0f, 1.0f ); D3DXCOLOR specularWhite( 1.0f, 1.0f, 1.0f, 1.0f );

5.2 재질(Material) 현실에서 물체의 컬러는 물체가 반사하는 빛의 컬러에 의해 결정된다. 예를 들어, 빨간 공은 빛의 컬러 중에서 빨간색만 반사하고 빨간색 이외의 다른 색은 모두 흡수하며, 반사된 빨간색이 우리 눈에 도달하여 공을 빨간색으로 인식하는 것이다. Direct3D는 물체의 material을 정의할 수 있도록 하여 이와 같은 현상을 모델링하는데, material은 물체의 표면에서 반사할 빛의 퍼센테이지를 지정할 수 있도록 해준다. material을 나타내는 데에는 D3DMATERIAL9구조체가 사용된다. typedef struct _D3DMATERIAL9 {     D3DCOLORVALUE Diffuse;  // 표면이 반사하는 diffuse lighting의 양을 지정한다.     D3DCOLORVALUE Ambient;  // 표면이 반사하는 ambient lighting의 양을 지정한다.     D3DCOLORVALUE Specular; // 표면이 반사하는 specular lighting의 양을 지정한다.     D3DCOLORVALUE Emissive; // 전반적인 표면의 컬러를 더하는 데 사용되며,                             // 물체 자체가 빛을 발하는 것 처럼 좀 더 밝은 물체 효과를 만들어낸다.     float Power;            // specular lighting의 날카로운 정도(sharpness)를 지정하며,                             // 값이 높아질수록 highlight가 강조된다. } D3DMATERIAL9;

5.2 재질(Material) 예를 들어, 빨간 공을 원한다면 빨간 빛만을 반사하고 다른 모든 빛을 흡수하도록 재질을 설정하면 된다. D3DMATERIAL9 redMaterial; ZeroMemory( &red, sizeof( redMeterial ) ); redMeterial.Diffuse  = D3DXCOLOR( 1.0f, 0.0f, 0.0f, 1.0f ); redMeterial.Ambient  = D3DXCOLOR( 1.0f, 0.0f, 0.0f, 1.0f ); redMeterial.Specular = D3DXCOLOR( 1.0f, 0.0f, 0.0f, 1.0f ); redMeterial.Emissive = D3DXCOLOR( 0.0f, 0.0f, 0.0f, 1.0f ); redMeterial.Power    = 5.0f;

5.2 재질(Material) D3DMATERIAL9 구조체를 채우는 일을 다음과 같이 미리 정의해 놓고 사용할 수 있다. vertex 구조체는 material 속성을 가지지 않으며, 대신 현재의 material을 지정하는 IDirect3DDevice9::SetMaterial을 이용한다. D3DMATERIAL d3d::CreateMaterial(D3DXCOLOR ambient, D3DXCOLOR diffuse, D3DXCOLOR specular, D3DXCOLOR emissive, float power) {     D3DMATERIAL9 material;     material.Ambient  = ambient;     material.Diffuse  = diffuse;     material.Specular = specular;     material.Emissive = emissive;     material.Power    = power;     return material } namespace d3d {     ...     D3DMATERIAL9 CreateMaterial(D3DXCOLOR, D3DXCOLOR, D3DXCOLOR, D3DXCOLOR, float);     const D3DMATERIAL9 MATERIAL_WHITE  = CreateMaterial(  WHITE,  WHITE,  WHITE, BLACK, 8.0f );     const D3DMATERIAL9 MATERIAL_RED    = CreateMaterial(    RED,    RED,    RED, BLACK, 8.0f );     const D3DMATERIAL9 MATERIAL_GREEN  = CreateMaterial(  GREEN,  GREEN,  GREEN, BLACK, 8.0f );     const D3DMATERIAL9 MATERIAL_BLUE   = CreateMaterial(   BLUE,   BLUE,   BLUE, BLACK, 8.0f );     const D3DMATERIAL9 MATERIAL_YELLOW = CreateMaterial( YELLOW, YELLOW, YELLOW, BLACK, 8.0f );     ... }

5.3 버텍스 법선(Vertex Normal) face normal(면 법선)은 다각형이 바라보는 방향을 표시하는 벡터이다. vertex normal은 기본적으로 동일한 아이디어에 기반을 두고 있지만, 각각의 폴리곤에 따른 법선이 아니라 폴리곤을 구성하는 벡터에 대한 법선을 정의한다. Direct3D는 표면에 닿는 빛의 각도를 계산하기 위해 vertex normal을 필요로 한다. 빛의 계산은 vertex 단위로 수행되므로 각 vertex의 표면 각도(법선)가 필요한 것이다. vertex normal과 face normal이 동일한 것은 아니라는 데 주의하자. 구체/원은 이를 보여주는 좋은 예이다. vertex normal을 표기하기 위해서는 vertex 구조체를 다시 정의해야 한다. 4장에서 사용되었던 컬러와 관련된 멤버가 제거된 이유는 vertex컬러를 계산하는데 조명을 이용할 것이기 때문이다. struct Vertex {     float x, y, z;     float nx, ny, nz;     static const DWORD FVF; } const DWORD Vertex::FVF = D3DFVF_XYZ | D3DFVF_NORMAL;

5.3 버텍스 법선(Vertex Normal) 입방체나 구체와 같은 단순한 물체의 경우에는 눈으로도 vertex normal을 볼 수 있지만 좀 더 복잡한 mesh의 경우에는 다른 방법이 필요하다. 점 p0, p1, p2로 이루어진 삼각형이 있고, 각 점에 대한 법선 n0, n1, n2를 계산해야 한다고 가정할 때, 가장 간단한 방법은 삼각형의 face normal을 찾고 이것을 vertex normal에 이용하는 것이다. 1. 먼저, 삼각형에 있는 두 개의 벡터를 계산한다. 2. 다음으로, face normal을 계산한다. 3.각각의 vertex normal은 face normal과 같으므로, p1 - p0 = u p2 - p0 = v n = u x v n0 = n1 = n2 = n

5.3 버텍스 법선(Vertex Normal) 다음 함수는 위의 내용을 코드로 옮긴 것이다. 단, 이 함수는 vertex의 winding order가 시계 방향이라고 가정한다(만약, 그렇지 않다면 법선은 반대 방향에 위치한다). void ComputeNormal(D3DXVECTOR3* pOut, D3DXVECTOR3* p0, D3DXVECTOR3* p1, D3DXVECTOR3* p2) {     D3DXVECTOR3 u = *p1 - *p0;     D3DXVECTOR3 v = *p2 - *p0;     D3DXVec3Cross( pOut, &u, &v );     D3DXVec3Normal( pOut, pOut ); }

5.3 버텍스 법선(Vertex Normal) 삼각형으로 부드러운 표면을 표현할 때, face normal을 vertex normal로 이용하면 그다지 부드러운 결과를 얻을 수 없다. vertex normal을 얻기 위한 좀 더 나은 방법으로는 법선의 평균을 이용하는 방법이 있다. 점 v의 vertex normal vn을 찾기 위해서는 v를 공유하는 모든 face normal을 구한 다음, 이들의 평균을 구하여 vn을 구할 수 있다. 변환 단계에서 vertex normal이 왜곡되는 현상이 발생할 수 있으므로, IDirect3DDevice9::SetRenderState의 D3DRS_NORMALIZENORMALS를 true로 하여 변환 이후에 Direct3D가 모든 법선을 다시 정리하도록 하는 것이 안전하다.

5.4 광원 Point light (점 광원): point light는 월드 스페이스 내에 위치를 가지며 모든 방향으로 빛을 발산한다. Directional light (방향성 광원): directional light는 위치는 가지지 없지만 지정된 방향으로 평행하게 빛을 빛을 발산한다. Spot light (스포트 광원): spot light는 손전등 빛과 비슷하다. 광원은 위치를 가지며 특정한 방향으로 원뿔 형태의 빛을 발산한다. 원뿔은 θ와 φ의 두 가지 각도에 의해 결정되는데, θ는 안쪽, φ는 바깥쪽의 원뿔을 나타낸다.

5.4 광원 Direct3D에서 광원은 D3DLIGHT9 구조체를 통해 나타낼 수 있다. typedef struct _D3DLIGHT9 {     D3DLIGHTTYPE Type;      // 만들고자 하는 광원의 타입(D3DLIGHT_POINT, D3DLIGHT_SPOT, D3DLIGHT_DIRECTIONAL)     D3DCOLORVALUE Diffuse;  // 광원이 발산하는 diffuse light의 컬러     D3DCOLORVALUE Specular; // 광원이 발산하는 specular light의 컬러     D3DCOLORVALUE Ambient;  // 광원이 발산하는 ambient light의 컬러     D3DVECTOR Position;     // 광원의 위치 (D3DLIGHT_DIRECTIONAL의 경우 의미가 없음)     D3DVECTOR Direction;    // 빛의 방향 (D3DLIGHT_POINT에서는 사용하지 않음)     float Range;            // 빛이 완전히 소멸할 때까지 나갈 수 있는 최대 거리                              // (D3DLIGHT_DIRECTIONAL의 경우 의미가 없으며, root(FLT_MAX)보다 클 수 없다.     float Falloff;       // D3DLIGHT_SPOT에서만 사용되며, 안쪽/바깥쪽 원뿔 간의  //빛의 세기 차이를 정의(보통 1.0f)     float Attenuation0;     // 감쇠(attenuation)는 거리에 따라 빛의 세기가 약해지는 정도를 정의     float Attenuation1;     // Attenuation0은 상수 감소, Attenuation1은 선형 감소, Attenuation2는 이차 감소     float Attenuation2;     // Attenuation = 1/(A0 + A1*D + A2*D^2) (단, D는 광원으로부터의 거리)     float Theta;            // D3DLIGHT_SPOT에서만 이용되며, 안쪽 원뿔의 각도를 라디안으로 지정     float Phi;              // D3DLIGHT_SPOT에서만 이용되며, 바깥쪽 원뿔의 각도를 라디안으로 지정 } D3DLIGHT9;

5.4 광원 초기화하는 과정을 다음과 같이 함수로 작성해 두면 편하게(?) 사용할 수 있다. D3DLIGHT9를 초기화한 다음에는 IDirect3DDevice9::SetLight를 호출하여 Direct3D가 내부적으로 관리하는 리스트에 광원을 등록시켜야 하며, 광원을 켜거나 끌 때에는 IDirect3DDevice9::LightEnable을 이용한다. D3DLIGHT9 CreateDirectionalLight(D3DXVECTOR3* direction, D3DXCOLOR* color) {     D3DLIGHT9 light;     ZeroMemory( &light, sizeof( light ) );     light.Type      = D3DLIGHT_DIRECTIONAL;     light.Ambient   = *color * 0.4f;     light.Diffuse   = *color;     light.Specular  = *color * 0.6f;     light.Direction = *direction;     return light; } // +x축의 방향으로 평행하고 흰색 빛을 발산하는 방향성 광원 D3DVECTOR3 dir( 1.0f, 0.0f, 0.0f ); D3DXCOLOR color = WHITE; D3DLIGHT9 light = CreateDirectionalLight( &dir, &color );