5

サムスンギャラクシーのバリエーションで白いテクスチャが表示されますが、テストした他の電話ではテクスチャが正常に機能しています。私の質問は、そのような動作を引き起こす通常の疑いは何ですか?銀河系の変種には特別なハードウェアがあり、何かが欠けていますか?

私のテクスチャ読み込みコードはこれです

  GLuint texture;
  glGenTextures(1, &texture);
  glBindTexture(GL_TEXTURE_2D, texture);

  glPixelStorei(GL_UNPACK_ALIGNMENT, 2);

  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_MODULATE);

  if(alpha)glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*) image_data);
  else glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, (GLvoid*) image_data);

そして、描画はGL_TRIANGLESでいつものように行われています

*実際のデバイスが目の前にないため、glGetErrorを実行できません

4

1 に答える 1

4

OpenGL ES 1.0なので、電話する必要があります

glEnable(GL_TEXTURE_2D);

これは、OpenGL ES 2.0では何も実行されません。シェーダーは、どのテクスチャタイプが読み取られているかを示します(実際にはエラーです)。

glTexParameterf()とglTexEnvf()を呼び出すのは少し奇妙に思えますが、代わりにglTexParameteri()とglTexEnvi()を使用します(渡される値は列挙型であり、浮動小数点数ではなく整数です)。しかし、それでエラーが発生することはありません。

もう1つは、最大テクスチャサイズです(すでにPOTだと言っています)。たまたまテクスチャが大きいですか?一部のデバイスでは、最大テクスチャサイズの制限が512x512ピクセルと低くなる場合があります。

The unpack alignment should not have a big effect in general. It should be 1 if you store your RGB data as 3 bytes, or 4 if you store both RGB and RGBA as one double-word (= 4 bytes). If you specify a bad alignment, I can imagine that the texture is garbled (RGB or scanline skew), but it should not in general end up being white. On the other hand, if the driver refused this unpack alignment, it might leave the texture blank and generate GL error. See if it does.

Another factor is texture coordinates. Some devices have small number of bits in texcoord interpolators, and specifying large texture coordinates (e.g. such as -10000, +10000 on a terrain quad) might result in graphical glitches. This is really mostly undocumented and many devices have problems with it.

8x8の明るい緑がかったテクスチャを作成することは常に役に立ちました(0x00ff00ではなく、たとえば、0x8AC43Cは、グレースケールに変換される場合や、単一のコンポーネントのみが使用される場合に、はるかに簡単に見つけることができます)。次に、このテクスチャを、[0-1]の範囲のtexcoordを持つ「小さな」クワッド(画面上に完全に表示され、表示されるのに十分な大きさのクワッド)に適用する必要があります。

于 2012-10-30T13:31:30.040 に答える