2012-03-29 4 views
1

으로 3D 공간에 선을 그릴 때 Direct3D는 유효하지 않은 정점 선언에 대해 FVF으로 변환 할 수 없다는 오류 메시지를 표시합니다. 동일한 vertex 선언과 쉐이더/스트림 설정을 정확하게 사용하고있는 D3DPT_TRIANGLELIST 렌더링을 사용하고 있습니다.D3DPT_LINELIST를 사용하여 3D 선 렌더링

D3DPT_LINELIST을 사용하여 3D 공간에서 일부 선을 렌더링하는 방법은 무엇입니까?

여기 내 원시 그리기 호출입니다.

D3DCALL(device->SetVertexDeclaration(VertexDecl)); 
D3DCALL(device->SetStreamSource(1, PerBoneBuffer.get(), 0, sizeof(PerInstanceData))); 
D3DCALL(device->SetStreamSourceFreq(1, D3DSTREAMSOURCE_INSTANCEDATA | 1)); 
D3DCALL(device->SetStreamSource(0, LineVerts, 0, sizeof(D3DXVECTOR3))); 
D3DCALL(device->SetStreamSourceFreq(0, D3DSTREAMSOURCE_INDEXEDDATA | lines.size())); 
D3DCALL(device->SetIndices(LineIndices)); 
PerInstanceData* data; 
std::vector<Wide::Render::Line*> lines_vec(lines.begin(), lines.end()); 
D3DCALL(PerBoneBuffer->Lock(0, lines.size() * sizeof(PerInstanceData), reinterpret_cast<void**>(&data), D3DLOCK_DISCARD)); 
std::for_each(lines.begin(), lines.end(), [&](Wide::Render::Line* ptr) { 
    data->Color = D3DXColor(ptr->Colour); 
    D3DXMATRIXA16 Translate, Scale, Rotate; 
    D3DXMatrixTranslation(&Translate, ptr->Start.x, ptr->Start.y, ptr->Start.z); 
    D3DXMatrixScaling(&Scale, ptr->Scale, 1, 1); 
    D3DXMatrixRotationQuaternion(&Rotate, &D3DQuaternion(ptr->Rotation)); 
    data->World = Scale * Rotate * Translate; 
}); 
D3DCALL(PerBoneBuffer->Unlock()); 
D3DCALL(device->DrawIndexedPrimitive(D3DPRIMITIVETYPE::D3DPT_LINELIST, 0, 0, 2, 0, 1)); 

여기 내 정점 선언이다 :

D3DVERTEXELEMENT9 BasicMeshVertices[] = { 
    {0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0}, 
    {1, 0, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0}, 
    {1, 16, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 1}, 
    {1, 32, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 2}, 
    {1, 48, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 3}, 
    {1, 64, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0}, 
    D3DDECL_END() 
}; 
D3DCALL(Device->CreateVertexDeclaration(
    BasicMeshVertices, 
    PointerToPointer(BasicMeshVertexDecl) 
)); 

LineIndices 그냥 0, 1하며 LineVerts는 X 축을 따라 단위 3D 라인을 표현하기 위해, 단지 {0,0,0}{1,0,0}이다.

+0

CreateVertexDeclaration(), SetVertexDeclaration() 및 관련 버텍스 셰이더 코드를 호출하는 코드를 게시 할 수 있습니까? – Asaf

+0

@Asaf : 내놔 그 특정 부분을 찾으십시오. – Puppy

답변

2

사실, 버텍스 쉐이더를 사용하고 있는지 확실하지 않습니다. 코드를 볼 수 없었습니다 - 고정 된 파이프 라인입니까?). 삼각형과 라인리스트의 차이점은 무엇인지 모르겠지만, 당신이 얻는 오류는 꼭지점 선언을 이전 FVF로 변환 할 수 없다는 것을 의미합니다. here에서

(페이지 177 - 5.8.1 : 고정 기능의 선언은) :

정점 선언으로 고정 된 기능 파이프 라인 Fi를를 사용하여, 적절한 정점의 구성 요소는 각각 특정 사용에 매핑해야합니다 . 다중 스트림을 사용할 수 있지만 꼭지점은 5.7 절에 설명 된 FVF 코드의 순서 및 유형 제약 조건을 준수해야합니다.

5.7 절에서

: 정점 성분을 표에 나열된 정점 요소와 동일한 순서로 메모리에 뻗어있다

은 상기 위치 요소에서 시작.

표는 단순히 헤더 파일의 D3DFVF_* 상수 목록입니다.

그래서 귀하의 경우 - 색 구성 요소를 PerInstanceData (스트림 1) 구조체의 텍스 코드 구성 요소보다 먼저 이동하십시오.

+0

실제로 셰이더를 사용하고 있습니다 ... 그러나 올바르게 지적 했으므로 드로잉 할 때 장치에 설정되어 있지 않습니다. 이는 아마도 문제의 실수 일 것입니다. 그것을 테스트하기 위해 몇 시간을 줘 봐라. 나는 다시보고 할 것이다. – Puppy