1

ネイティブ側からopenglesのオブジェクトにテクスチャを適用しようとしていますが、なぜ表示されないのかわかりません。画面にランダムなオブジェクトがいくつか描かれていますが、それらはすべて表示されています。glColor4fを使用していくつかの図形に色を適用しましたが、これは問題なく機能します。最後に描画されたオブジェクトにテクスチャを使用しようとしていますが、前のオブジェクトと同じ色になってしまいます。

もともとはpngからテクスチャをロードしていましたが、生のRGBデータを含むファイルからロードすることで単純化することにしました。これは16ピクセルx16ピクセルで、512x512までのサイズを試しましたが同じ結果になりました。

これが私がすべてを初期化する方法です:

bool Activity::_initGL () {
  const EGLint attribs[] = {
    EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
    EGL_BLUE_SIZE, 8,
    EGL_GREEN_SIZE, 8,
    EGL_RED_SIZE, 8,
    EGL_NONE
  };
  EGLint dummy, format;
  EGLint numConfigs;
  EGLConfig config;

  display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
  eglInitialize(display, 0, 0);
  eglChooseConfig(display, attribs, &config, 1, &numConfigs);
  eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format);
  ANativeWindow_setBuffersGeometry(app->window, 0, 0, format);
  surface = eglCreateWindowSurface(display, config, app->window, NULL);
  context = eglCreateContext(display, config, NULL, NULL);

  if (eglMakeCurrent(display, surface, surface, context) == EGL_FALSE) {
    LOGE("Unable to eglMakeCurrent");
    return false;
  }

  eglQuerySurface(display, surface, EGL_WIDTH, &width);
  eglQuerySurface(display, surface, EGL_HEIGHT, &height);
  glViewport(0,0, width, height);
}

次に、必要なものを有効にして、テクスチャを作成しようとします。

void postInit () {
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
  glDisable( GL_BLEND );
  glDisable( GL_LIGHTING );
//   glEnable(GL_CULL_FACE);
  glEnable( GL_TEXTURE_2D );

  glShadeModel(GL_SMOOTH);
  glDisable(GL_DEPTH_TEST);

  glClearColor(0,0,0,1);
  glEnableClientState(GL_VERTEX_ARRAY);
  glEnableClientState(GL_TEXTURE_COORD_ARRAY);

//   glTexEnvx( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
  glMatrixMode( GL_MODELVIEW );

  GLuint texIDarray[1];
  glGenTextures( 1, texIDarray );
  glActiveTexture( GL_TEXTURE0 );
  glBindTexture( GL_TEXTURE_2D, texIDarray[0] );
  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, (GLsizei)16, (GLsizei)16, 0, GL_RGB, GL_UNSIGNED_BYTE, protData);

}

そして、いつかテクスチャが描画される場所は次のとおりです。

void drawImpl () {
  glClear(GL_COLOR_BUFFER_BIT); 
  glLoadIdentity();
//  glDisable(GL_TEXTURE_2D);
//  glTexEnvx( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
//  glEnableClientState(GL_VERTEX_ARRAY);
//  glViewport(0, 0, wid, hei);

#define fX(x) ((int)(x * (1  << 16)))
  static int verts[6] = {
    0,0,
    65536,0,
    0,30000
  };
  glVertexPointer(2, GL_FIXED, 0, verts);
//   glColor4f(1,0,1,1);
  glDrawArrays(GL_TRIANGLES, 0, 3);

  static int poo[12] = {
    40000,-5000,
    40000,-30000,
    60000,-5000,

60000,-5000,
40000,-30000,
60000,-30000    
  };
  glVertexPointer(2, GL_FIXED, 0, poo);
 // glColor4f(1,1,1,1);
  glDrawArrays(GL_TRIANGLES, 0, 6);

  static int pee[12] = {
    40000, 5000,
    60000, 5000,
    60000,30000,

40000, 5000,
60000,30000,
40000,30000 
  };
  glVertexPointer(2, GL_FIXED, 0, pee);
//    glColor4f(1,0,1,1);
  glDrawArrays(GL_TRIANGLES, 0, 6);

  glEnable(GL_TEXTURE_2D);
  static int squareVerts[12] = {
0,0,
fX(1),0,
0,fX(1),

0,fX(1),
fX(1),0,
fX(1),fX(1)
  };

  static int texCoords[12] = {
0,0,
fX(1),0,
0,fX(1),

0,fX(1),
fX(1),0,
fX(1),fX(1)
  };

  //glTranslatef( (float)-.25, (float)-.5, (float)0);

 // glColor4f(0,0,0,0);
//  glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  glActiveTexture( GL_TEXTURE0 );
//  glBindTexture(GL_TEXTURE_2D, texID);
  glTexEnvx( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
  glTexParameterx( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
  glTexParameterx( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
  glVertexPointer(2, GL_FIXED, 0, squareVerts);

  glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
 // glEnableClientState(GL_TEXTURE_COORD_ARRAY);
  glEnable( GL_TEXTURE_2D );
  glDrawArrays(GL_TRIANGLES, 0, 6);

//    glDisableClientState(GL_VERTEX_ARRAY);
//    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}

コメントアウトしたもののいくつかを意図的に残して、私が試した他のことを示しました。
私は今これで完全に行き詰まっています。誰かが何か提案や何かを持っているなら、それは私をとても幸せにするでしょう、そしてそれは良いことです。

4

1 に答える 1

1

テクスチャ座標を台無しにしたようです。0から1<<16の間ではなく、0から1の間である必要があります。もう1つは、「glColor4f」もモジュレーションによってテクスチャに影響を与えるため、通常のテクスチャ描画では(1,1,1,1)に設定する必要があります。

于 2012-10-30T09:12:47.197 に答える