如何创建屏幕外纹理并在Android上使用OpenGL ES 2

时间:2014-06-20 12:33:03

标签: android opengl-es

我是OpenGL的新手。

如何创建一个屏幕外纹理,以便我可以获得它的一些信息(例如通过点击视图纹理获得PixelColor)?

我尝试了很多东西,例如FBO,但它确实没有用。我没有想象如何将位图加载到屏幕外纹理并获取它的信息。我很沮丧:/

Task

修改this教程为例,不知道它是否适合我的问题。 createFramebuffer

public void createFramebuffer(GL10 gl) {

    FloatBuffer uvBuffer2;
    int texture[] = new int[1];
    GLES20.glGenTextures(1, texture, 0);
    GLES20.glBindTexture(GLES20.GL_TEXTURE0, texture[0]);

    float uvs2[] = {
               0.0f, 0.0f,
               0.0f, 1.0f,
               1.0f, 1.0f,
               1.0f, 0.0f
       };

    ByteBuffer bb = ByteBuffer.allocateDirect(uvs2.length * 4);
    bb.order(ByteOrder.nativeOrder());
    uvBuffer2 = bb.asFloatBuffer();
    uvBuffer2.put(uvs2);
    uvBuffer2.position(0);

    gl.glTexCoordPointer(2, GLES20.GL_BYTE, 0, uvBuffer2);

    //load image
    int idTest = mContext.getResources().getIdentifier("drawable/testgroesse", null, mContext.getPackageName());
    Bitmap wood = BitmapFactory.decodeResource(mContext.getResources(), idTest);

    GLES20.glTexParameterf(GLES20.GL_TEXTURE0, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
    GLES20.glTexParameterf(GLES20.GL_TEXTURE0, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);

    GLUtils.texImage2D(GLES20.GL_TEXTURE0, 0, wood, 0); 

    GLES20.glEnable(GLES20.GL_TEXTURE0);
    gl.glEnableClientState(GLES20.GL_TEXTURE0);

    //color picking background start
    ByteBuffer bytePickedColor = ByteBuffer.allocate(4);
    bytePickedColor.order(ByteOrder.nativeOrder());
    GLES20.glFlush();

    GLES20.glReadPixels(touchXint, touchYint, 1, 1, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, bytePickedColor);

    byte b[] = new byte[4];
    bytePickedColor.get(b);
    String key = "" + b[0] + " " + b[1] + " " + b[2] + " " + b[3];
    Log.d("Color_Farbe: ", key);
    bytePickedColor.rewind();
    //color picking background end
}

1 个答案:

答案 0 :(得分:2)

过度简化:

您创建的FBO是一个包含RGBA + 16位深度的BUFFER。通过附加纹理,您可以重复使用纹理,因为它将具有与FBO相同的RGBA数据。在开始时缓冲区本身仍然是空的,你仍然需要清除它并像任何其他渲染缓冲区一样绘制它。

因此,要将图像/纹理放在该缓冲区上,您需要创建纹理(使用该图像)并在此FBO上绘制纹理矩形。

看起来这不是你想要的:

  • "如何创建屏幕外纹理?"什么是屏幕纹理?所有纹理都在屏幕外。
  • "获取一些信息"?什么,质地?!基本上有两种创建纹理的方法:首先是图像,在这种情况下,从源图像中查找纹素。其次是绘制哪个是你需要读取像素的FBO程序(试试glReadPixels)。
  • " e.g。 PixelColor通过点击视图纹理"点击什么?!您可以单击视图/屏幕,但不能单击纹理。如果您再次需要在之前看到的渲染视图的样本,那么您需要做的就是读取前面描述的像素。

看起来你正在寻找的只是glReadPixels来获取当前缓冲区的颜色值。如果不是这种情况,请重新解释您的问题并解释您的目标是什么。