та gcc хөрвүүлэгчээ суулгасан байх гэдэгт итгэж байна. Линукс дээр OpenGL програмчлалыг сурахын тулд миний олж мэдсэнээр GLUT юмуу эсвэл SDL-ийн сангуудын аль нэг суулгасан байх хэрэгтэй. Өөр OpenGL програмчлалыг хийх GLX гэх мэт сангууд байдаг л юм шиг байна лээ. Миний хувьд энэ хоёр дээрээ жишээ болголоо. Сангуудыг суулгахын тулд System -> Administration -> Add/Remove Software гэж орно. Хайх хэсэгт нь sdl гэж бичээд find товчийг дараарай. Дараах сангуудыг чагтлаад apply товчин дээр дарж суулгаарай. SDL-ийн сангуудын хувьд:
- A cross-platform multimedia library. SDL-1.2.13-9.fc11 (i586)
- OpenGL extensions library using SDL. sage-0.2.0-4.fc11 (i586)
- Files needed to develop Simple DirectMedia Layer applications. SDL-devel-1.2.13-9.fc11 (i586)
- Graphics primitives, rotozoomer, framerate control and image filters. SDL_gfx-devel-2.0.17-2.fc11 (i586)
- Header files and static libraries for SDL_gfx. SDL_gfx-devel-2.0.17-2.fc11 (i586)
- Image loading library for SDL. SDL_image-1.2.6-7.fc11 (i586)
- Development files for SDL_image. SDL_image-devel-1.2.6-7.fc11 (i586)
- Simple DirectMedia Layer - Sample Mixer Library. SDL_mixer-1.2.8-12.fc11 (i586)
- Development files for SDL_mixer. SDL_mixer-devel-1.2.8-12.fc11 (i586)
- SDL portable network library. SDL_net-1.2.7-5.fc11 (i586)
- Development files for SDL_net. SDL_net-devel-1.2.7-5.fc11 (i586)
- Simple DirecMedia Layer TrueType Font library. SDL_ttf-2.0.9-5.fc11 (i586)
- Development files for SDL_ttf. SDL_ttf-devel-2.0.9-5.fc11 (i586)
- A freely licensed alternative to the GLUT library. freeglut-2.4.0-16.fc11 (i586)
- Freeglut development libraries and header files. freeglut-devel-2.4.0-16.fc11 (i586)
GLUT-ийн хувьд:
#include <GL/glut.h>
#define window_width 640
#define window_height 480
// Main loop
void main_loop_function()
{
// Z angle
static float angle;
// Clear color (screen)
// And depth (used internally to block obstructed objects)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Load identity matrix
glLoadIdentity();
// Multiply in translation matrix
glTranslatef(0,0, -10);
// Multiply in rotation matrix
glRotatef(angle, 0, 0, 1);
// Render colored quad
glBegin(GL_QUADS);
glColor3ub(255, 000, 000); glVertex2f(-1, 1);
glColor3ub(000, 255, 000); glVertex2f( 1, 1);
glColor3ub(000, 000, 255); glVertex2f( 1, -1);
glColor3ub(255, 255, 000); glVertex2f(-1, -1);
glEnd();
// Swap buffers (color buffers, makes previous render visible)
glutSwapBuffers();
// Increase angle to rotate
angle+=0.25;
}
// Initialze OpenGL perspective matrix
void GL_Setup(int width, int height)
{
glViewport( 0, 0, width, height );
glMatrixMode( GL_PROJECTION );
glEnable( GL_DEPTH_TEST );
gluPerspective( 45, (float)width/height, .1, 100 );
glMatrixMode( GL_MODELVIEW );
}
// Initialize GLUT and start main loop
int
main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitWindowSize(window_width, window_height);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
glutCreateWindow("GLUT Example!!!");
glutIdleFunc(main_loop_function);
GL_Setup(window_width, window_height);
glutMainLoop();
return 0;
}
хэрвээ test_glut.cpp гэж хадгалсан бол хөрвүүлэхдээ
#g++ -o test_glut test_glut.cpp -lglut
гэж хөрвүүлнэ. Програмаа ажиллуулахдаа
#./test_glut
ингээл болоо
Харин одоо OpenGL/SDL кодоо туршиж үзье:
#include <GL/gl.h>
#include <GL/glu.h>
#include <SDL/SDL.h>
#define window_width 640
#define window_height 480
// Keydown booleans
bool key[321];
// Process pending events
bool events()
{
SDL_Event event;
if( SDL_PollEvent(&event) )
{
switch( event.type )
{
case SDL_KEYDOWN : key[ event.key.keysym.sym ]=true ; break;
case SDL_KEYUP : key[ event.key.keysym.sym ]=false; break;
case SDL_QUIT : return false; break;
}
}
return true;
}
void main_loop_function()
{
float angle;
while( events() )
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0,0, -10);
glRotatef(angle, 0, 0, 1);
glBegin(GL_QUADS);
glColor3ub(255, 000, 000); glVertex2f(-1, 1);
glColor3ub(000, 255, 000); glVertex2f( 1, 1);
glColor3ub(000, 000, 255); glVertex2f( 1, -1);
glColor3ub(255, 255, 000); glVertex2f(-1, -1);
glEnd();
SDL_GL_SwapBuffers();
// Check keypresses
if( key[SDLK_RIGHT] ){ angle-=0.5; }
if( key[SDLK_LEFT ] ){ angle+=0.5; }
}
}
// Initialze OpenGL perspective matrix
void GL_Setup(int width, int height)
{
glViewport( 0, 0, width, height );
glMatrixMode( GL_PROJECTION );
glEnable( GL_DEPTH_TEST );
gluPerspective( 45, (float)width/height, 0.1, 100 );
glMatrixMode( GL_MODELVIEW );
}
int main()
{
// Initialize SDL with best video mode
SDL_Init(SDL_INIT_VIDEO);
const SDL_VideoInfo* info = SDL_GetVideoInfo();
int vidFlags = SDL_OPENGL | SDL_GL_DOUBLEBUFFER;
if (info->hw_available) {vidFlags |= SDL_HWSURFACE;}
else {vidFlags |= SDL_SWSURFACE;}
int bpp = info->vfmt->BitsPerPixel;
SDL_SetVideoMode(window_width, window_height, bpp, vidFlags);
GL_Setup(window_width, window_height);
main_loop_function();
}
энэ кодыг test_sdl.cpp гэж хадгалсан бол хөрвүүлэхдээ
#g++ -o test_sdl test_sdl.cpp -lSDL -lGL -lGLU
ажиллуулахдаа
#./test_sdl
Үр дүн нь дараах байдалтай харагдах болно


0 сэтгэгдэл:
Post a Comment