문제

나는 DirectX를 완전히 처음 접했고 가장 기본적인 Direct3D 구성 (학습 목적)으로 변형되지 않은 프리미티브를 그려고 싶습니다. 나는 이미 변환 된 정점이있는 몇 가지 프리미티브를 그렸습니다. 그것은 d3dfvf_xyzrhw 플래그 세트가있는 정점입니다.

이제는 변환되지 않은 정점으로 동일한 출력을 얻으려고 노력하지만 화면에 비주얼이 없습니다. FVF를 변경하고 정점을 조정했지만 아직 변환 행렬 (World, View, Projection)을 설정하지 않았습니다. 그 행렬을 설정해야합니까? 나는 매트릭스가 설정되지 않았을 때 변환 된 정점과 마찬가지로 모든 것이 작동한다고 가정하지만 분명히 그렇지 않습니다.

기본적으로 어떤 지역 (세계 좌표)이 보입니다. 작동하기 위해 무엇을해야합니까?

이것은 기본적으로 내가하는 일입니다.

struct Vertex
{
    float x, y, z;
    D3DCOLOR color;

    static const DWORD format = D3DFVF_XYZ | D3DFVF_DIFFUSE;
};


const Vertex vertices[] =  {
                           {0.0f, 0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)},
                           {0.8f, -0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)},
                           {-0.8f, -0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)}
                           };


pd3dDevice->CreateVertexBuffer(sizeof(vertices), 0, Vertex::format, D3DPOOL_DEFAULT, &pVB, NULL);

VOID* vertexData = 0;
pVB->Lock(0, sizeof(vertices), &vertexData, 0);
memcpy(vertexData, vertices, sizeof(vertices));
pVB->Unlock();



D3DMATRIX matrixIdentitiy;
ZeroMemory(&matrixIdentitiy, sizeof(matrixIdentitiy));
matrixIdentitiy._11 = 1.0f;
matrixIdentitiy._22 = 1.0f;
matrixIdentitiy._33 = 1.0f;
matrixIdentitiy._44 = 1.0f;

pd3dDevice->SetTransform(D3DTS_WORLD, &matrixIdentitiy);
pd3dDevice->SetTransform(D3DTS_VIEW, &matrixIdentitiy);
pd3dDevice->SetTransform(D3DTS_PROJECTION, &matrixIdentitiy);



pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 0.0f, 0);
pd3dDevice->BeginScene();

pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
pd3dDevice->SetRenderState(D3DRS_CLIPPING, FALSE);
pd3dDevice->SetRenderState( D3DRS_ZFUNC, D3DCMP_ALWAYS );

pd3dDevice->SetStreamSource(0, pVB, 0, sizeof(Vertex));
pd3dDevice->SetFVF(Vertex::format);
pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);

pd3dDevice->EndScene();
pd3dDevice->Present(NULL, NULL, NULL, NULL);

미리 감사드립니다!

편집 : 이제 나는 그것을 얻었고, 조명은 활성화되었고, 어리석은 초보자의 실수. 어쨌든 도와 주셔서 감사합니다!

도움이 되었습니까?

해결책

글쎄, 당신이 당신의 세상을 설정한다면, 시야와 투영 행렬을 정체성에 맞추는 것은 당신이 얻을 수있는 것은 간단한 패스입니다.

X의 범위는 -1에서 1입니다
Y의 범위는 -1에서 1입니다
z는 0에서 1 사이입니다 (이 비트는 문제를 일으킬 수 있습니다).

그런 다음 표준 변환되지 않은 구절을 정의하고 해당 범위 내부로 전달하면 화면에 표시됩니다.

그것이 코드를 게시하는 데 도움이되지 않으면 내가 제안 할 수있는 것을 볼 것입니다.

편집 : z- 버퍼링을 활성화 했습니까? Z- 버퍼를 지우지 않아 이상한 문제가 발생할 수 있기 때문입니다. 모든 것이 이것 뒤에 렌더링되므로 결코 렌더링하지 않을 것입니다.

세트

pd3dDevice->SetRenderState( D3DRS_ZFUNC, D3DCMP_ALWAYS );

또는

pd3dDevice->SetRenderState( D3DRS_ZENABLE, D3DZB_FALSE );

이 가설을 테스트합니다.

또한 Pix를 사용하는 방법을 배우고 장면을 통과 할 때 삼각형에 어떤 일이 발생하는지 알 수 있습니다.

edit2 :

당신의 문제가 조명에서 나올 가능성이 있습니다. 조명을 끄십시오

pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );

또한 명확하게 변경하십시오.

pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255, 255, 255), 0.0f, 0);

폴리가 검은 색을 렌더링하고 있는지 확인하십시오.

다른 팁

이것은 기본적으로 내가하는 일입니다.

struct Vertex
{
    float x, y, z;
    D3DCOLOR color;

    static const DWORD format = D3DFVF_XYZ | D3DFVF_DIFFUSE;
};


const Vertex vertices[] =  {
                           {0.0f, 0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)},
                           {0.8f, -0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)},
                           {-0.8f, -0.8f, 0.5f, D3DCOLOR_XRGB(255, 255, 255)}
                           };


pd3dDevice->CreateVertexBuffer(sizeof(vertices), 0, Vertex::format, D3DPOOL_DEFAULT, &pVB, NULL);

VOID* vertexData = 0;
pVB->Lock(0, sizeof(vertices), &vertexData, 0);
memcpy(vertexData, vertices, sizeof(vertices));
pVB->Unlock();



D3DMATRIX matrixIdentitiy;
ZeroMemory(&matrixIdentitiy, sizeof(matrixIdentitiy));
matrixIdentitiy._11 = 1.0f;
matrixIdentitiy._22 = 1.0f;
matrixIdentitiy._33 = 1.0f;
matrixIdentitiy._44 = 1.0f;

pd3dDevice->SetTransform(D3DTS_WORLD, &matrixIdentitiy);
pd3dDevice->SetTransform(D3DTS_VIEW, &matrixIdentitiy);
pd3dDevice->SetTransform(D3DTS_PROJECTION, &matrixIdentitiy);



pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 0.0f, 0);
pd3dDevice->BeginScene();

pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
pd3dDevice->SetRenderState(D3DRS_CLIPPING, FALSE);

pd3dDevice->SetStreamSource(0, pVB, 0, sizeof(Vertex));
pd3dDevice->SetFVF(Vertex::format);
pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);

pd3dDevice->EndScene();
pd3dDevice->Present(NULL, NULL, NULL, NULL);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top