2010-12-03 284 views
4

我正试图在iPhone上渲染OpenGL ES 2.0中的简单纹理四边形。几何形状是很好,我得到预期的四,如果我在着色器使用纯色: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); 

widthheight,将其内容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,设定glTexParameter的MIN/MAG过滤器,默认值使用的mipmap所以纹理是不完整的与该代码。

1

我遇到同样的问题(黑四),并不能找到答案,直到被this question jfcalvo的回应使我的事业。基本上确保你没有在不同的线程中加载纹理。

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

确保您设置纹理包装参数在这两个S和T方向GL_CLAMP_TO_EDGE。如果没有这个,纹理是不完整的,并会显示黑色。

0

也许你忘了

glEnable(GL_TEXTURE_2D);

是这样的情况下,在的Texture2D着色器将返回黑,作为OP似乎受到影响。