2014-09-27 2 views
1

저는 DirectX를 처음 접했고 API 기능에 대한 이해를 시작했습니다.DirectX9 C++ 실시간으로 버텍스 데이터 다시 그리기

을 정점 초기화 :

나는 삼각형이 보여주는 이러한 기능을 사용하여 제대로 렌더링 얻을 관리했습니다 여기

void Menu::InitializeMenu(float x, float y, float width, float height, D3DCOLOR color, IDirect3DDevice9* d3dDevice) 
{ 
CUSTOMVERTEX vertices[] = 
{ 
    { x, y, 0.5f, 1.0f, color }, 
    { x + width, y, 0.5f, 1.0f, color }, 
    { x + width, y + height, 0.5f, 1.0f, color }, 

    { x, y, 0.5f, 1.0f, color }, 
    { x , y + height, 0.5f, 1.0f, color }, 
    { x + width, y + height, 0.5f, 1.0f, color }, 
}; 

if (FAILED(d3dDevice->CreateVertexBuffer(6 * sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &m_vertexBuffer, NULL))) 
    return; 

void *locked_buffer; 
if (FAILED(m_vertexBuffer->Lock(0, sizeof(vertices), (void **)&locked_buffer, 0))) 
    return; 



memcpy(locked_buffer, vertices, sizeof(vertices)); 
m_vertexBuffer->Unlock(); 
} 

모든 것은 메뉴 클래스 내에서 정의된다.

그리기 : 내가 다시 반투명 쿼드을 생산 렌더링 내 두 개의 삼각형을 완벽하게 얻을 작품

void Menu::RenderMenu(IDirect3DDevice9 *d3dDevice) 
{ 
d3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE); 
d3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); 
d3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); 
d3dDevice->SetRenderState(D3DRS_SRCBLENDALPHA, D3DRS_DESTBLENDALPHA); 
d3dDevice->SetStreamSource(0, m_vertexBuffer, 0, sizeof(CUSTOMVERTEX)); 
d3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX); 
d3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2); 
} 

다.

이제 문제 : 나는 프로그램이 (모든 것이 이미 초기화 적어도 한 번 렌더링 된) 렌더링 시작된 후 내 삼각형의 정점의 색상을 변경할 수 있어야합니다. 내가 생각했습니다

것 : 다른 색으로 정점을 초기화하기 위해 서로 다른 매개 변수를 사용하여 InitializeMenu 함수를 호출에 대해 나 빨리 생각, 이유는 나는 그것이 매우 비효율적 인 것 같습니다하지 때문입니다하지 않은 실용적인.

-Materials : 자료를 구현하지 않았습니다. 이는 (아직) 어떻게 알지 못하기 때문에, 그리고 더 간단한 대안을 찾기를 희망하기 때문입니다. 필요한 것은 정점 색상입니다. 이것을 달성 할 수있는 유일한 방법이 재료라면, 구현할 것입니다.

- 셰이더 : 셰이더로 버텍스를 색칠 할 수 있다고 생각하지만, 셰이더 경험이 거의 없으며 이전에 설명한 것처럼 간단한 대안을 찾고 싶습니다. 네, 셰이더가 단순하다는 것을 알고 있습니다. 셰이더의 버텍스 색상을 실시간으로 변경할 수있는 지점까지 도달했습니다. 그것은 GLSL에 있었지만 너무 많이 다르지 않을 것이라고 확신합니다. 여러 개의 쿼드 (ea 쿼드에 2 개의 삼각형 컬렉션)를 추가하려고 할 때 문제가 발생합니다. 버텍스 쉐이더에 들어오는 모든 버텍스의 색상을 변경하는 방법 만 알고 있습니다. 이전처럼 셰이더 만 수행하는 유일한 방법이라면 구현하겠습니다. 제게 올바른 방향으로 가르쳐주십시오. 셰이더가 낮은 레벨에서 작동하는 방법에 대해 거의 이해하지 못했습니다 (개념과 흐름을 이해하고 효과적으로 사용하는 방법을 사용하는 방법을 모르겠습니다).

- 연구 : 어디서나 보았습니다. 질문을 제대로하지는 못했지만 어딘가에서 답을 찾을 수 없습니다.

사실 이것은 처음으로 질문을 게시 한 사람입니다. 일반적으로 누군가 내 질문에 답했습니다. 가능한 한 최선을 다해 문제를 설명하려고 시도했지만 더 많은 코드 또는 정보를 요청하는 것이 여전히 불명확 한 경우

P .: Windows 8 바탕 화면을 사용하고 있습니다. 실제로 중요한지 확실하지 않습니다.

+0

당신이 의미하는 바는 그려진 각 삼각형이 고유 한 색으로 그려져 있다는 것입니까? 삼각형의 각 줄마다 다른 색을 사용하려고합니까? – Juniar

답변

0

정점을 업데이트하려면 CreateVertexBuffer를 다시 호출하지 않고 InitializeMenu와 비슷한 작업을 수행해야합니다. 또한 정점 버퍼를 만드는 방법을 약간 수정해야합니다.

정적 버퍼와 동적 버퍼의 두 가지 유형의 버퍼가 있습니다. 정적 정점 버퍼는 CPU에 의한 액세스를 허용하지 않지만 동적 정점 버퍼는 변경을 허용합니다.

