메쉬하나 불러와서 띄워봤는데 평소엔 잘작동하던 깊이버퍼가 작동않하는겁니다..멍미;;
프로그래밍하면서 이렇게 길게 하나가지고 끌어본적이업... 간단한걸수록 한번 헤메면 답이않서더라구요.
그리하려 깊이버퍼 (z버퍼 혹은w버퍼) 작동않할때의 대처법들에 대해서 나열해보겠습니다.

일단 D3D프로그래밍을 배울땐 DIRECT_DEBUG 플래그를 켜두는게 좋습니다.
이것은 다이렉트 유틸에 보시면 옵션설정하는 부분가시면 됩니다.
이 플래그를 켜두면 다이렉트라이브러리를 이용하여 디버깅을 시도할때
출력창에 여러 디버그 정보들을 출력해주어서 디버깅시 좋습니다.

자 그럼 일단 D3DDEVICE메서드로 Z버퍼를 활성화시켜줍니다. 그래도 않뜬다.. 출력창을 한번보죠

Direct3D9: (ERROR) :************************************************************
Direct3D9: (ERROR) :ASSERTION FAILED! File d:\vista_rtm\multimedia\directx\dxg\d3d9\fe\d3dbase.cpp Line 6664: !bDoZClear || ((dvZ>=0.0) && (dvZ<=1.0))
Direct3D9: (ERROR) :************************************************************

이런 메세지가 뜬다면 이것은 D3DDEVICE::Clear 메서드 상에서 5번째인자의 z값을 주는부분을
0~1.0 사이로 넣지않았을때 발생합니다.

자 Clear의 z범위를 제대로 줬음에도 않나오거나 위의 D3D9에러가 않뜬다..
그럼 남은 한가지는 프로젝션행렬설정을 잘못해줬을때 생길수있습니다.


여기에서 D3DXMatrixPerspectiveFovLH 함수의 인자값을 잘못넣어 줬을때 발생할수있습니다.
그것에 관한 해답은 밑에 제가 gpg에 질문 해놓은게 있으니 밑의 링크를 타고 참고해보시길~

http://www.gpgstudy.com/forum/viewtopic.php?topic=23982
Posted by 랜스.

Leave your greetings here.

  1. Comment RSS : http://lancekun.com/tc/rss/comment/116
  2. 매못찌ㅠ 2009/08/18 04:05  Modify/Delete  Reply  Address

    매핑강좌해줘ㅠ
    랜스는 자웅동체ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ



버텍스 버퍼(Vertex Buffer)란 ?
 우리가 Direct3D를 사용하면서 가장 많이 그리고 자주 쓰게될 인터페이스라고 생각하면된다.
만약 엔진이나 라이브러리에서 모델을 불러 띄어놔놓고 않쓴다고 하면 그것은 내부적으로 버텍스버퍼가있는것이다ㄱ-;
 정점을 저장해서 그릴려면 물론 인덱스버퍼사용시에도 버텍스버퍼는 필요하므로 무조건 버텍스버퍼가 필요하기 때문이다!!
 한마디로 요약해서 정점의 정보를 저장해두는 버퍼 정도로 알아두면 될것이다.

 
버텍스 버퍼를 사용하는 과정
 버텍스버퍼를 사용하는 과정은 간단하게 몇가지 단계로 나눌수있다.

1. 버텍스버퍼의 생성
  IDirect3DDevice9::CreateVertexBuffer 메서드를 통하여 버텍스 버퍼를 생성한다.
(파라미터밑 리턴값은 위의 메서드명을 클릭해서 참조하도록 ,MSDN)
 생성시엔 동적버퍼 와 정적버퍼로 생성하는것중 고를수있으니 MSDN을 참고해보면서
자신의 경우엔 어떤 방식의 버퍼를 적용하는게 좋은지 생각해서 적용해보길 바란다.
(보통 변화가많은 파티클시스템에서 동적버퍼를 지형이나 오브젝트같은경우엔 정적버퍼를 사용한다.)

2. 버텍스버퍼의 데이터 채워넣기
- 일단 버텍스 버퍼에 접근하기 위해선IDirect3DVertexBuffer9::Lock 메서드를 호출해주어서
버텍스버퍼의 메모리에대한 독점권과 동시에 버텍스버퍼의 포인터를 얻어온다.
- 그후 얻어온 포인터를 이용해서 데이터를 복사,혹은 삽입
- 삽입후에는IDirect3DVertexBuffer9::Unlock 메서드를 호출해주어서  버텍스버퍼에 대한
독점권을 해제해준다.

3. 버텍스버퍼의 데이터로 정점그리기
 버텍스 버퍼의 데이터로 정점을 그리는것은 매우 간단하다.
