0

私はこれを必要とする: 必要なシリンダー

そして、私はこれを使用する必要がglDrawElementsあります: glEnable(GL_CULL_FACE).

私が試したこと:

...

glm::vec3   CMyApp::GetCylinderUV(float u, float v)
{
    u *= 2* 3.1415f;
    float r = 1;

    return glm::vec3(r * cosf(u), 2 * v, r * sinf(u));
}

...

glEnable(GL_CULL_FACE);

...

Vertex vert[(N+1)*(M+1)];
for (int i=0; i<=N; ++i)
    for (int j=0; j<=M; ++j)
    {
        float u = i/(float)N;
        float v = j/(float)M;

        vert[i + j*(N + 1)].p = GetCylinderUV(u, v);
        vert[i + j*(N+1)].c = glm::normalize( vert[i + j*(N+1)].p );
    }

...

GLushort indices[3*2*(N)*(M)];
for (int i=0; i<N; ++i)
    for (int j=0; j<M; ++j)
    {
        //      (i,j+1)
        //        o-----o(i+1,j+1)
        //        |\    |           a = p(u_i, v_i)
        //        | \   |           b = p(u_{i+1}, v_i)
        //        |  \  |           c = p(u_i, v_{i+1})
        //        |   \ |           d = p(u_{i+1}, v_{i+1})
        //        |    \|
        //  (i,j) o-----o(i+1, j)
        indices[6*i + j*3*2*(N) + 0] = (i)      + (j)*  (N+1);
        indices[6*i + j*3*2*(N) + 1] = (i+1)    + (j)*  (N+1);
        indices[6*i + j*3*2*(N) + 2] = (i)      + (j+1)*(N+1);
        indices[6*i + j*3*2*(N) + 3] = (i+1)    + (j)*  (N+1);
        indices[6*i + j*3*2*(N) + 4] = (i+1)    + (j+1)*(N+1);
        indices[6*i + j*3*2*(N) + 5] = (i)      + (j+1)*(N+1);
    }

glDrawElements( GL_TRIANGLES,
                3*2*(N)*(M),
                GL_UNSIGNED_SHORT,
                0);

そして悪い結果: 不良シリンダー

しかし、 delete で修正できますがglEnable(GL_CULL_FACE);、それを使用する必要があります。

4

2 に答える 2

2

ジオメトリの現状では、2 つの描画パスを使用してこれを行うことができます (および を保持しますglEnable(GL_CULL_FACE))。

  • Pass1 - でレンダリングしglFrontFace(GL_BACK)ます。これにより、チューブの「背面」部分がレンダリングされます
  • Pass2 - でレンダリングしglFrontFace(GL_FRONT)ます。これにより、チューブの「前」部分がレンダリングされます。

お役に立てれば!

于 2015-04-17T18:14:40.047 に答える
0

最後に、私の質問に対する答えを見つけました:

  • GetCylinderUVで u: を否定しましたu *= -2 * 3.1415f;。側面を裏返しにするために必要です。
于 2015-04-17T21:41:49.967 に答える