【问题标题】:opengl indexed drawing issueopengl索引绘图问题
【发布时间】:2013-05-04 09:08:07
【问题描述】:

我正在尝试使用 opengl (3.0) 渲染球体。下面的算法计算顶点和相应的索引。总而言之,它工作得很好,但是,矩阵中似乎有一个小故障,因为我在球体内得到了一个丑陋的圆锥体。

vertices.resize(rings * segments * 3);
colors.resize(rings * segments * 3);
indices.resize(6 * rings * segments);

auto v = vertices.begin();
auto c = colors.begin();
auto i = indices.begin();

auto dTheta = M_PI / (f32)rings;
auto dPhi   = 2 * M_PI / (f32)segments;

for ( u32 ring = 0; ring < rings; ++ring ) {
    auto r0 = radius * sinf(ring * dTheta);
    auto y0 = radius * cosf(ring * dTheta);
    for ( u32 segment = 0; segment < segments; ++segment ) {
        auto x0 = r0 * sinf(segment * dPhi);
        auto z0 = r0 * cosf(segment * dPhi);

        *v++ = x0;  *c++ = color.r;
        *v++ = y0;  *c++ = color.g;
        *v++ = z0;  *c++ = color.b;

        if (ring < rings) {
            *i++ = ( (ring  ) * segments ) + segment;
            *i++ = ( (ring+1) * segments ) + segment;
            *i++ = ( (ring+1) * segments ) + segment + 1;
            *i++ = ( (ring+1) * segments ) + segment + 1;
            *i++ = ( (ring  ) * segments ) + segment + 1;
            *i++ = ( (ring  ) * segments ) + segment;
        }
    }
}

知道我错过了什么吗?

【问题讨论】:

  • 我认为应该是if (ring+1 &lt; rings) {,不是吗?如果这不是问题,那么您应该发布渲染代码。
  • 是的,你是对的 :) ...永远不要相信你从互联网上获取的代码 ;)

标签: c++ opengl


【解决方案1】:
*i++ = ( (ring+1) * segments ) + segment + 1;
*i++ = ( (ring+1) * segments ) + segment + 1;
*i++ = ( (ring  ) * segments ) + segment + 1;

如果segment 等于segments - 1,你会计算什么索引?是的,您从 next 段中获得一个索引。

如果 没有下一段?然后你会在你的点列表之外得到一个索引。

您的段增量需要环绕到 0:

*i++ = ( (ring+1) * segments ) + (segment + 1) % segments;
*i++ = ( (ring+1) * segments ) + (segment + 1) % segments;
*i++ = ( (ring  ) * segments ) + (segment + 1) % segments;

另外,考虑一下如果ring 等于rings - 1 会发生什么。同样的问题,但您需要不同的解决方案。您的if 声明是错误的。应该是:

if((ring + 1) < rings)

【讨论】:

  • 太棒了,第一个我自己想出来了……第二个也很好。
  • 呸,现在球体的下端有个洞:/
  • 没关系,我也知道了。 for 循环转到ring &lt;= rings,以便角度从零变为 Pi。必须更改向量以占用 ring+1 条目的空间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-16
相关资源
最近更新 更多