什么是渲染目标以及如何创建无效操作?

时间:2015-07-23 03:13:43

标签: android opengl-es-2.0

我正在尝试使用浮点纹理创建一个frameBuffer,一切都运行正常,frameBuffer列为一个完整的附件。但现在我似乎得到了这个错误,无法绘制到我的纹理中。

07-22 21:00:15.180: W/Adreno-ES20(27203): <validate_render_targets:454>: GL_INVALID_OPERATION

我不知道通过验证渲染目标或它是如何成为无效操作意味着什么。谷歌在这件事上似乎不是我的朋友,因为我没有回复它的结果。我似乎无法在opengl sdk docs中找到任何内容。

下面是设置我的帧缓冲区的代码

public void setup(Context context) {
    final float eyeX = 0.0f;
    final float eyeY = 0.0f;
    final float eyeZ = 1.5f;

    final float lookX = 0.0f;
    final float lookY = 0.0f;
    final float lookZ = -5.0f;

    final float upX = 0.0f;
    final float upY = 1.0f;
    final float upZ = 0.0f;

    Matrix.setLookAtM(mViewMatrix, 0, eyeX, eyeY, eyeZ, lookX, lookY, lookZ, upX, upY, upZ);

    int vertexShaderHandle = ShaderHelper.compileShader(GLES20.GL_VERTEX_SHADER,
            ShaderHelper.readShader(context, R.raw.vertex_shader));     
    int fragmentShaderHandle = ShaderHelper.compileShader(GLES20.GL_FRAGMENT_SHADER,
            ShaderHelper.readShader(context, R.raw.fragment_shader));

    mProgramHandle = ShaderHelper.createAndLinkProgram(vertexShaderHandle, fragmentShaderHandle, 
            new String[] {"a_Position", "a_TexCoord"});

    vertexShaderHandle = ShaderHelper.compileShader(GLES20.GL_VERTEX_SHADER,
            ShaderHelper.readShader(context, R.raw.particle_vertex_shader));        
    fragmentShaderHandle = ShaderHelper.compileShader(GLES20.GL_FRAGMENT_SHADER,
            ShaderHelper.readShader(context, R.raw.particle_fragment_shader));

    mPartProgramHandle = ShaderHelper.createAndLinkProgram(vertexShaderHandle, fragmentShaderHandle, 
            new String[] {"a_Position"});


    // create the ints for the framebuffer, depth render buffer and texture
    int[] fb, renderTex; // the framebuffer, the renderbuffer and the texture to render
    fb = new int[1];
    renderTex = new int[2];

    // generate
    GLES20.glGenFramebuffers(1, fb, 0);
    GLES20.glGenTextures(2, renderTex, 0);

    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, renderTex[0]);

    // parameters - we have to make sure we clamp the textures to the edges
    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);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);

    int GL_OES_texture_half_float = 0x8D61;
    int GL_RGBA32F =  0x8814;
    GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GL_RGBA32F, texW, texH, 0, GLES20.GL_RGBA, GLES20.GL_FLOAT, null);
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fb[0]);
    GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, renderTex[0], 0);
    //      ShaderHelper.saveTexture(renderTex[0], texW, texH, "test");
    posTex = renderTex[0];
    posFb = fb[0];

    final int buffers[] = new int[2];
    GLES20.glGenBuffers(2, buffers, 0);
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, buffers[0]);
    GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, spriteBuffer.capacity() * BYTES_PER_FLOAT, spriteBuffer, GLES20.GL_STATIC_DRAW);
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, buffers[1]);
    GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, renderQuad.capacity() * BYTES_PER_FLOAT, renderQuad, GLES20.GL_STATIC_DRAW);

    mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_MVPMatrix");
    mTransformsHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_Transforms");
    mTexDataHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_TexData");
    mTexUniformHandle = GLES20.glGetUniformLocation(mProgramHandle, "u_Texture");
    mPositionHandle = GLES20.glGetAttribLocation(mProgramHandle, "a_Position"); 
    mTexCoordHandle = GLES20.glGetAttribLocation(mProgramHandle, "a_TexCoord");

    mPosTexHandle = GLES20.glGetUniformLocation(mPartProgramHandle, "u_Positions");
    mFBPositionHandle = GLES20.glGetAttribLocation(mPartProgramHandle, "a_Position"); 

    spriteBufferIdx = buffers[0];
    fbQuadBufferIdx = buffers[1];

    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);

}

这是实际的绘图代码

 private void renderToTexture() {
    GLES20.glViewport(0, 0, this.texW, this.texH);

    // Bind the framebuffer
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, posFb);
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, fbQuadBufferIdx);
    // check status
    int status = GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER);
    if (status != GLES20.GL_FRAMEBUFFER_COMPLETE)
        throw new RuntimeException("FrameBuffer Error; Status = " + status);

    transforms[0] = Fields.screen_width / 2;
    transforms[1] = Fields.screen_height / 2;
    transforms[2] = 0;
    transforms[3] = Fields.screen_height;
    pixels.put(transforms).position(0);
    GLES20.glTexSubImage2D(GLES20.GL_TEXTURE_2D, 0, 0, 0, 1, 1, GLES20.GL_RGBA, GLES20.GL_FLOAT, pixels);
    GLES20.glReadPixels(0, 0, 1, 1, GLES20.GL_RGBA, GLES20.GL_FLOAT, pixels);
    Log.d("X", "X=" + pixels.get(0));

    GLES20.glClearColor(.0f, .0f, .0f, 1.0f);
    GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);

    GLES20.glUseProgram(mPartProgramHandle);

    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, posTex);
    GLES20.glUniform1i(mPosTexHandle, 0);

    GLES20.glEnableVertexAttribArray(mPositionHandle);
    GLES20.glVertexAttribPointer(mPositionHandle, 2, GLES20.GL_FLOAT, false, 8, 0);

    // Clear the currently bound buffer (so future OpenGL calls do not use this buffer).
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);

    // Draw the cubes.
    GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, 6);

    //              if (!saved)
    //                  ShaderHelper.saveTexture(posTex, texW, texH, "test2");
    //              saved = true;

    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);
}

知道我将来如何生成此错误或建议以进行调试吗?

0 个答案:

没有答案