2013-05-29 2 views
3

먼저, 모든 소프트웨어 개발자에게 멋진 리소스 인 Stack Overflow를 사용하는 모든 사용자에게 감사드립니다.D3DXCreateText로 생성 된 3D 메쉬를 어떻게 채울 수 있습니까?

요즘 프로젝트 용으로 DirectShow + DirectX 9를 사용하고 있으며 D3DXCreateText() 메소드를 사용하여 3D로 텍스트를 표시하려고합니다. 이 방법은 나에게 메시, 내가 쉽게 (I가 필요로하는 세계 변환을 사용하여 변환하고, DrawSubset로 표시 할 수 있습니다) 메소드를 제공합니다

HDC hdc = CreateCompatibleDC(NULL); 
HFONT font = CreateFont(0,0,0,0,FW_NORMAL,false,false,false,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,"Calibri"); 
SelectObject(hdc, font); 

ID3DXMesh *mesh; 
D3DXCreateText(d3dDevice,hdc,"Hello World",0.001f,0.0f,&mesh,NULL,NULL); 

--------------------- Now inside beginScene() 

... 
D3DXMATRIX translation; 
D3DXMATRIX scaling; 
D3DXMatrixTranslation(&translation,0,0,1); 
D3DXMatrixScaling(&scaling,-0.1f,0.1f,0.1f); 
d3dDevice->SetTransform(D3DTS_WORLD, &(translation * scaling)); 

mesh->DrawSubset(0); 
... 

모든 괜찮을 것 같다,하지만 나는 문제가있다 : I 돈 이 메쉬를 간단한 색으로 채우는 법을 알지 못합니다. 필자는 많은 예제를 읽었으며 DirectX 9 SDK와 함께 제공된 3D Text 예제를 사용했습니다 (D3DMATERIAL9를 사용하여 채 웁니다). 그러나 작동하지 않습니다.

더 구체적으로,이 텍스트 만 화면에 채우면 밝은 흰색으로 표시됩니다 (색상을 변경할 수는 없지만 적어도 흰색 임). 나는 (내가 DirectShow를 가진 카메라에서 캡처 한 프레임을 보여주기 위해 사용하고 있습니다) 텍스처와 쿼드 렌더링 경우이 텍스처를 사용하는 것처럼 그리고, 다음 텍스트가 표시 너무! :

... 
d3dDevice->SetStreamSource(0, vertexBuffer, 0, sizeof(SCREENVERTEX)); 
d3dDevice->SetTexture(0, texture); 
// World transformations for this VertexBuffer in here 
d3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2); 
... 

수있는 당신, 제발, 이걸 도와 줘?

P .: 나는 유사한 결과를 얻기 위해 D3DXVec3Project()에서 dxDrawText() 메서드를 사용하는 방법이 있지만 깊이있는 실제 3D 텍스트가 필요하다는 것을 알고 있습니다.

--------------------------------------------- ----- 관심있는 사람을위한 솔루션 --------------------------------------- -----------

한편으로

및 @NicoSchertler는 권고로, 나는의 DrawPrimitive() 함수를 그림 후 텍스처를 null로 설정해야합니다

d3dDevice->SetTexture(0, NULL); 

이것은 텍스트 만 표시하지만 SDK 예제에 표시된 SetMaterial() 메서드를 사용하여도 메쉬를 칠할 수 없습니다. 그래서 @Gnietschow는 그것을 채울 수있는 방법으로 대답했습니다 :

d3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); 
d3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); 
d3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_CONSTANT); 
d3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_CONSTANT); 
d3dDevice->SetTextureStageState(0, D3DTSS_CONSTANT, /* D3DCOLOR HERE */); 

그리고이 작품! 그러나 다른 텍스쳐를 다시 그리기 전에 SetTextureStageState() 메소드로 정의 된 각 속성을 재설정해야합니다 (그렇게하지 않으면 이전에 텍스트 용으로 정의 된 색상이 유지됩니다).

d3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); 
d3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); 
d3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); 
d3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); 

희망이 사람에게 도움이 다시 당신의 도움 :)에 대한 너희들 감사합니다 : 이것은이 (doc)로 이루어집니다.

+0

자료를 적용하는 코드를 추가 할 수 있습니까? 이전에 텍스처를 적용한 경우 재설정해야합니다 (텍스처를 null로 설정). 조명이 있으십니까? –

+0

빠른 답변 주셔서 감사합니다 @ NicoSchertler.텍스처를 null로 설정하면 텍스트가 흰색으로 표시되지만 색상은 변경할 수 없습니다. 흠 ... 아니, 나는 내 생각에 내가 필요로하지 않는 조명을 사용하지 않는다. 요청한 코드를 추가하도록 수정하겠습니다. – SRG

답변

1

당신은 단지 하나의 색상이 필요한 경우는 텍스처 스테이지를 통해 (this question에서와 같은 방법으로)을 설정할 수 있습니다 :

d3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); 
d3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); 
d3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_CONSTANT); 
d3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_CONSTANT); 
d3dDevice->SetTextureStageState(0, D3DTSS_CONSTANT, /* YOUR COLOR */); 

복잡한 색상 또는 텍스트의 텍스처링을해야하는 경우의 FVF를 변환해야합니다 메쉬가 알맞은 데이터로 채 웁니다. D3DXCreateText (doc)은 위치와 법선이있는 메쉬를 만들지 만 색과 텍스처 좌표는 사용하지 않습니다.

+0

빠른 답변을 주신 @Gnietschow도 감사드립니다. 이것은 효과가있는 것처럼 보이지만 내 텍스처의 색상도 변경됩니다. DrawPrimitive() 메서드를 호출 한 후 (텍스처와 연관된 꼭지점 버퍼를 그립니다) "Ok, 이제 모든 것을 지우고 다른 것을 그립니다"라는 말일 수 있습니까? – SRG

+0

모든 변경 사항을 되돌릴 수있는 유일한 방법은 없습니다. 장치에는 특정 상태가 있으며,이 상태는 변경 만 가능하지만 하나의 단일 단계로 저장되거나로드되지는 않습니다. – Gnietschow

+0

흠 ... 아니, 실례합니다. 서로 다른 색과 질감을 지닌 두 개의 다른 물체를 그릴 수있는 방법이 있어야한다고 질문했습니다. 맞습니까? 어쨌든 원래 회신에서 메쉬의 FVF를 변환하는 것에 대해 말하면 새로운 정점 버퍼를 만들고 정점을 수동으로 복사한다는 의미였습니까? – SRG

관련 문제