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

如何创建屏幕外纹理并在Android上使用OpenGL ES 2,android,opengl-es,Android,Opengl Es,我是OpenGL的新手 如何创建屏幕外纹理,以便获得它的一些信息(例如,通过单击“查看纹理”获取像素颜色) 我尝试了很多东西,比如FBO,但都没用。我无法想象如何将位图加载到屏幕外的纹理并获取它的信息。我非常沮丧:/ 编辑: 以教程为例,我不知道它是否适合我的问题创建帧缓冲区 public void createFramebuffer(GL10 gl) { FloatBuffer uvBuffer2; int texture[] = new int[1]; GLES2

我是OpenGL的新手

如何创建屏幕外纹理,以便获得它的一些信息(例如,通过单击“查看纹理”获取像素颜色)

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

编辑: 以教程为例,我不知道它是否适合我的问题<代码>创建帧缓冲区

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
}
过分简化:

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

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

这似乎不是你想要的:

  • “如何创建屏幕外纹理?”什么是屏幕上纹理?所有纹理都在屏幕外
  • “获取一些信息”?什么,纹理?!基本上有两种创建纹理的方法:第一种是使用图像,而不是从源图像查找纹理。第二种是通过绘图,这是需要读取像素的FBO过程(请尝试
    glReadPixels
  • “例如,点击查看纹理的像素颜色”点击什么?!您可以单击视图/屏幕,但不能单击纹理。如果您再次需要之前看到的渲染视图的示例,那么您需要做的就是按照前面的描述读取像素

看起来您要查找的只是
glReadPixels
,以从当前缓冲区获取颜色值。如果不是这样,请重新表述您的问题,并解释您的目标。

FBO是实现这一目标的方法。发布您的代码,以便我们可以看到它可能有什么问题。发布了我的FBO,但我看不到任何位图已加载。抱歉,无法尝试。我现在就来写结果。我想点击屏幕(纹理),它显示第一张带有黑条的图片。之后,我想转换点击坐标,得到第二幅图像的颜色(纹理),位置完全相同。有点像用用户拖动的第二幅图像给第一幅图像上色?是的,我想用第二幅图像的颜色给第一幅图像上色。你不需要任何额外的缓冲区或屏幕外的东西。我建议您为此使用模具缓冲区。当用户单击时,在模具缓冲区上绘制一个圆(大点)。然后在绘制方法中,您通常绘制第一个图像(背景),然后使用模具缓冲区绘制第二个图像,这样第二个图像将仅在模具为1的位置(用户已单击的位置)绘制。听起来,我需要更多图像来实现这一点?我替换了我的
createFramebuffer
方法。它似乎抓住了我想要的结果。我现在用我想要的图像(第二个彩色图像)创建缓冲区。第一次尝试时,我在
createFramebuffer
方法中使用
GLES20.GL\u texture\u 2D
加载了第二个纹理。然而,视图中显示了第二个缓冲区。然后我将所有的
GLES20.GL_TEXTURE_2D
更改为
GLES20.GL_TEXTURE0
。结果是,第二张图像没有显示,但它也没有采用第二张图像的颜色。那么,如何将帧缓冲区与
glReadPixels
一起使用呢?