0

現在、コードで何か奇妙なことが起こっています。私はこれをBlackBerryPlaybookで実行しており、OpenGLES1.1です。

編集4:質問を簡略化するために、投稿したものをすべて削除しました。

コードを取得して、2つの重なり合う三角形を描画するように簡略化しました。座標を含む配列と色を含む配列は次のとおりです。

GLfloat vertices[] =
{
          // front
           175.0f, 200.0f, -24.0f,
           225.0f, 200.0f, -24.0f,
           225.0f, 250.0f, -24.0f,

          // back
           200.0f, 200.0f, -25.0f,
           250.0f, 200.0f, -25.0f,
           250.0f, 250.0f, -25.0f
};


static const GLfloat colors[] =
{
       /* front  */  1.0f,0.0f,0.0f,1.0f,1.0f,0.0f,0.0f,1.0f,1.0f,0.0f,0.0f,1.0f, //Red
       /* back  */  0.0f,1.0f,0.0f,1.0f,0.0f,1.0f,0.0f,1.0f,0.0f,1.0f,0.0f,1.0f //Green
};

私の座標は、x方向が0から1024、y方向が0から600、z方向が0から-10000であることに注意してください。

これを反映したセットアップコードは次のとおりです。

    glClearDepthf(1.0f);
    glClearColor(1.0f,1.0f,1.0f,1.0f);
    glEnable(GL_DEPTH_TEST);
    glDepthMask(GL_TRUE);
    glShadeModel(GL_SMOOTH);

    glViewport(0, 0, surface_width, surface_height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    glOrthof(0, surface_width, 0, surface_height, 0, 10000);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glEnable(GL_DEPTH_TEST);
    glDepthMask(GL_TRUE);

特定のマトリックスモードが選択されているときに使用される可能性を排除しようとしていたため、2か所で深度を有効にしています。

最後に、私のレンダリングコードを示します。

void render()
{
    //Typical render pass
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, vertices);

    glEnableClientState(GL_COLOR_ARRAY);
    glColorPointer(4, GL_FLOAT, 0, colors);

    glDrawArrays(GL_TRIANGLES, 0 , 6);

    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_COLOR_ARRAY);

    //Use utility code to update the screen
    bbutil_swap();
}

問題は、私が何をしても、緑色の三角形が常に赤色の三角形の上に重なることです。どちらの方法でもz値を変更しても、完成した画像には影響しません。私はこれを理解することはできません。

4

2 に答える 2

5

デフォルトでは、深度テストは無効になっています。glEnable(GL_DEPTH_TEST)で有効にする必要があります。カリングを有効にしたときに機能する理由は、後ろ向きの三角形が描画されておらず、立方体が凸多面体であるため、前向きのクワッドが別の前向きのクワッドと重なることはないためです。ただし、2番目の立方体をレンダリングしようとすると、深度テストを有効にしない限り、深度の問題も発生します。

于 2012-11-13T05:42:19.463 に答える
5

私はついにそれを機能させました。問題は、提供された、私が使用したEGLセットアップコードにありました。bbutil.c(私の場合は.cpp)には、次のコードがあります。

if(!eglChooseConfig(egl_disp, attrib_list, &egl_conf, 1, &num_configs)) {
        bbutil_terminate();
        return EXIT_FAILURE;
    }

(これはファイル内のすべてのコードではありませんが、重要な部分です)

指定された属性リストがサポートされていない場合、これは基本的に異常です。ファイルの上位にあるattrib_listは、次のように設定されています。

EGLint attrib_list[]= { EGL_RED_SIZE,        8,
                        EGL_GREEN_SIZE,      8,
                        EGL_BLUE_SIZE,       8,
                        EGL_SURFACE_TYPE,    EGL_WINDOW_BIT,
                        EGL_RENDERABLE_TYPE, 0,
                        EGL_NONE};

デプスバッファが指定されていません。EGL仕様を見ると、デフォルトでは深度がないことがわかります。ビンゴ、それが問題です。だから私はそれを次のように変更しました:

EGLint attrib_list[]= { EGL_RED_SIZE,        8,
                        EGL_GREEN_SIZE,      8,
                        EGL_BLUE_SIZE,       8,
                        EGL_SURFACE_TYPE,    EGL_WINDOW_BIT,
                        EGL_RENDERABLE_TYPE, 0,
                        EGL_DEPTH_SIZE, 24,
                        EGL_NONE};

EGL_DEPTH_SIZEと24に注意してください。これにより、デプスバッファが24ビットに設定されます。PlayBook 32では、通常32はサポートされていませんが、セグメンテーション違反が発生します。おそらくこれは、提供されたインクルードが私の問題として説明したこの面白い結果を引き起こしている理由を理解しようとしている誰かを助けるでしょう。

于 2012-11-15T06:02:00.197 に答える