(1) IDirect3DDevice9::SetStreamSource 메서드를 호출해서 정점을 그리는데 사용할 버텍스버퍼와
연결한다.
(2) IDirect3DDevice9::SetFVF 메서드를 호출해서 그리게 될 정점의 포맷을 설정한다.
(3) 대망의 마지막 그려주는 과정IDirect3DDevice9::DrawPrimitive 메서드를 호출해서
정점들을 그려준다.

4. 버텍스 소멸시켜주기
 위에서 만들었던 버텍스버퍼가 더이상 사용되지않을때 (프로그램종료시라던지)
우리는 ->Release 메서드를 이용해서 만들어주었던 버텍스버퍼를 소멸시켜준다.


[##_kaAmo_##]
PS.. 잡설인데 요즘 학원에서 D3D를 진도를 나가는데 예전에 혼자 독학했을때보다 심도있게 나가서 그냥 공부하면서 몇몇가지들을 적어두어 다른분들이 참고하실때 도움이 되고자합니다...Orz
 그나저나 글쓰다가 실수로 한번 날려먹었었다는... 흑흑 ㅠㅠ

Posted by 랜스.

Leave your greetings here.

  1. Comment RSS : http://lancekun.com/tc/rss/comment/111
  2. 그라파 2009/07/30 17:55  Modify/Delete  Reply  Address

    좋은 정보 감사합니다. 퍼갈께요^^( 출처도 꼭 적겠습니다.)

  3. 체육복萌!! 2010/12/28 09:12  Modify/Delete  Reply  Address

    sprite와 vertex buffer 의 차이는 뭘까요?
    (2D 와 3D라는 차이점 빼고)



 쉐이더까지 순차적으로 이렇게 자세히 진행되는 예제는 처음보는듯?
학원에서 요즘 D3D 공부해서 다시 D3D잡고 공부하는데 열심히 배워뒀던 수학적개념들
8:45 하늘나라로?? 다시 빡신 공부를 시작해야겠다...
 쉐이더도 오랜만에 깔짝깔짝~
[##_kaAmo_##]
Posted by 랜스.

Leave your greetings here.

사용자 삽입 이미지
Direct객체를 잘 생성하다가 풀스크린모드로 한번 켜보고 싶어서 풀스크린 모드로 켜보니 바로 밑에와 같은결과가 발생하며 프로그램이 종료되었다.
사용자 삽입 이미지
그리고 알아보니 D3DPRESENT_PARAMETERS 의 멤버변수중 BackBufferFormat 이라는분이
D3DFMT_UNKNOWN으로 설정되있으면 풀스크린시에 에러가 발생할수있다는 것이다.
사용자 삽입 이미지
이렇게 수정해주면 풀스크린으로 아주 잘뜬다.....쿄쿄
[##_kaAmo_##]
Posted by 랜스.

Leave your greetings here.

스프라이트툴을 제작하고 저만의 스프라이트 커스텀 포맷형식을 만들었었습니다.
그런고로 스프라이트를 사용할 프로그램에서 이 형식을 불러오는게 중요한데
API상에선 불러오는것에 대해서 성공하였습니다만 Direct상에선 조금 난관을 겪었었는데요.
정보 빈약국 한국의 멋진 모습입니다. -ㅇ-;;;;; 네이버검색 구글검색 않뜹니다 떠도 이상하게 떠요
잘않된다는거죠

함수원형
HRESULT WINAPI
    D3DXCreateTextureFromFileInMemory(
        LPDIRECT3DDEVICE9             pDevice,
        LPCVOID                              pSrcData,
        UINT                                    SrcDataSize,
        LPDIRECT3DTEXTURE9 *       ppTexture);

이것이 이 함수의 원형입니다.

pDevice : DIRECT3DDEVICE9의 포인터를 넘기면 됩니다.
pSrcData : 읽기를 할 버퍼의 포인터형을 넘기면 됩니다.
ScrDataSize : 읽어올 데이터의 크기를 넘기면됩니다.
ppTexture : 텍스쳐를 불러와 저장할 텍스쳐의 포인터를 넘기면됩니다.


사용예

이렇게 사용하는것이이렇게 사용하는것과 같은효과를 나타냅니다.

고로 스프라이트 파일제작한후 불러와서 잘 실행됩니다!!!
[##_kaAmo_##]
Posted by 랜스.

Leave your greetings here.

  1. Comment RSS : http://lancekun.com/tc/rss/comment/9
  2. 숭악 2009/11/01 23:33  Modify/Delete  Reply  Address

    잘보고 갑니다. 수정할 부분이 한군데 있어서 적고갈게요..
    D3DXCreateTextureFromFileInMemory를 쓰기 전에
    fseek( fp, 0, SEEK_SET );
    을 사용하여 파일포인터의 위치를 초기위치로 돌려놔야 되더군요..