私は、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()を使ってフレームバッファからの出力を読み込みたいのですが、失敗しています。この問題の解決方法をお手伝いしてください。
私はGL_RGBAをGL_R8(内部形式)とGL_RED(形式)に置き換えました。しかし、私は期待された成果を得ていません。 http://imgur.com/fwDhmCX実際の画像はhttp://imgur.com/4ylgl3vです。この問題を解決するのを手伝ってください – user255212
詳しいことを教えてください。 –
グレースケールイメージをOpenGL ESテクスチャにアップロードしたい、シェイダーでYUVからRGBへの変換ロジックを記述しました。私はFBOに2テクスチャを添付します。後で私はバッファから出力を読み取ることができます。グレースケール入力をglTexImage2D()のパラメータとして渡し、フォーマットタイプをGL_LUMINANCEとして渡します。 glCheckFramebufferStatus()にINCOMEPLETEフレームバッファが生成されます。以前のスレッドで提案した通り、私はGL_LUMINANCEをGL_R8とGL_REDに置き換えました。私は今、イメージを得ることができますが、それは赤色でしかありません。予想される出力と実際の出力については、前のスレッドの添付リンクを参照してください。 – user255212