2010-12-03 40 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

+0

私はプロジェクト全体を投稿したくありませんが、OpenGLコードは自己完結型のUIViewサブクラスにあります: – Xtapolapocetl

+0

http://dl.dropbox.com/u/163839/FilteredImageView/FilteredImageView.h – Xtapolapocetl

答えて

1

glTexImage2Dの後に、gl/TexフィルタでMIN/MAGフィルタを設定すると、デフォルトではミップマップが使用され、テクスチャはそのコードでは不完全です。

+0

私はすでにそれをしています(そして私はglTexImage2Dの前後に両方を試しました)。運がない。 – Xtapolapocetl

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

テクスチャラップパラメータを、SとTの両方向にGL_CLAMP_TO_EDGEに設定してください。これがなければ、テクスチャは不完全であり、黒く表示されます。

0

多分あなたは

glEnableです(GL_TEXTURE_2D)を忘れてしまいました。 OPが苦しむように見えるよう

は、このようなケースで、シェーダ内にTexture2Dは、黒返します。