Aurelio
Aurelio

Reputation: 115

OpenGL: How to generate a pixels value of the image frame but not on the screen, only to the array in the program

I want to have in the program (OpenGL) can capture pixels frames from the observer to the specified array. How to do it?

Here is a sample code:

#include <GL/glut.h>
#include <stdlib.h>

// stałe do obsługi menu podręcznego

enum
{
    FULL_WINDOW, // aspekt obrazu - całe okno
    ASPECT_1_1, // aspekt obrazu 1:1
    EXIT // wyjście
};

// aspekt obrazu

int Aspect = FULL_WINDOW;

// wpółrzędne położenia obserwatora

GLdouble eyex = 0;
GLdouble eyey = 0;
GLdouble eyez = 3;

// współrzędne punktu w którego kierunku jest zwrócony obserwator,

GLdouble centerx = 0;
GLdouble centery = 0;
GLdouble centerz = - 100;

// funkcja generująca scenę 3D

void Display()
{
    // kolor tła - zawartość bufora koloru
    glClearColor( 1.0, 1.0, 1.0, 1.0 );

    // czyszczenie bufora koloru
    glClear( GL_COLOR_BUFFER_BIT );

    // wybór macierzy modelowania
    glMatrixMode( GL_MODELVIEW );

    // macierz modelowania = macierz jednostkowa
    glLoadIdentity();

    // ustawienie obserwatora
    gluLookAt( eyex, eyey, eyez, centerx, centery, centerz, 0, 1, 0 );

    // kolor krawędzi sześcianu
    glColor3f( 0.0, 0.0, 0.0 );

    // początek definicji krawędzi sześcianu
    glBegin( GL_LINES );

    // wspólrzędne kolejnych krawędzi sześcianu
    glVertex3f( 1.0, 1.0, 1.0 );
    glVertex3f( 1.0, - 1.0, 1.0 );

    glVertex3f( 1.0, - 1.0, 1.0 );
    glVertex3f( 1.0, - 1.0, - 1.0 );

    glVertex3f( 1.0, - 1.0, - 1.0 );
    glVertex3f( 1.0, 1.0, - 1.0 );

    glVertex3f( 1.0, 1.0, - 1.0 );
    glVertex3f( 1.0, 1.0, 1.0 );

    glVertex3f( - 1.0, 1.0, 1.0 );
    glVertex3f( - 1.0, - 1.0, 1.0 );

    glVertex3f( - 1.0, - 1.0, 1.0 );
    glVertex3f( - 1.0, - 1.0, - 1.0 );

    glVertex3f( - 1.0, - 1.0, - 1.0 );
    glVertex3f( - 1.0, 1.0, - 1.0 );

    glVertex3f( - 1.0, 1.0, - 1.0 );
    glVertex3f( - 1.0, 1.0, 1.0 );

    glVertex3f( 1.0, 1.0, 1.0 );
    glVertex3f( - 1.0, 1.0, 1.0 );

    glVertex3f( 1.0, - 1.0, 1.0 );
    glVertex3f( - 1.0, - 1.0, 1.0 );

    glVertex3f( 1.0, - 1.0, - 1.0 );
    glVertex3f( - 1.0, - 1.0, - 1.0 );

    glVertex3f( 1.0, 1.0, - 1.0 );
    glVertex3f( - 1.0, 1.0, - 1.0 );

    // koniec definicji prymitywu
    glEnd();

    // skierowanie poleceń do wykonania
    glFlush();

    // zamiana buforów koloru
    glutSwapBuffers();
}

// zmiana wielkości okna

void Reshape( int width, int height )
{
    // obszar renderingu - całe okno
    glViewport( 0, 0, width, height );

    // wybór macierzy rzutowania
    glMatrixMode( GL_PROJECTION );

    // macierz rzutowania = macierz jednostkowa
    glLoadIdentity();

    // parametry bryły obcinania
    if( Aspect == ASPECT_1_1 )
    {
        // wysokość okna większa od wysokości okna
        if( width < height && width > 0 )
             glFrustum( - 2.0, 2.0, - 2.0 * height / width, 2.0 * height / width, 1.0, 5.0 );
        else

        // szerokość okna większa lub równa wysokości okna
        if( width >= height && height > 0 )
             glFrustum( - 2.0 * width / height, 2.0 * width / height, - 2.0, 2.0, 1.0, 5.0 );

    }
    else
         glFrustum( - 2.0, 2.0, - 2.0, 2.0, 1.0, 5.0 );

    // generowanie sceny 3D
    Display();
}

