创造山脉

时间:2014-01-22 18:48:04

标签: 3d directx directx-10

我目前正在关注Frank D. Luna的DirectX 10书。我刚刚遇到了他用来渲染山脉的方法,我不太清楚我理解他为什么使用它。对于他使用的顶点缓冲区:(n和m是行和列,dx是1.0f)(getHeight将x和z放入类似山的函数中)

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;
            }
        }

然后对于他使用的索引缓冲区:

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 个答案:

答案 0 :(得分:1)

创建顶点缓冲区时,术语i * n + j用于计算当前顶点的索引。 j用于x轴上的位置。因此,如果您增加j并保持i,您将到达同一行右侧的顶点。索引也增加1.如果增加i并保持j,您将到达当前顶点下方的顶点。索引增加n(字段的宽度)。这很自然,因为它们之间的顶点必须在那里。

使用宽度n = 4,您将获得以下编号

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

您看到从行i移动到行i+1会导致索引按字段宽度增加,而从列j移到j+1会导致index增加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