2014-01-22 3 views
1

현재 Frank D. Luna의 DirectX 10 책을 팔로우하고 있습니다. 나는 산을 그리는 데 사용하는 방법을 발견했으며, 왜 그가 그것을 사용하는지 이해하지 못한다. 정점 버퍼 그가 사용 (n 및 m 행 및 열은 다음과 DX가 1.0F 인) 자신이 사용하는 색인 ​​버퍼이어서산 만들기

float dx = 1.0f; 
     float halfWidth = (n - 1)*dx*0.5f; 
     float halfDepth = (m - 1)*dx*0.5f; 
     for (DWORD i = 0; i < m; ++i) 
     { 
      float z = halfDepth - i*dx; 
      for (DWORD j = 0; j < n; ++j) 
      { 
       float x = -halfWidth + j*dx; 

       // Graph of this function looks like a mountain range. 
       float y = getHeight(x, z); 

       vertices[i*n + j].pos = D3DXVECTOR3(x, y, z); 

       // Color the vertex based on its height. 
       if (y < -10.0f) 
        vertices[i*n + j].color = BEACH_SAND; 
       else if (y < 5.0f) 
        vertices[i*n + j].color = LIGHT_YELLOW_GREEN; 
       else if (y < 12.0f) 
        vertices[i*n + j].color = DARK_YELLOW_GREEN; 
       else if (y < 20.0f) 
        vertices[i*n + j].color = DARKBROWN; 
       else 
        vertices[i*n + j].color = WHITE; 
      } 
     } 

(getHeight 산악 닮은 기능에 X 및 Z두고)

int k = 0; 
     for (DWORD i = 0; i < m - 1; ++i) 
     { 
      for (DWORD j = 0; j < n - 1; ++j) 
      { 
       indexlist[k] = i*n + j; 
       indexlist[k + 1] = i*n + j + 1; 
       indexlist[k + 2] = (i + 1)*n + j; 

       indexlist[k + 3] = (i + 1)*n + j; 
       indexlist[k + 4] = i*n + j + 1; 
       indexlist[k + 5] = (i + 1)*n + j + 1; 

       k += 6; // next quad 
      } 
     } 

누군가이 두 가지 버퍼 사용 방법을 설명하면 좋을 것입니다. 나는 왜 그가이 방정식을 사용하는지, 그리고이 방정식이 무엇을하는지 확실히 모르겠습니다.

+1

이 간단한 규칙적인 격자입니다. 인덱스 버퍼의 계산은 버퍼 내의 삼각형의 정점의 3 개의 인덱스를 계산합니다. 정확히 당신이 이해하지 못하는 것은 무엇입니까? 모든 세부 사항을 설명하는 것은 너무 많은 것입니다. 인덱스 버퍼가 일반적으로 어떻게 작동하는지 알고 있습니까? –

+0

그가 꼭지점 버퍼에서 원하는 꼭지점을 선택할 때 i * n + j를 사용하는 이유를 이해하지 못합니다. 나는 VB 나 IB에 대한 설명이 필요 없지만 그가 내부에서 사용하는 숫자를 말합니다. – user2226786

답변

1

버텍스 버퍼를 만들 때 i * n + j이라는 용어는 현재 버텍스의 인덱스를 계산하는 데 사용됩니다. j은 x 축상의 위치에 사용됩니다. 따라서 j을 증가시키고 i을 유지하면 같은 행의 오른쪽에있는 꼭지점에 도달하게됩니다. 인덱스도 1 씩 증가합니다. i을 증가시키고 j을 유지하면 현재의 버텍스 아래에 도달하게됩니다. 인덱스는 n (필드 너비)만큼 증가합니다. 그 사이의 정점이 있어야하기 때문에 자연 스럽습니다. n = 4의 폭을 사용

, 당신은 얻을 다음은 행 i에서 이동하는 j+1에 열 j에서가는 동안, 폭 ​​필드 증가되는 인덱스에 i+1 결과를 행하는 것을 볼

\ j| 0 | 1 | 2 | 3 | 
i \| | | | | 
---+----+----+----+----+ 
0 | 0 | 1 | 2 | 3 | 
1 | 4 | 5 | 6 | 7 | 
2 | 8 | 9 | 10 | 11 | 
... 

를 번호 인덱스가 1 씩 증가합니다.이 결과는 수식 j + i * n이됩니다.

동일한 수식이 인덱스 버퍼 계산에 사용됩니다.

첫 번째 삼각형은 다음과 같습니다

col j , row i  -> j + i * n 
col j + 1, row i  -> j + 1 + i * n 
col j , row i + 1 -> j + (i + 1) * n