2011-12-01 21 views
5

Todavía estoy tratando de leer píxeles del sombreador de fragmentos y tengo algunas preguntas. Sé que gl_FragColor regresa con vec4 que significa RGBA, 4 canales. Después de eso, estoy usando glReadPixels para leer y escribir OBF en los datosgl_FragColor y glReadPixels

GLubyte *pixels = new GLubyte[640*480*4]; 
glReadPixels(0, 0, 640,480, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 

Esto funciona bien pero realmente tiene tema de la velocidad. En lugar de esto, solo quiero leer RGB, así que ignore los canales alfa. Intenté:

GLubyte *pixels = new GLubyte[640*480*3]; 
glReadPixels(0, 0, 640,480, GL_RGB, GL_UNSIGNED_BYTE, pixels); 

y esto no funcionó. Supongo que es porque gl_FragColor devuelve 4 canales y tal vez debería hacer algo antes de esto? En realidad, ya que mi imagen devuelta (gl_FragColor) es en escala de grises, hice algo así como

float gray = 0.5 //or some other values 
gl_FragColor = vec4(gray,gray,gray,1.0); 

Entonces, ¿hay alguna forma eficiente de utilizar glReadPixels en lugar de utilizar el primer método de 4 canales? ¿Cualquier sugerencia? Por cierto, esto es en código opengl es 2.0.

Respuesta

4

El OpenGL ES 2.0 spec dice que hay dos formas válidas de la llamada:

glReadPixels(x, y, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 

o

GLint format, type; 
glGetIntegerv(IMPLEMENTATION_COLOR_READ_FORMAT, &format); 
glGetIntegerv(IMPLEMENTATION_COLOR_READ_TYPE, &type); 
glReadPixels(x, y, w, h, format, type, pixels); 

Las combinaciones posibles para format y type están (pic tomadas de la especificación):

table

Y la implementación decidirá cuál está disponible para usted.

Sin embargo, es probable que si crea una superficie de representación de un formato apropiado, ese será el formato que obtendrá aquí. Vea si puede modificar su código para obtener un framebuffer RGB (es decir, con 0 bits para el canal alfa). ¿O quizás desee crear un objeto framebuffer fuera de pantalla para tal fin?

+0

Gracias por la respuesta! ¡Definitivamente lo intentaré pronto! ¿Pero puede darme más idea o descripción sobre el framebuffer fuera de pantalla? Soy un poco nuevo en gráficos, así que no estoy familiarizado con los términos. Tal vez un enlace para tutorial? ¡Gracias de nuevo! – user2168

+1

Un objeto de búfer de marco (FBO) es básicamente un objetivo de renderizado secundario que usted mismo crea. Puede contener un buffer de color, buffer de profundidad, buffer alfa o cualquier cosa. Luego puede dibujar (en lugar de a la "pantalla", es decir, el búfer de fotograma principal) y usar los resultados de alguna manera, por ejemplo, como una textura para los efectos, o para volver a leer los píxeles (en su caso). – Kos

+1

http://www.songho.ca/opengl/gl_fbo.html parece un buen tutorial práctico con código de ejemplo (para OpenGL, sin embargo, debe ser + - lo mismo en ES 2). También lea las especificaciones (vinculadas anteriormente, capítulo 4.4.3). – Kos

Cuestiones relacionadas