2010-12-03 3 views
4

Я пытаюсь сделать простой текстурированный квадрат в OpenGL ES 2.0 на iPhone. Геометрия прекрасно, и я получаю ожидаемые четверной, если я использую твердый цвет в моем шейдере:OpenGL ES 2.0 текстурирование

 
    gl_FragColor = vec4 (1.0, 0.0, 0.0, 1.0); 

И я получаю ожидаемые градиенты, если я вынести координаты текстуры непосредственно:

 
    gl_FragColor = vec4 (texCoord.x, texCoord.y, 0.0, 1.0); 

Изображения данные загружаются из UIImage, масштабируется, чтобы соответствовать в пределах 1024х1024, и загружается в текстуру следующим образом:

 
    glGenTextures (1, &_texture); 
    glBindTexture (GL_TEXTURE_2D, _texture); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, 
     GL_UNSIGNED_BYTE, data); 

width, height и содержимое из data все правильно, как описано в отладчике.

Когда я изменить свой фрагмент шейдера использовать текстуру:

 
    gl_FragColor = texture2D (tex, texCoord); 

... и связать текстуру и сделать так:

 
    glActiveTexture (GL_TEXTURE0); 
    glBindTexture (GL_TEXTURE_2D, _texture); 

    // this is unnecessary, as it defaults to 0, but for completeness... 
    GLuint texLoc = glGetUniformLocation(_program, "tex");   
    glUniform1i(texLoc, 0); 

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

... Я ничего не получаю. Черный квадрат. glGetError() не возвращает ошибку, а glIsTexture(_texture) возвращает true.

Что я здесь делаю неправильно? Я был в курсе всех примеров, которые я мог найти в Интернете, но каждый делает это точно так же, как и я, и отладчик показывает, что мои параметры для различных функций GL - это то, что я ожидаю от них.

+0

Как и вы, я не могу видеть что-то явно неправильное с представленным кодом. Если вы хотите, можете ли вы опубликовать весь проект где-нибудь? Там должно быть действительно интересно. – Tommy 2010-12-03 17:56:39

+0

Я не хочу публиковать весь проект, но код OpenGL находится в автономном подклассе UIView: – Xtapolapocetl 2010-12-03 18:04:16

ответ

1

После установки glTexImage2D установите фильтры MIN/MAG с помощью glTexParameter, по умолчанию используются mipmaps, чтобы текстура была неполна с этим кодом.

1

Я столкнулся с той же проблемой (черный квадрат) и не смог найти ответ, пока ответ jfcalvo от this question не привел меня к делу. В основном убедитесь, что вы не загружаете текстуру в другой поток.

0

убедитесь, что вы звоните (glTexImage2D) с правильными форматами (константы)

убедитесь, что вы освободив ресурсы изображения после glTexImage2D

, который, как я буду делать это на Android:

int[] textures = new int[1]; 
      GLES20.glGenTextures(1, textures, 0); 

      mTextureID = textures[0]; 
      GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureID); 

      GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, 
        GLES20.GL_NEAREST); 
      GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, 
        GLES20.GL_TEXTURE_MAG_FILTER, 
        GLES20.GL_LINEAR); 

      GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, 
        GLES20.GL_REPEAT); 
      GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, 
        GLES20.GL_REPEAT); 

      InputStream is = mContext.getResources() 
       .openRawResource(R.drawable.ywemmo2); 
      Bitmap bitmap; 
      try { 
       bitmap = BitmapFactory.decodeStream(is); 
      } finally { 
       try { 
        is.close(); 
       } catch(IOException e) { 
        // Ignore. 
       } 
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0); 
     bitmap.recycle(); 
1

убедитесь, что параметры текстуры завершены в GL_CLAMP_TO_EDGE как в направлениях S, так и в направлении T. Без этого текстура будет неполной и станет черной.

0

может быть, вы забыли

glEnable (GL_TEXTURE_2D);

такой случай, текстура2D в шейдере будет черным черным, как кажется, страдает ОП.