如何创建屏幕外纹理并在Android上使用OpenGL ES 2
我是OpenGL的新手 如何创建屏幕外纹理,以便获得它的一些信息(例如,通过单击“查看纹理”获取像素颜色) 我尝试了很多东西,比如FBO,但都没用。我无法想象如何将位图加载到屏幕外的纹理并获取它的信息。我非常沮丧:/ 编辑: 以教程为例,我不知道它是否适合我的问题<代码>创建帧缓冲区如何创建屏幕外纹理并在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
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
一起使用呢?