2016-05-30 3 views
0

最終的な目標は、同じフレームバッファに2つのテクスチャを付けたping pongメソッドを使用したGPU画像処理(カラー量子化、ピクセルソート、連結成分分析)です。AIDE-ideレンダリングでのテクスチャレンダリングで空白のテクスチャが返される

私は他のスレッドを見て、テクスチャを完成させ、エラーをチェックした後、thisチュートリアルとthatチュートリアルでドキュメントを見ましたが、何も動作していないようです。私は画面にレンダリングすることはできますが、フレームバッファに付いているテクスチャにレンダリングできます。

両方のタイプのレンダリングで同じものを使用しているため、クワッドに描画するコードは分かっています。私はglCheckFramebufferStatusまたはglGetErrorsでエラーを出すことはありません。eveythingはチュートリアルと同じように見えますが、深度やステンシルのデータが必要ないため、レンダリングバッファを作成または添付していると思います。だから私は迷っている。どんな助けでも大変感謝していますので、私は難しいことを理解することに移ります。

ImageRendererクラスで、フレームバッファとテクスチャを作成し、エラーをチェックするための

コード:クワッドに描画するための

public PixelCounter(Bitmap b) 
{ 
    mWidth = b.getWidth(); 
    mHeight = b.getHeight(); 
            
    defineShape(); 
    ConversionData = ImageRenderer.createUBO(16+3); 
    ImageRenderer.updateBuffer(toXYZ,0,ConversionData); 
    ImageRenderer.updateBuffer(new float[]{0.95047f, 1.0f, 1.08883f},15,ConversionData); 
    FBOHandle = ImageRenderer.createFBO(); 
    //create temporary texture to pass bitmap to float texture 
    temptex = ImageRenderer.loadTexturefromBitmap(b); 
    //create ping-pong textures 
    FBOTextureHandles = ImageRenderer.createFBOTextures(FBOHandle, mWidth,mHeight); 
            
    to_LAB = compile_shader(new String[]{default_vertex,to_lab}); 
    to_screen = compile_shader(new String[]{default_vertex, render_to_screen}); 
    to_texture = compile_shader(new String[]{default_vertex, render_to_texture}); 
} 

コード:

public static int createFBO() 
{ 
    int[] fbo = new int[1]; 
    GLES30.glGenFramebuffers(1,fbo,0); 
    GLES30.glBindFramebuffer(GLES30.GL_FRAMEBUFFER, fbo[0]); 
        
    int error = GLES30.glGetError(); 
    if(error != GLES30.GL_NO_ERROR) 
    { 
        while (error !=GLES30.GL_NO_ERROR) 
        { 
            System.out.println(error); 
            error = GLES30.glGetError(); 
        } 
        GLES30.glBindFramebuffer(GLES30.GL_FRAMEBUFFER, 0); 
        return 0; 
    } 
    else 
    { 
        GLES30.glBindFramebuffer(GLES30.GL_FRAMEBUFFER, 0); 
        return fbo[0]; 
    } 
} 
    
public static int[] createFBOTextures(int framebuffer, int width, int height) 
{ 
    //bind the framebuffer 
    GLES30.glBindFramebuffer(GLES30.GL_FRAMEBUFFER, framebuffer); 
        
    int[] rt = new int[2]; 
    GLES30.glGenTextures(2, rt, 0); 
    int[] DrawBuffers = {GLES30.GL_COLOR_ATTACHMENT0,GLES30.GL_COLOR_ATTACHMENT1}; 

    for (int i=0; i<2; i++) 
    { 
        GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, rt[i]); 
        GLES30.glTexImage2D(GLES30.GL_TEXTURE_2D,0,GLES30.GL_RGBA32F, width, height,0,GLES30.GL_RGBA, GLES30.GL_FLOAT, null); 
        GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MAG_FILTER, GLES30.GL_LINEAR); 
        GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MIN_FILTER, GLES30.GL_LINEAR_MIPMAP_LINEAR); 
        GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_WRAP_S, GLES30.GL_CLAMP_TO_EDGE); 
        GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_WRAP_T, GLES30.GL_CLAMP_TO_EDGE); 
            // Attach each texture to colour attachement #i 
        GLES30.glFramebufferTexture2D (GLES30.GL_FRAMEBUFFER, DrawBuffers[i], GLES30.GL_TEXTURE_2D, rt[i], 0); 
    } 
        
    if(check_framebuffer_errors()) 
        return null; 
    else 
     return rt; 
    } 
    
