Reputation: 115
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
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