2012-02-16 8 views
0

iOSのOpenGLESに問題があります。Objective-CのGLenumプロパティとしてOpenGL

@property (nonatomic, assign) GLint internalFormat; 
@property (nonatomic, assign) GLenum format; 
@property (nonatomic, assign) GLenum target; 

問題は、それがこのように動作しないということです。私はこのように宣言

if (numberOfMipmaps > 0) { 
    if (textureData != 0) 
     glDeleteTextures(1, &textureData); 
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
    glGenTextures(1, &textureData); 
    glBindTexture(GL_TEXTURE_2D, textureData); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    CHECK_GL_ERROR(); 

    for (GLint i = 0; i < numberOfMipmaps; i++) { 
     unsigned char *data = mipmaps[i].address; 

     glTexImage2D(GL_TEXTURE_2D, i, internalFormat, width, height, 0, format, target, data); 
     //glGenerateMipmapOES(GL_TEXTURE_2D); 
     CHECK_GL_ERROR(); 

     width = MAX(width >> 1, 1); 
     height = MAX(height >> 1, 1); 
    } 
} 

internalFormat、フォーマットとターゲットがsyntesizedされているプロパティを経由して、私はそれを読み込むテクスチャをレンダリングします。私はコンパイルやランタイムエラーが発生しません。私は、テクスチャメモリにデータがロードされていないことを示す白い画面しか表示しません。私は私のコンストラクタこの背後にある考え方は、RGB565のような他のテクスチャフォーマットを提供するために、私のクラスを継承することです

internalFormat = GL_RGBA; 
format = GL_RGBA; 
target = GL_UNSIGNED_SHORT_5_5_5_1; 

にこれら三つの変数を設定します。私は単に私がGLテクスチャを作成する方法をオーバーロードし、私はプロパティを使用する場合、それは働いていない理由を

glTexImage2D(GL_TEXTURE_2D, i, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_SHORT_565, data); 

は、誰も私に説明することができglTexImage2D機能をハードコーディングしている場合 は、それが動作するために使用しました。

編集: ちょっとわかりやすく:質問はなぜglTexImage2D関数のパラメータとしてプロパティを使用するのですか?

EDIT 2: 私は問題があると思います。 GL_RGBAとGL_UNSIGNED ...はopenglesヘッダーファイルで定義されているため、ObjCプリコンパイラは16進コードをglTexImage2D関数呼び出しに貼り付けます。変数を使用すると、プリコンパイラは何も変更せず、実行時に値が挿入され、動作しません。

+0

GL_UNSIGNED_SHORT_5_5_5_1またはGL_UNSIGNED_SHORT_565をターゲットとして使用しますか?プロパティとしては1つの値を使用しますが、glTexImage2D関数呼び出しの例では異なる値を使用するためです。 –

+0

どこに割り当てましたか? 'init'メソッドで?あなたはサブクラスで ''スーパーイン。 ''と呼んでいましたか? –

+0

@MārtiņšMožeiko:まあ、両方。私はメインクラスから継承したい。それはポイントではありません。私はプロパティを使用しない場合は、テクスチャの読み込みと使用が機能します。私はメソッドをデバッグし、プロパティが正しい値を持っていることを二重にチェックしました。 – nurbs999

答えて

0

GLenumタイプは、iOSのtypdef'd unsigned intです。他のunsigned intと同様にプロパティの型を「代入」として使うことができるはずです。実際の代入/プロパティの使用には何か誤りがあります。


ちなみに、実際のコードでは合成されたイヴァールに直接アクセスしています。プロパティを使用している場合は、たとえば、 self.formatまたは[self format]を明確にするためにここに厳密には必要ないかもしれませんが、

+0

私はそれを助けませんでした。私のプロパティが割り当てられているので、私は 'format ='または 'self.format ='を使用しても問題ないと思う。 – nurbs999

+0

@ user890270 'self.format ='の代わりに 'format ='を使うと、プロパティアクセサーではなく合成されたインスタンス変数を直接使用しています。この区別はおそらくここで重要ではないでしょう。とにかく割り当てられていると言えますが、コード内での一貫性とアクセサーの使用をお勧めします。 (この時点で更新された答え。) –

+0

@ user890270:とにかく、あなたは値を設定しているところで完全なメソッドを投稿するべきです。そのメソッド(イニシャライザ)が呼び出されていることは確実ですか?それを確認するためにブレークポイントを設定しましたか?もしそうなら、ブレークポイントを設定して、レンダリング時に期待どおりの値になっていることを確認してください。基本的なことはここでは機能しません。 –

関連する問題