我目前正在阅读弗兰克·D·露娜的“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
}
}如果有人能向我解释这两种缓冲区的用途,那就太好了。我只是不太清楚他为什么要用这些方程,以及这些方程是干什么用的。
发布于 2014-01-22 19:46:01
在创建顶点缓冲区时,使用术语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会导致索引增加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) * nhttps://stackoverflow.com/questions/21291362
复制相似问题