我是OpenGL的新手。
如何创建一个屏幕外纹理,以便我可以获得它的一些信息(例如通过点击视图纹理获得PixelColor)?
我尝试了很多东西,例如FBO,但它确实没有用。我没有想象如何将位图加载到屏幕外纹理并获取它的信息。我很沮丧:/
修改
以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
}
答案 0 :(得分:2)
过度简化:
您创建的FBO是一个包含RGBA + 16位深度的BUFFER。通过附加纹理,您可以重复使用纹理,因为它将具有与FBO相同的RGBA数据。在开始时缓冲区本身仍然是空的,你仍然需要清除它并像任何其他渲染缓冲区一样绘制它。
因此,要将图像/纹理放在该缓冲区上,您需要创建纹理(使用该图像)并在此FBO上绘制纹理矩形。
看起来这不是你想要的:
glReadPixels
)。看起来你正在寻找的只是glReadPixels
来获取当前缓冲区的颜色值。如果不是这种情况,请重新解释您的问题并解释您的目标是什么。