2010-12-06 3 views
1

Как получить информацию о глубине и цвете из любого рисунка OpenGL? Я хотел бы сохранить изображение глубины и цветное изображение на диск. Что я пробовал:glReadPixels GL_DEPTH_COMPONENT и цвет

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glEnable(GL_DEPTH_TEST); 

glBegin(GL_POINTS); 
    glColor3f(1.0f,1.0f,1.0f); 
    for(int i=0; i<mesh->vertices.size();i++) { 

     if(! mesh->colors.empty()) { 
      glColor3f(mesh->colors[i][0],mesh->colors[i][1],mesh->colors[i][2]); 
     } 

     float x= mesh->vertices[i][0]; 
     float y= mesh->vertices[i][1]; 
     float z = mesh->vertices[i][2];   
     glVertex3f(x, y, z); 

    } 

glEnd(); 

glFlush(); 
glFinish(); 

int width = 1280; 
int height = 960; 

GLfloat* depths; 
depths = new GLfloat[ width * height ]; 

GLfloat * color; 
color = new GLfloat[width * height]; 

glReadPixels (0, 0, width, height, GL_DEPTH_COMPONENT, GL_FLOAT, depths); 
glReadPixels (0, 0, width, height, GL_BLUE, GL_FLOAT, color); 

Но похоже, что заполняется только массив глубин?

+0

Есть ли у вас какие-либо из ваших вершинных цветов «сетки»? – genpfault 2010-12-06 19:37:02

ответ

0

Попробуйте это:

#include <GL/freeglut.h> 
#include <vector> 
#include <sstream> 

int mx = 0, my = 0; 
void passiveMotion(int x, int y) 
{ 
    mx = x; 
    my = glutGet(GLUT_WINDOW_HEIGHT) - y; 
    glutPostRedisplay(); 
} 

void display() 
{ 
    glEnable(GL_DEPTH_TEST); 
    glClearColor(0, 0, 0, 1); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    const int w = glutGet(GLUT_WINDOW_WIDTH); 
    const int h = glutGet(GLUT_WINDOW_HEIGHT); 
    const double ar = (double)w/(double)h; 
    glOrtho(-10 * ar, 10 * ar, -10, 10, -10, 10); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glColor3ub(0,255,0); 
    glPushMatrix(); 
     glTranslated(2,2,-5); 
     glScalef(5,5,5); 
     glBegin(GL_QUADS); 
      glVertex2f(-1,-1); 
      glVertex2f(1,-1); 
      glVertex2f(1,1); 
      glVertex2f(-1,1); 
     glEnd(); 
    glPopMatrix(); 

    glColor3ub(255,0,0); 
    glPushMatrix(); 
     glTranslated(0,0,0); 
     glScalef(5,5,5); 
     glBegin(GL_QUADS); 
      glVertex2f(-1,-1); 
      glVertex2f(1,-1); 
      glVertex2f(1,1); 
      glVertex2f(-1,1); 
     glEnd(); 
    glPopMatrix(); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0, w, 0, h, -1, 1); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    // print depth 
    { 
     GLfloat depth = 0.0f; 
     glReadPixels(mx, my, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &depth); 
     std::ostringstream oss; 
     oss << "Depth: " << depth; 
     glColor3ub(255, 255, 255); 
     glRasterPos2i(10, 10); 
     glutBitmapString(GLUT_BITMAP_9_BY_15, (const unsigned char*)oss.str().c_str()); 
    } 

    // print color 
    { 
     GLubyte color[4]; 
     glReadPixels(mx, my, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, color); 
     std::ostringstream oss; 
     oss << "Color:" 
      << " " << (unsigned int)color[0] 
      << " " << (unsigned int)color[1] 
      << " " << (unsigned int)color[2] 
      << " " << (unsigned int)color[3]; 
     glColor3ub(255, 255, 255); 
     glRasterPos2i(10, 25); 
     glutBitmapString(GLUT_BITMAP_9_BY_15, (const unsigned char*)oss.str().c_str()); 
    } 

    glutSwapBuffers(); 
} 

int main(int argc, char** argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE); 
    glutInitWindowSize(400,400); 
    glutCreateWindow("GLUT"); 
    glutDisplayFunc(display); 
    glutPassiveMotionFunc(passiveMotion); 
    glutMainLoop(); 
    return 0; 
} 
0

Для сохранения результата визуализации в изображении, вы должны сохранить colorbuffer информации (не непосредственно из буфера глубины).

Вы можете предоставить отдельные пропуски для цвета (для цветного буфера) и глубины для того же цвета. И просто используйте glReadPixels два раза, сначала после рендеринга цвета в colorbuffer и второй после глубины рендеринга в colorbuffer.

Для записи цвета и глубины одновременно в двух отдельных цветовых буферах за один проход вы можете использовать MRT (несколько целей визуализации), учебник - http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-14-render-to-texture/.

Я бы выбрал MRT. :) После этого вы можете сохранить свои результаты, используя glReadPixels, как в технике с двумя проходами.

Но сначала вы должны настроить, из которого colorbuffer вы хотите прочитать пиксели с помощью glReadBuffer, по умолчанию colorbuffer является GL_BACK, что означает, по умолчанию контекста OpenGL BackBuffer. Используя MRT, вы должны использовать один из GL_COLOR_ATTACHMENTi для записи в цветные буферы, и он также может быть одним из значений glReadBuffer.

Так, только простая установка glReadBuffer с одним из GL_COLOR_ATTACHMENTi и использовать glReadPixels.

Смежные вопросы