2011-10-21 23 views
3

初めてOpenGL ES 2.0でプレーンにテクスチャをレンダリングしようとしています。私はいつも黒いので何かを間違ってやっているに違いない。OpenGL ES 2.0のテクスチャが黒くなる

テクスチャはリソース内のイメージに由来します。

これは私のレンダリングエンジンのコードです:

初期化:

...//program creation and linking 


UIImage* image = [UIImage imageNamed:@"marilyn.jpg"]; 

GLubyte* textureData = (GLubyte *)malloc(image.size.width * image.size.height * 4); 
CGContext* textureContext = CGBitmapContextCreate(textureData, image.size.width, image.size.height, 8, image.size.width * 4, CGImageGetColorSpace(image.CGImage), kCGImageAlphaPremultipliedLast); 
CGContextDrawImage(textureContext, CGRectMake(0.0, 0.0, (CGFloat)image.size.width, (CGFloat)image.size.height), image.CGImage); 
CGContextRelease(textureContext); 

glGenTextures(1, &texture); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, texture); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);   

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.size.width, image.size.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData); 

...//frame and render buffers... 

私はすべてそのコードを入れて申し訳ないが、私は見てきた

glViewport(0, 0, backingWidth, backingHeight); 

glClearColor(0.3f, 0.3f, 0.4f, 1.0f); 
glClear(GL_COLOR_BUFFER_BIT); 

glUseProgram(program); 

glUniformMatrix4fv(u_modelView, 1, GL_FALSE, modelView.Pointer()); 
glUniformMatrix4fv(u_projection, 1, GL_FALSE, proj.Pointer()); 
glBindTexture(GL_TEXTURE_2D, texture); 
glUniform1i(u_sampler, 0); 

const GLfloat squareVertices[] = { 
    -200.0f, -200.0f, 
    200.0f,-200.0f, 
    -200.0f, 200.0f,   
    200.0f,200.0f, 
}; 
const GLfloat squareTextureCoords[] = { 
    1.0, 1.0, 
    1.0, 0.0, 
    0.0, 1.0, 
    0.0, 0.0, 
}; 

glVertexAttribPointer(p_texture.a_position, 2, GL_FLOAT, GL_FALSE, 0, squareVertices); 
glEnableVertexAttribArray(p_texture.a_position); 
glVertexAttribPointer(p_texture.a_textureCoord, 2, GL_FLOAT, GL_FALSE, 0, squareTextureCoords); 
glEnableVertexAttribArray(p_texture.a_textureCoord); 

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

をレンダリング何時間もの間、私は何が間違っているのか分かりません。

私が見るのは、マリリンの絵ではなく黒い四角です。

EDIT:

attribute vec4 position; 
attribute vec2 texture_coord; 

varying vec2 textureCoord; 

uniform mat4 Projection; 
uniform mat4 ModelView; 

void main(void) 
{ 
    gl_Position = Projection * ModelView * position; 
    textureCoord = texture_coord; 
} 

フラグメントシェーダ:あなたのセットアップは、あなたのテクスチャどうやっ

varying mediump vec2 textureCoord; 

uniform sampler2D tex; 

void main(void) 
{ 
    gl_FragColor = texture2D(tex, textureCoord); 
} 

答えて

2

私は、私は答えをcplusoglするコメントで言ったように、問題は、私は脇サイズが2

1

私はシェーダ バーテックスシェーダを表示するのを忘れましたか?一部のデバイスはGL_CLAMP_TO_EDGE属性のみをサポートしています。 OGL es 2.0では、同等のコードは次のようになります。

GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, 
         GLES20.GL_CLAMP_TO_EDGE); 
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, 
         GLES20.GL_CLAMP_TO_EDGE); 
+3

こんにちはの力であることを正方形のテクスチャを使用していませんでしたし、そう長く取るため申し訳ありませんごめんなさい答える。 テクスチャが2乗する必要があり、サイズが2である必要があったようです。そこで、1024x1024のjpgに変更しました。 – Odrakir

+0

@Odrakirそのコメントは、それ自身で受け入れられる回答でなければなりません。 – pablasso

1

OGL/ES 2は、テクスチャサイズについては厄介です。あなたは確認することをお勧めします:テクスチャサイズはglGetIntegerf(GL_MAX_TEXTURE_SIZE、<のIntPtr>)を介して、あなたの実装の最大テクスチャサイズを超えていない

  • 場合。
  • テクスチャディメンションのいずれかがnpot(2の累乗ではない)である場合、ハードウェアがサポートされているかどうかを確認する必要があります。仕様:GL/ES 2.0は、反復テクスチャラップモードが使用されていない限り、NPOTテクスチャをサポートします。 GL_REPEAT - >これは黒の結果を説明することがあります
  • 拡張子GL_ARB_texture_non_power_of_twoがサポートされている場合(完全にNPOTサポートがある場合)
関連する問題