纹理不会出现使用本机代码在Android上加载opengl es

时间:2012-10-30 07:30:50

标签: android opengl-es android-ndk

我正在尝试将纹理应用于来自本机的opengl es中的对象,我不知道为什么它没有出现。我在屏幕上绘制了几个随机对象,它们都是可见的和一切。我使用glColor4f将颜色应用到某些形状,并且工作正常。我正在尝试在最后一个被绘制的对象上使用纹理,但它最终与之前的颜色相同。

我最初从png加载纹理,但我决定通过从包含原始RGB数据的文件加载来简化操作。这是16像素x 16像素,我尝试了512到512的尺寸,结果相同。

以下是我如何初始化所有内容:

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);
}

我故意留下一些注释掉的东西来展示我尝试过的其他事情 我现在完全处于死胡同状态。如果有人有任何建议或任何东西,它会让我超级高兴,这很好。

1 个答案:

答案 0 :(得分:1)

好像你弄乱了你的纹理坐标。它们应该在0和1之间,而不是在0和1之间<&lt; 16。另一件事是你的“glColor4f”也会通过调制它来影响你的纹理,对于正常的纹理绘制,它需要设置为(1,1,1,1)。