public static boolean check_framebuffer_errors() 
{ 
    if(GLES30.glCheckFramebufferStatus(GLES30.GL_FRAMEBUFFER) != GLES30.GL_FRAMEBUFFER_COMPLETE) 
    { 
            System.out.println(GLES30.glCheckFramebufferStatus(GLES30.GL_FRAMEBUFFER)); 
        return true; 
    } 
    else 
    { 
        int error = GLES30.glGetError(); 
        if(error !=GLES30.GL_NO_ERROR) 
        { 
            while (error != GLES30.GL_NO_ERROR) 
            { 
                System.out.println(error); 
                error = GLES30.glGetError(); 
            } 
            return true; 
        } 
        else 
            return false; 
    } 
} 

すべてがそうのように初期化されPixelCounterオブジェクトから作られたコマンドを、描きます

//draw temptex to initial src texture 
GLES30.glBindFramebuffer(GLES30.GL_FRAMEBUFFER,FBOHandle); 
GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT | GLES30.GL_DEPTH_BUFFER_BIT); 
//GLES30.glViewport(0,0,mWidth,mHeight); 
bindTexture(temptex, to_texture, "src"); 
GLES30.glDrawBuffers(1, new int[]{GLES30.GL_COLOR_ATTACHMENT0}, 0);    
simple_draw(to_texture); 
        
//draw to screen 
GLES30.glBindFramebuffer(GLES30.GL_FRAMEBUFFER,0); 
bindTexture(FBOTextureHandles[dest],to_screen, "src"); 
simple_draw(to_screen); 

simple_draw機能

private void simple_draw(int program) 
{ 
    GLES30.glUseProgram(program); 

    //get handle to vertex shader's position member 
    mPositionHandle = GLES30.glGetAttribLocation(program, "position"); 

    //Add attribute array of vertices 
     GLES30.glEnableVertexAttribArray(mPositionHandle); 
     GLES30.glVertexAttribPointer(
            mPositionHandle, mPositionDataSize, 
        GLES30.GL_FLOAT, false, 
            mStrideBytes, vertexBuffer); 

        GLES30.glDrawElements(
                GLES30.GL_TRIANGLES, drawOrder.length, 
                GLES30.GL_UNSIGNED_SHORT, drawListBuffer); 
    } 

そして、良い対策のための私のフラグメントシェーダ:解決

private String render_to_texture = 
"#version 300 es \n" + 
"uniform sampler2D src;\n"+ 
"in vec4 coord;\n"+ 
"layout(location = 0) out vec4 dest;\n" + 

"void main()\n"+ 
"{\n"+ 
    "vec2 size = vec2(textureSize(src,0));\n"+ 
    "ivec2 uv_coord = ivec2((coord.xy+vec2(1.0,1.0))/2.0*size);\n"+ 
    "dest = texelFetch(src,uv_coord,0);\n"+ 
"}"; 

答えて

0

。レンダリングする前にglViewport(0,0、width、height)を追加しました。 AIDEを実行している電話機のカメラで撮影した写真から幅/高さを取得するので、デフォルトは何かが不思議です(寸法はGLSurfaceViewと同じにする必要があります)。

EDIT:宛先として2番目のテクスチャに描画するときに、glDrawBuffers引数を(2、新しいint [] {GL_NONE、COLOR_ATTACHMENT1}、0)に変更する必要もあります。

関連する問題