1

我正在尝试从本机端将纹理应用于 opengl es 中的对象,但我不知道为什么它没有出现。我在屏幕上随机绘制了几个对象,它们都是可见的。我使用 glColor4f 将颜色应用于某些形状,效果很好。我正在尝试在最后一个绘制的对象上使用纹理,但它最终与前一个对象的颜色相同。

我最初是从 png 加载纹理,但我决定通过从包含原始 RGB 数据的文件加载它来简化事情。它是 16 像素 x 16 像素,我尝试了最大 512 x 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);
}

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

4

1 回答 1

1

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

于 2012-10-30T09:12:47.197 回答