void Menu::ChangeColor(D3DColor color) { 
    CUSTOMVERTEX *locked_buffer; 
    if (FAILED(m_vertexBuffer->Lock(0, 0, (void **)&locked_buffer, 0))) { 
     return; 
    } 

    for (int i=0; i<6; i++) { 
     // use whatever you called color in your CUSTOMVERTEX struct 
     locked_buffer[i].color = color; 
    } 
    m_vertexBuffer->Unlock(); 
} 

이 코드는 본질적으로 정점 데이터를 가져옵니다이 색상을 변경하려면

d3dDevice->CreateVertexBuffer(6 * sizeof(CUSTOMVERTEX), D3DUSAGE_DYNAMIC, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &m_vertexBuffer, NULL) 

그런 다음 새로운 기능을 만들 수 있습니다

는 CreateVertexBuffer에 D3DUSAGE_DYNAMIC를 추가, 동적 버텍스 버퍼를 만들려면 GPU에서 업데이트하고 CPU에서 업데이트 할 수 있습니다. 꼭지점 버퍼를 다시 만들 필요는 없습니다. 원하는 값만 업데이트하면됩니다.

+0

효과가 있지만 효과적입니다. 그것은 단순함으로 그것을 보상 해줍니다, 감사합니다. 지금 내가 가진 또 다른 질문은 내가 실제로 그것을 시도하지 않았기 때문에 대답하지 말고 자유롭게 느낀다.하지만 브레인 스토밍을 할 때 나는 그것에 대한 해결책을 제시한다. 기본적으로 정점 버퍼에 4 개의 다른 삼각형이 있으면 어떻게 삼각형의 색을 개별적으로 변경합니까? 제 아이디어는 인덱스 버퍼입니까, 아니면 오프셋입니까? 나는이 개념에 너무 익숙하지 않다. 그래서 나는 전에 손에서 묻고있다. 도움을 주셔서 감사합니다 – KevinDev

+0

동시에 4 개의 삼각형을 모두 그리시겠습니까, 아니면 1 개만 그리시겠습니까? 어느 방법 으로든 색상을 업데이트하면 위에서 설명한 것과 동일하게 작동합니다. 업데이트하려는 정점에서 시작하고 끝나도록 루프를 조정하면됩니다. 또는 버퍼에 많은 버텍스가 있고 작은 하위 집합 만 업데이트하려는 경우 처음 두 매개 변수를 잠금으로 변경하여 오프셋에서 시작하여 특정 크기 만 가져올 수 있습니다.하지만 이는 실제로 중요한 것입니다. 많은 정점들. 귀하의 경우에는 전체 정점 버퍼를 잠그는 것이 좋습니다. – megadan

+0

감사합니다. 완벽하게 작동합니다. – KevinDev

0

임의의 함수를 정의한 다음 녹색, 파랑, 노랑, 빨강, 보라색 등의 색상 요소를 배열에 추가 할 수 있습니다. 그런 다음 랜덤 함수를 호출하여 배열 내부의 색상을 임의로 선택합니다. 이와 같이

:

INT의 도착 [15] = {10, 210, 140, 180, 250, 189, 183, 107, 183, 107, 60, 2, 55, 85, 48};

D3DCOLOR color1; D3DCOLOR color2; D3DCOLOR color3; D3DCOLOR color4; 

srand(time(NULL)); 
CUSTOMVERTEX vertices[] = 
{{ x, y, 0.5f, 1.0f, color = D3DCOLOR_XRGB(arr[rand() % 14 + 0], arr[rand() % 14 + 0], arr[rand() % 14 + 0])}, 
{ x + width, y, 0.5f, 1.0f, color = D3DCOLOR_XRGB(arr[rand() % 14 + 0], arr[rand() % 14 + 0], arr[rand() % 14 + 0])}, 
{ x + width, y + height, 0.5f, 1.0f, color = D3DCOLOR_XRGB(arr[rand() % 14 + 0], arr[rand() % 14 + 0], arr[rand() % 14 + 0])}, 

{ x, y, 0.5f, 1.0f, color = D3DCOLOR_XRGB(arr[rand() % 14 + 0], arr[rand() % 14 + 0], arr[rand() % 14 + 0])}, 
{ x , y + height, 0.5f, 1.0f, color = D3DCOLOR_XRGB(arr[rand() % 14 + 0], arr[rand() % 14 + 0], arr[rand() % 14 + 0])}, 
{ x + width, y + height, 0.5f, 1.0f, color = D3DCOLOR_XRGB(arr[rand() % 14 + 0], arr[rand() % 14 + 0], arr[rand() % 14 + 0])}, 
}; 

한 가지, 다른 D3DCOLOR 색상 변수를 사용해야 할 수 있습니다. 역 참조 및 값 덮어 쓰기를 피하기 위해 color1, color2, color3 등이 있습니다.

+0

답변 해 주셔서 감사합니다. 불행히도, 이것은 내가 원하는 것을 정확하게 아닙니다. 초기화에서 색상을 변경하는 방법을 알고 있습니다. 내 프로그램을 편집 한 후에 어떻게 변경해야하는지 알 수없는 시점에 갇혔다. – KevinDev

관련 문제