2012-01-16 7 views
3

私はそれを単純にしておきます:この投稿の最後に記載されているコードは私のプロジェクトではトップからボトムの順です。 。。完全なテクスチャ以外のすべてをレンダリングする代わりに0フレームワーク単一のテクスチャをレンダリングするときに私が見るすべては正しい寸法のブラックボックスであるOpenGL ES 2.0:テクスチャは黒で何時間も解決されずにレンダリングされます:(

は、ここで私が確認したものだ:

  • が出力に組織を有しますバイト(それはGL_ALPHAのフォーマットです)、ゼロとゼロ以外の値があることがわかりますので、データは正しく表示されます(または少なくともすべて黒ではありません)。

  • テクスチャIDが頂点シェーダで次の使用により確認、正しい: (0,0)->(0,1)->(1,1)->(1,0)から移動期待black->green->yellow->redカラーフローを観察gl_FragColor=vec4(v_texCoord.xy,0.0,1.0); ..andが見られます。

  • 私のテクスチャは2次元の威力を持っています:256 x 64、データ配列に正しく反映されています。

グーグルと催促の数時間後、私は困惑して私は、間違っているものを決定する上で助けを大いに感謝されると思います!

glGenTextures(1, &_textureId); 
GLint savedId; 
glGetIntegerv(GL_TEXTURE_BINDING_2D, &savedId); 
glBindTexture(GL_TEXTURE_2D, _textureId); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
GLenum datatype = -1; 
GLenum format = -1; 
switch([self pixelFormat]) { 
    case kGLTexturePixelFormat_RGBA8888: 
     format=GL_RGBA; 
     datatype=GL_UNSIGNED_BYTE; 
     break; 
    case kGLTexturePixelFormat_RGB565: 
     format=GL_RGB; 
     datatype=GL_UNSIGNED_SHORT_5_6_5; 
     break; 
    case kGLTexturePixelFormat_A8: // * This is current format, used for testing. 
     format=GL_ALPHA; 
     datatype=GL_UNSIGNED_BYTE; 
     break; 
    default: 
     [NSException raise:NSInternalInconsistencyException format:@""]; 

} 
glTexImage2D(GL_TEXTURE_2D, 0, format, [self pixelsWide], [self pixelsHigh], 0, format, datatype, [self data]); 
glBindTexture(GL_TEXTURE_2D, savedId); 
//... 
GLint s_textureId = glGetUniformLocation(program, "s_texture"); 
//... 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, [_textureAtlas textureId]); 
glUniform1i(s_textureId, 0); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

// In vertex shader: 
attribute vec2 a_texCoord; 
varying vec2 v_texCoord; 
uniform sampler2D s_texture; 
void main() { 
    // ... 
    v_texCoord = a_texCoord; 
} 

// In fragment shader: 
varying vec2 v_texCoord; 
uniform sampler2D s_texture; 
void main() { 
    // ... 
    gl_FragColor = texture2D(s_texture, v_texCoord); 
} 

答えて

6

あなたのコードは正常に見える、と私は、出力の色が黒であることを期待していると言わなければならない:あなたのテクスチャがGL_ALPHA形式であるとして、GL ESのドキュメントは言う:

GL_ALPHA各要素単一のアルファ成分です。 GLは を浮動小数点に変換し、赤、緑、青に0 を付けてRGBA要素にアセンブルします。

あなたはグレースケール色としてあなたのアルファ値を表示したいのであれば、あなたがそうするように、あなたのフラグメントシェーダに指示する必要があります:

gl_FragColor = texture2D(s_texture, v_texCoord).aaaa; 

これはすべて赤でアルファ値を重複しますが、緑、赤、およびアルファチャンネル。あなたは、出力のアルファチャンネルは、1.0(不透明)のままにしたい場合は

は、あなたがお勧めします:

gl_FragColor = vec4(texture2D(s_texture, v_texCoord).aaa, 1.0); 
+0

はどうもありがとうございます、あなたは正確に正しいです!私は.aaaaを使用するように変更しました。私は今テキストを見ることができます:-)本当に、非常に感謝して、ビールを持っています。 – KomodoDave

+0

@KomodoDaveようこそ、歓声;) – rotoglup

関連する問題