직접 정점들을 정의하기위한 정점들의 부모 정의
01 . VI 버퍼
엔진에 vi 버퍼 구현
멤버변수 m_pVB - 정점들을 보관할 수 있는 메모리
m_iStride 정점의 길이
m_iNumVertices 정점의 갯수
Vi 버퍼를 부모로 VI버퍼_렉트도 구현해주자.
NativeConstruct_Prototype에서 장치의 CreateVertexBuffer함수를 호출하자
-CreateVertexBuffer
(값의 길이,값을 어떻게 사용할것인지 , 정점에 뭐가 들어갈건인지, 생선한 정점을 저장할 주소)
렉트를 그리냐 큐브를 그리냐에따라서 m_iStride,m_iNumVertices는 크게 달라질수 있음 ( 자식에서 이를 정의하자) 자식에서 공간을 할당하고 부모를 통해 초기화하자.
일단 사각형을 그리기위해 점 6개(삼각형 2개)가 필요
Engine_Struct를 정의해보자
다시 CreateVertexBuffer함수로 돌아와서 첫번쨰 인자를 결정해줬음 이제 두 번째 인자를 채워보자 멤버변수 m_dwVBUsage
두번째 인자는 인자를 어떻게 사용할것인지
일단은 0으로 채워주지만 D3DUSAGE_DYNAMIC으로 넣어주면 버퍼를 동적으로 만들어줌(0은 정적으로)
정적은 렌더링이 빠르고 갱신이되긴하지만 굉장히 느리다(동적은 반대)
내가 그린 사각형이 움직이면 갱신된다고 생각할수있지만 로컬 스페이스 좌표는 변하지 않음 월드행렬을 바꿔서 곱할것임
세번째 인자를 담을 m_dwFVF 선언후 부모에서 사용해주자
네번째 인자는 D3DPOOL_MANAGED 는 고정이라고 생각하면됨
SYSTEMMEM 시스템메모리에 올리겠다( 공간은 넓지만 느림)
DEFAULT 그래픽카드안에 꼽혀있는 V_RAM이라는 공간에 올리겠다
(속도가 빠름 공간은 협소하다) 쉐이더 연산을 할땐 무조건 Default에다가 해야함
마지막 인자는 버퍼에 접근할수있는 핸들을 던져줄까하는 인자nullptr 주면됨
공간은 할당했지만 값을 채워주지는 않았음
CreateVertexBuffer는 배열로 공간을 할당해줬다.
m_pVB의 LOCK을 호출하자
배열을 어떻게 채울것인가?
로컬스페이스의 크기를 모두 1로 하면 월드행렬의 배열을 절대 크기로 사용할수있다.
버퍼에 정점을 넣을때 반시계방향으로 넣으면 그려지지않음(눈에 보이지않음)
다이렉트 x는 기본으로 시계방향으로 그리는것만 눈에 보여줌
그림의 앞면의 점은 앞에서 봤을때 시게 방향임 (그려짐) 뒷통수는 반시계방향으로 그려짐으로 안그려진다.
보이지 않는 부분은 그리지 않아서 최적화를 수행한다.
첫번째 좌표는 -0.5,0.5,0
두번째 좌표는 0.5,0.5,0
세번째 좌표는 0,5,0.5,0 세점으로 오른쪽 위 삼각형을 그려줌
좌하단 삼각형을 그려준다.
첫번째 좌표는 -0.5,0.5,0
두번째 좌표는 0.5,-0.5,0
세번째 좌표는 -0,5,-0.5,0 세점으로 왼쪽 하단 삼각형을 그려줌
m_pVB-> UnLock을 호출해주자
이제 로컬 스페이스의 네모를 그려주는 끝이 났다.
① SetStreamSource()함수 호출 - 출력할 정점 버퍼를 디바이스의 데이터 스트림과 연결시킨다.
② SetFVF() 함수 호출 - 정점 포맷을 디바이스에 지정한다.
③ DrawPrimitive() 함수 호출 - 정점 버퍼의 정점을 활용하여 폴리곤을 그린다.
그려주는것은 VI버퍼에서 장치에서 DrawPrimitive(D3DPT_TRAIANGLELIS//정점을 3개 꺼내와라, 버텍스버퍼의 몇번째 정점부터 꺼내올까? 앞에서부터 = 0 , m_iNumPrimitive)
m_ePrimitiveType 점을 몇개씩 가져올지
m_iNumPrimitive 몇개그릴래? 우리는 2로
렌더를 하는데 어떤 버텍스버퍼를 사용하는지 넘겨주지 않음
장치의 ->SetStreamSource 장치가 사용할 소스를 정해주는 함수
(0,m_pVB//여기서 꺼내와서 그려라,0 // 가장 앞에서부터,stride(정점의 크기를 알아야 한다))
하지만 아직 장치객체가 버퍼가 어떤 변수들을 가지고있는지 모름
SetFVF를 호출해주자(인자는 아까 어떤 인자를 가지고 있는지 정의해둔것을 넘겨주자)
지금 로컬 버퍼를 그대로 가져와서 그리기때문에 말이안됨 월드 좌표로 변환해서 그려줘야 한다.
컴포넌트 매니저클래스에 VIBuffer_Rect를 추가해주자
백그라운드에도 ViBuffer_Rect 컴포넌트를 추가해주자
컴포넌트를 추가해주기 위해선 원형을 추가해줘야한다.
메인앱에서 프로토타입VI버퍼의 렉트를 추가해주자
(원형객체 만드는 작업끝)
백그라운드의 Add_Components에서 그대로 추가
버퍼클래스의 복사 생성자에서 원형멤버들을 어떻게 복제할것인지를 넘겨줘야함.
백그라운드의 렌더에서 뭔가 그리고 싶다 버퍼컴이라는 객체의 렌더 viBuffer를 호출해주자
그전에 장치의 SetTransform을 호출해주자
장치는 행렬을 3개보유할수있다. 로컬이 월드가 되기위해선 3번의 변환이 필요하다.
SetTransform(어떤 변환을 위한 행렬인지,행렬) 호출
트랜스폼 객체에 Get_WorldMatrix 함수 구현에서 위 함수의 두번째 인자로 넘겨주자
그럼 장치는 이 행렬을 계속 저장되어있게됨