2009/07/05

fedora 11 дээрээ OpenGL тохируулсан нь

Федорх 11 нь график картаа асуудалгүй танидаг болсон байна лээ. Миний ком график картгүй гэхдээ интелийн өөрийнх GMA(Graphic Media Accelerator)-г шууд таниж байна лээ. График картгүй ч гэсэн 3D тоглоомууд данга ажиллаж байна лээ. Тэхээр эхлээд C/C++ хэлээр OpenGL програмчилж сурахын тулд таны ком дээр крафик картны драйвер таних талын асуудлууд эхлээд шийдэгдсэн байх хэрэгтэй.
та 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)
GLUT сангийн хувьд glut гэж бичиж өмнөх шигээ хайгаад дараах сангуудыг чагтлаад apply дараарай:
  • 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 сэтгэгдэл: