2016-03-28 17 views
0

私は、Android用のOpenGL ES 3.0を使用してYUV色空間をRGBに変換するサンプルコードを実装しました。私はvertex &フラグメントシェーダを持っていました。glCheckFrameBufferStatus()は常に36054を返します

私は

glActiveTexture(GL_TEXTURE0); 
glGenTextures(1, &ytex); 
glBindTexture(GL_TEXTURE_2D,ytex); 
GLint textureBinding; 
glGetIntegerv(GL_TEXTURE_BINDING_2D, &textureBinding); 
if(textureBinding == 0) 
{ 
     char* infoLog = (char*) malloc(100); 
     glGetProgramInfoLog(programObject, textureBinding, NULL, infoLog); 
     errormsg = infoLog; 
     free (infoLog); 
} 
// Setup the texture parameters 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
//Define the texture image 
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 640, 480, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, yBuffer); 

glFramebufferTexture2D(GL_FRAMEBUFFER、GL_COLOR_ATTACHMENT0、GL_TEXTURE_2D、ytex、0)、以下のようなテクスチャを作成しました。

glActiveTexture(GL_TEXTURE1); 
glGenTextures(1, &utex); 
glBindTexture(GL_TEXTURE_2D,utex); 
glGetIntegerv(GL_TEXTURE_BINDING_2D, &textureBinding); 
if(textureBinding == 0) 
{ 
     char* infoLog = (char*) malloc(100); 
     glGetProgramInfoLog(programObject, textureBinding, NULL, infoLog); 
     errormsg = infoLog; 
     free (infoLog); 
} 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 320, 240, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, uBuffer); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, utex, 0); 
glActiveTexture(GL_TEXTURE2); 
glGenTextures(1, &vtex); 
glBindTexture(GL_TEXTURE_2D,vtex); 
glGetIntegerv(GL_TEXTURE_BINDING_2D, &textureBinding); 
if(textureBinding == 0) 
{ 
     char* infoLog = (char*) malloc(100); 
     glGetProgramInfoLog(programObject, textureBinding, NULL, infoLog); 
     errormsg = infoLog; 
     free (infoLog); 
} 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 320, 240, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL); 

glGetError()を使用して確認するとエラーは発生しません。

テクスチャの出力は、ビューポートに表示したくない代わりに、出力を後で使用するために1つのバッファに保存します。だから私は、フレームバッファを作成し、以下のようにバッファをレンダリング

//Framebuffer 
glGenFramebuffers(1, &fboId); 
glBindFramebuffer(GL_FRAMEBUFFER, fboId); 


glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, vtex, 0); 
//Check the framebuffer status 
GLint status = glCheckFramebufferStatus(GL_FRAMEBUFFER); 
if(status != GL_FRAMEBUFFER_COMPLETE) 
{ 
     char* infoLog = (char*) malloc(100); 
     glGetProgramInfoLog(programObject, status, NULL, infoLog); 
     errormsg = infoLog; 
     free (infoLog);} 

私はglCheckFrameBufferStatus()を呼び出す前にバッファをバインド解除するとき、私はそれは常に36054(GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENTを)返している状態が、同じ返却GL_FRAMEBUFFER_COMPLETEを確認

 glbindFrameBuffer(GL_FRAMEBUFFER, 0); 

それでは、glReadpixels()を使ってフレームバッファからの出力を読み込みたいのですが、失敗しています。この問題の解決方法をお手伝いしてください。

答えて

0

OpenGL/OpenGL ESの実装はありません。アルファまたは輝度テクスチャをカラーレンダリング可能にサポートしています。 GL_R8、GL_RG8で動作を複製することができます。これらの2つのフォーマットは、FBOを使用して1つまたは2つのチャネルの画像フォーマットに描画したい場合(GL_LUMINANCE、GL_ALPHAおよびGL_LUMINANCE_ALPHAはカラーレンダリング可能なフォーマットではないため)非常に便利です。

内部フォーマットをGL_R8に置き換えて、GL_REDでフォーマットしてください。

+0

私はGL_RGBAをGL_R8(内部形式)とGL_RED(形式)に置き換えました。しかし、私は期待された成果を得ていません。 http://imgur.com/fwDhmCX実際の画像はhttp://imgur.com/4ylgl3vです。この問題を解決するのを手伝ってください – user255212

+0

詳しいことを教えてください。 –

+0

グレースケールイメージをOpenGL ESテクスチャにアップロードしたい、シェイダーでYUVからRGBへの変換ロジックを記述しました。私はFBOに2テクスチャを添付します。後で私はバッファから出力を読み取ることができます。グレースケール入力をglTexImage2D()のパラメータとして渡し、フォーマットタイプをGL_LUMINANCEとして渡します。 glCheckFramebufferStatus()にINCOMEPLETEフレームバッファが生成されます。以前のスレッドで提案した通り、私はGL_LUMINANCEをGL_R8とGL_REDに置き換えました。私は今、イメージを得ることができますが、それは赤色でしかありません。予想される出力と実際の出力については、前のスレッドの添付リンクを参照してください。 – user255212

0

36054は、GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENTはビューのフレームが正しいことを確認しますか?

関連する問題