首页
学习
活动
专区
圈层
工具
发布

造山
EN

Stack Overflow用户
提问于 2014-01-22 18:48:03
回答 1查看 81关注 0票数 1

我目前正在阅读弗兰克·D·露娜的“DirectX 10”一书。我刚遇到一种他用来渲染山峦的方法,我不太明白他为什么要用它。对于顶点缓冲区,他使用:(n和m是行和列,dx是1.0f)(getHeight将x和z放入一个类似山的函数中)

代码语言:javascript
复制
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;
            }
        }

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

代码语言:javascript
复制
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
            }
        }

如果有人能向我解释这两种缓冲区的用途,那就太好了。我只是不太清楚他为什么要用这些方程,以及这些方程是干什么用的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-22 19:46:01

在创建顶点缓冲区时,使用术语i * n + j来计算当前顶点的索引。j用于x轴上的位置.因此,如果增加j并保持i,就会到达同一行右边的顶点。索引也增加了1,如果增加i并保持j,就会到达当前顶点以下的顶点。索引由n (字段的宽度)增加。这是自然的,因为中间的顶点必须在那里。

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

代码语言:javascript
复制
\ 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

在计算索引缓冲区时使用了相同的公式。

第一个三角形是:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21291362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档