으로 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}
이다.
CreateVertexDeclaration(), SetVertexDeclaration() 및 관련 버텍스 셰이더 코드를 호출하는 코드를 게시 할 수 있습니까? – Asaf
@Asaf : 내놔 그 특정 부분을 찾으십시오. – Puppy