// obsługa klawiatury

void Keyboard( unsigned char key, int x, int y )
{
    // klawisz +
    if( key == '+' )
         eyez -= 0.1;
    else

    // klawisz -
    if( key == '-' )
         eyez += 0.1;

    // odrysowanie okna
    Reshape( glutGet( GLUT_WINDOW_WIDTH ), glutGet( GLUT_WINDOW_HEIGHT ) );
}

// obsługa klawiszy funkcyjnych i klawiszy kursora

void SpecialKeys( int key, int x, int y )
{
    switch( key )
    {
        // kursor w lewo
    case GLUT_KEY_LEFT:
        eyex += 0.1;
        break;

        // kursor w górę
    case GLUT_KEY_UP:
        eyey -= 0.1;
        break;

        // kursor w prawo
    case GLUT_KEY_RIGHT:
        eyex -= 0.1;
        break;

        // kursor w dół
    case GLUT_KEY_DOWN:
        eyey += 0.1;
        break;

        // do przodu
    case GLUT_KEY_PAGE_UP:
        eyez += 0.1;
        break;

        // do tylu
    case GLUT_KEY_PAGE_DOWN:
        eyez -= 0.1;
        break;

        // cel oddal
    case GLUT_KEY_F1:
        centery -= 0.3;
        break;

        // cel przybliz
    case GLUT_KEY_F2:
        centery += 0.3;
        break;
    }

    // odrysowanie okna
    Reshape( glutGet( GLUT_WINDOW_WIDTH ), glutGet( GLUT_WINDOW_HEIGHT ) );
}

// obsługa menu podręcznego

void Menu( int value )
{
    switch( value )
    {
        // obszar renderingu - całe okno
    case FULL_WINDOW:
        Aspect = FULL_WINDOW;
        Reshape( glutGet( GLUT_WINDOW_WIDTH ), glutGet( GLUT_WINDOW_HEIGHT ) );
        break;

        // obszar renderingu - aspekt 1:1
    case ASPECT_1_1:
        Aspect = ASPECT_1_1;
        Reshape( glutGet( GLUT_WINDOW_WIDTH ), glutGet( GLUT_WINDOW_HEIGHT ) );
        break;

        // wyjście
    case EXIT:
        exit( 0 );
    }
}

int main( int argc, char * argv[] )
{
    // inicjalizacja biblioteki GLUT
    glutInit( & argc, argv );

    // inicjalizacja bufora ramki
    glutInitDisplayMode( GLUT_DOUBLE | GLUT_RGB );

    // rozmiary głównego okna programu
    glutInitWindowSize( 400, 400 );

    // utworzenie głównego okna programu
    #ifdef WIN32

    glutCreateWindow( "Sześcian 4" );
    #else

    glutCreateWindow( "Szescian 4" );
    #endif

    // dołączenie funkcji generującej scenę 3D
    glutDisplayFunc( Display );

    // dołączenie funkcji wywoływanej przy zmianie rozmiaru okna
    glutReshapeFunc( Reshape );

    // dołączenie funkcji obsługi klawiatury
    glutKeyboardFunc( Keyboard );

    // dołączenie funkcji obsługi klawiszy funkcyjnych i klawiszy kursora
    glutSpecialFunc( SpecialKeys );

    // utworzenie menu podręcznego
    glutCreateMenu( Menu );

    // dodanie pozycji do menu podręcznego
    #ifdef WIN32

    glutAddMenuEntry( "Aspekt obrazu - całe okno", FULL_WINDOW );
    glutAddMenuEntry( "Aspekt obrazu 1:1", ASPECT_1_1 );
    glutAddMenuEntry( "Wyjście", EXIT );
    #else

    glutAddMenuEntry( "Aspekt obrazu - cale okno", FULL_WINDOW );
    glutAddMenuEntry( "Aspekt obrazu 1:1", ASPECT_1_1 );
    glutAddMenuEntry( "Wyjscie", EXIT );
    #endif

    // określenie przycisku myszki obsługującej menu podręczne
    glutAttachMenu( GLUT_RIGHT_BUTTON );

    // wprowadzenie programu do obsługi pętli komunikatów
    glutMainLoop();
    return 0;
}

I would ask for information (with sample code) on how to do it.

Upvotes: 0

Views: 46

Answers (1)

datenwolf
datenwolf

Reputation: 162297

Use a Framebuffer Object (FBO) to render offscreen, then read from there. You can find lots of tutorials out there and a lot of Q&A related to FBOs here on StackOverflow.

Upvotes: 1

Related Questions