0

サイトで初めての質問なので、型破りなことをしていたらすみません。かなりの量のファイルを投稿することになるため、実際のコードの最小限の量を投稿し、従ったチュートリアルへのリンクを投稿することにしました。私と一緒にいる人にとっては、私がどれだけ感謝しているか分かりません.

私は現在、C++ でグラフィック レンダリング用のクロス プラットフォーム エンジンを開発しています。必要以上に楽しいプロジェクトです。私の主な開発プラットフォームは Macbook Pro です。そのため、実装したいエンジンの最初の部分は Mac への移植であると判断しました。アプリケーションをネイティブ アプリのように動作させたいので、フロント エンドに Cocoa を使用することにしました。

このチュートリアルに従ったところ、付属のデモと、lazyfoo の Web サイトの最初のチュートリアルでうまく機能しました。1 年以上前にチュートリアルを行いましたが、少し前に学んだことを実装する方法を確認して確認したかったのです。

問題が発生したのは、2 番目のチュートリアルに到達するまでではありませんでした。tut01_renderer クラスを編集して、ここまでで 1 つの変数を追加しました。これは、チュートリアルで lazyfoo が render メソッドで比較するために使用する整数の gColorMode 変数です。ヘッダー、tut01renderer init メソッド、またはその両方で gColorMode を 0 (シアン) に初期化しようとしました。最後に、tut01renderer のレンダリング メソッドに、if/else ステートメントを挿入します。

    if(gColorMode == 0)
    {

    //Solid Cyan
        glBegin( GL_QUADS );
        glColor3f( 0.f, 1.f, 1.f );
        glVertex2f( -0.5f, -0.5f );
        glVertex2f(  0.5f, -0.5f );
        glVertex2f(  0.5f,  0.5f );
        glVertex2f( -0.5f,  0.5f );
        glEnd();
    }
    else
    {
        //RYGB Mix
        glBegin( GL_QUADS );
        glColor3f( 1.f, 0.f, 0.f ); glVertex2f( -0.5f, -0.5f );
        glColor3f( 1.f, 1.f, 0.f ); glVertex2f(  0.5f, -0.5f );
        glColor3f( 0.f, 1.f, 0.f ); glVertex2f(  0.5f,  0.5f );
        glColor3f( 0.f, 0.f, 1.f ); glVertex2f( -0.5f,  0.5f );
        glEnd();
    }

これにより、実行時に 3 つのシナリオが発生し、gColorMode をどのように初期化しても、3 つのそれぞれが発生します。

1) malloc エラー、解放されたオブジェクトの編集、またはアセンブリでの不正なアクセス エラーのいずれかでクラッシュします。2) シアンの四角が表示されます 3) マルチ四角が表示されます!

私は gColorMode を定数にしましたが、それでも時々マルチスクエアまたはクラッシュが表示されます!

だから私の質問は、私が間違ったことや前代未聞のことをしているのかということです。render メソッドに if/else ステートメントを含めることはできますか? 元のスケルトン コードのデモでは変数を使用していましたが、if/else ステートメントは使用していませんか? Objective C++ について、私がやろうとしていることを不可能にする何かがありますか? それとも何か他のものですか?

(最後に、十分に優れたチュートリアルを誰かが知っている場合は、これを単純な C と目的の C で喜んで再実装します。明らかに私のエンジンは C++ ですが、このアプローチを使用する方が全体的に簡単かもしれません。)

4

1 に答える 1

0

順序を台無しにしない限り、OpenGL 関数を呼び出すときに、任意の制御構造 (if/else、for ループなど) を使用できます。たとえば、それぞれglBegin()に対応する が存在しglEnd()glVertexと の間で呼び出される必要がglBeginありglEndます。あなたが投稿したコードはうまく見えます。コードにエラーがあると仮定すると、それは別の場所にあるはずです。

0 に設定gColorModeし、マルチカラーのクワッドを描画するブレークポイントを設定します。なぜその道をたどっているのかを調べてください。変更時にトリガーするデータ ブレークポイントを設定することもできgColorModeます。それでも何もわからない場合は、デバッガーを使用してコードをステップ実行し、どの関数呼び出しがこの "不正なアクセス エラー" を引き起こしているかを調べてください。

もっとコードを見ることができなければ、他に何を言うべきかわかりません。

于 2013-06-29T09:25:55.390 に答える