Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Программирование OpenGL  (Прочитано 3156 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн DenQ

  • Автор темы
  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Программирование OpenGL
« : 04 Июня 2010, 22:51:13 »
Всем доброго времени суток.
Я являюсь относительно новичком в линуксе, но могу уже программировать тут и на пхп, с/с++, perl... Под виндой я занимался программированием графики - OpenGL. И хотелось бы чтобы мой опыт и знания, перекачевали и в линукс системы.
Подскажите пожалуйста, что нужно прописать и куда, а самое важно где взять, чтобы я мог спокойно программить графику.
На данный момент не удается даже подключить GL/glut.h. В системе используется проприрететный драйвер ускорения графики.
И да, дистр ubuntu 8.04.

Оффлайн f-dzmitry

  • Участник
  • *
  • Сообщений: 168
    • Просмотр профиля
Re: Программирование OpenGL
« Ответ #1 : 04 Июня 2010, 22:58:45 »
sudo apt-get install  freeglut3-dev
 ;)
void next(){next();};

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: Программирование OpenGL
« Ответ #2 : 04 Июня 2010, 23:40:50 »
На всякий случай добавлю, что если ты знаешь какой именно файл тебе нужен, то пакет в котором он находится можно найти здесь: http://packages.ubuntu.com либо через apt-file.

Оффлайн DenQ

  • Автор темы
  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: Программирование OpenGL
« Ответ #3 : 05 Июня 2010, 00:05:42 »
f-dzmitry, огромное спасибо - я уже программирую. Но возникла очередная сложность - приложение компилится и запускается, однако работает некорректно - блымает, да так, что видно, все, что под ним находится(другие окна), - оно как бы просвечивается. И то, сначала оно вообще не показывалось, лишь pid создавался и все, а затем я решил добавить в код таймер и вот немножечко ситуация улучшилась. Игрался с буферами, ситуация меняется только в худшую сторону. А так же не видна шапка, как у всех других оконных приложений.
Что посоветуете?
Вот заголовочные файлы(может какого не хватает?):
#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glx.h>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <X11/keysym.h>
#include <iostream>
А вот так я все это компилю:
g++ hello.cpp -lglut -o hello
Есть предположение, что тут без Qt не обойтись. Но это только предположение.
VestniK, спасибо :) - полезно, уже добавил в закладки.

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: Программирование OpenGL
« Ответ #4 : 05 Июня 2010, 00:35:50 »
А каким боком тут Qt приплетать. Можно окно через функции GLUT сделать, можно через QGLWidget разница не велика.

Попробуй запустить что-нибудь использующее OpenGL, например glxgears, и посмотреть есть ли там такие-же проблемы. Может дело и не в твоей программе.

Я на всякий случай пересобрал и запустил пару своих примеров которые писал, чтобы разобраться в OpenGL. Один из redbook на GLUT другой свой, чуть посложней на Qt. В обоих вариантах всё одинаково гладко работает.

Оффлайн DenQ

  • Автор темы
  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: Программирование OpenGL
« Ответ #5 : 05 Июня 2010, 02:46:10 »
VestniK, а я и не знал, что тут есть такая замечательная программка. В среднем оно паказывает от 2500 - 3100, хотя бывает и 908 FPS :)
Поведение данной программы: тоже блымает, но намного реже, только когда перемещаются другие окна; так же я заметил, что она пытается перекрыть все остальное, что есть на экране, но перекрывает без шапки и приэтом блымает нереально. Когда включил коньки начала слегка притормаживать. Вот так вот, а вообще работает неплохо, терпимо, но хочется лучшего. Важной особенностью является, то, что у нее есть "шапка".
Что посоветуете?

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: Программирование OpenGL
« Ответ #6 : 05 Июня 2010, 03:10:06 »
Может быть это проявление вот этого бага: https://bugs.launchpad.net/ubuntu/+source/freeglut/+bug/369891

Попробуй отключить эффекты рабочего стола и запустить как свою прогу, так и glxgears.

У меня на интеловской встроенной в ноут карточке 915GM в KDE (Kubuntu 10.04) подобной проблемы не наблюдается. По идее, если это тот самый баг, что я привёл, то от карточки (драйвера) ничего зависить не должно, а вот от того compiz или kwin используется разница возможна.

Оффлайн DenQ

  • Автор темы
  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: Программирование OpenGL
« Ответ #7 : 05 Июня 2010, 05:03:55 »
VestniK, мне кажется все же, что это маловероятно, скорее проблема в моем коде. Если тебе не сложно, или кому еще, гляньте так сказать "по диагонали". Я лично, думаю, что я чего-то не так накодил в функции main. Хотя в студии на винде все работало. И конечно же код я малесь подправил - заголовочные файлы. Несмотря на громоздкость кода, он очень простой.

//compile g++ hello.cpp -lglut -o hello

#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glx.h>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <X11/keysym.h>
#include <iostream>

using namespace std;
//---CLASS MAP-----------------------------------------------------------------

class map{

GLdouble pos[16];

public:

map();

void scene();

};

map::map(){

pos[0] = 30.0f; pos[1] = 0.0f; pos[2] = 0.0f;

pos[3] = 0.0f; pos[4] = 30.0f; pos[5] = 0.0f;

pos[6] = -30.0f; pos[7] = 0.0f; pos[8] = 0.0f;

pos[9] = 0.0f; pos[10] = -30.0f; pos[11] = 0.0f;

pos[12] = 0.0f; pos[13] = 0.0f; pos[14] = 60.0f;

}

void map::scene(){

glBegin(GL_LINES);

glColor3f(1.0f, 0.0f, 0.0f);

glVertex3d(-400.0f, 0.0f, 0.0f);

glColor3f(0.1f, 0.1f, 0.1f);

glVertex3d( 400.0f, 0.0f, 0.0f);



glColor3f(0.0f, 1.0f, 0.0f);

glVertex3d(0.0f, -400.0f, 0.0f);

glColor3f(0.1f, 0.1f, 0.1f);

glVertex3d(0.0f, 400.0f,  0.0f);



glColor3f(0.0f, 0.0f, 1.0f);

glVertex3d(0.0f, 0.0f, -400.0f);

glColor3f(0.1f, 0.1f, 0.1f);

glVertex3d(0.0f, 0.0f, 400.0f);

glEnd();

}



class atom:public map{

public:

atom();

};

atom::atom(){

}



atom obj;

GLdouble CirclePoints = 100.0f;

void display() {



glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glColor3f (0.0, 0.0, 0.0);

obj.scene();



glutSwapBuffers();


}

void keyboard (unsigned char key, int x, int y){

   switch (key) {

   case 'x':

  glRotatef(10, 1.0f, 0.0f, 0.0f);

  glutPostRedisplay();

  break;

case 'X':

  glRotatef(-10, 1.0f, 0.0f, 0.0f);

  glutPostRedisplay();

  break;

case 'y':

  glRotatef(10, 0.0f, 1.0f, 0.0f);

  glutPostRedisplay();

  break;

case 'Y':

  glRotatef(-10, 0.0f, 1.0f, 0.0f);

  glutPostRedisplay();

  break;

  case 'z':

  glRotatef(10, 0.0f, 0.0f, 1.0f);

  glutPostRedisplay();

  break;

case 'Z':

  glRotatef(-10, 0.0f, 0.0f, 1.0f);

  glutPostRedisplay();

  break;

  case 27:

  exit(-1);

  break;

      default:

         break;

   }

}

void key_special_listen(int sym, int x, int y) {

switch(sym){

case GLUT_KEY_LEFT:

  glRotatef(-10, 0.0f, 0.0f, 1.0f);

  glutPostRedisplay();

break;

case GLUT_KEY_RIGHT:

  glRotatef(10, 0.0f, 0.0f, 1.0f);

  glutPostRedisplay();

break;

case GLUT_KEY_UP:

  glRotatef(-10, 1.0f, 0.0f, 0.0f);

  glutPostRedisplay();

break;

case GLUT_KEY_DOWN:

  glRotatef(10, 1.0f, 0.0f, 0.0f);

  glutPostRedisplay();

break;

}

}
//---

void TimerFunction(int value){

glutPostRedisplay();

glutTimerFunc(5, TimerFunction, 1);

}
//---

void MouseFunction(int button, int state, int x, int y){

}

void init () {

float pos[4] = {200,200,0, 0.0f};

float dir[3] = {-1,-1,-1};



glEnable(GL_DEPTH_TEST);

glEnable(GL_COLOR_MATERIAL);

glEnable(GL_LIGHTING);

glEnable(GL_LIGHT0);

glLightfv(GL_LIGHT0, GL_POSITION, pos);

glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, dir);





glClearColor (0.0, 0.0, 0.0, 0.0);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glOrtho(-400.0, 400.0, -400.0, 400.0, -400.0f, 400.0f);



}
int main(int argc, char** argv){
glutInit(&argc, argv);

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);

glutInitWindowSize (800, 600);

glutInitWindowPosition (200, 200);

glutCreateWindow ("Karkas");

init ();

glutDisplayFunc(display);

glutTimerFunc(33, TimerFunction, 1);

glutSpecialFunc(key_special_listen);

glutKeyboardFunc(keyboard);

glutMouseFunc(MouseFunction);

glutMainLoop();
return 0;
}

Оффлайн f-dzmitry

  • Участник
  • *
  • Сообщений: 168
    • Просмотр профиля
Re: Программирование OpenGL
« Ответ #8 : 05 Июня 2010, 09:19:41 »
Программа работает нормально. Ни каких сбоев и глюков, при включанных эффектах. ;)
Ubuntu 10.04
Видеокарта GeForce 9800 GT.
« Последнее редактирование: 05 Июня 2010, 09:23:22 от f-dzmitry »
void next(){next();};

Оффлайн DenQ

  • Автор темы
  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: Программирование OpenGL
« Ответ #9 : 05 Июня 2010, 09:37:18 »
f-dzmitry, в смысле моя программа(мой код)?
Или ты про glxgears?

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: Программирование OpenGL
« Ответ #10 : 05 Июня 2010, 09:40:58 »
По коду только одно маленькое замечание: DEPTH_BUFFER ты используешь, а в glutInitDisplayMode не указваешь, что он тебе нужен. Неплохо бы вызывать
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
Ну и по мелочи чисто стиливое: непонятно зачем по Esc ты возвращаешь -1. Казалось бы завершение штатное без ошибок и код возврата должен быть 0. Но это к делу отношения заведомо не имеет.

Код у меня абсолютно нормально заработал даже без модификаций.. А с компизом и эффектами возможно всё. Отключи эффекты и попробуй его ещё раз запустить. То что ты описываешь что glxgears тоже немного моргают намекает, что не всё в порядке.

К тому же баг на который я тебе ссылку дал, подтверждают несколько человек, а он имеет статус New и его в убунте не факт что починят. Скорей всего пока в дебиане это не исправят в убунте он будет.

Посмотри в темах GUI и Железо на предмет проблем с работой OpenGL приложений со включенными эффектами на твоей видеокарте. С большой вероятностью что-то найдёшь.

Оффлайн f-dzmitry

  • Участник
  • *
  • Сообщений: 168
    • Просмотр профиля
Re: Программирование OpenGL
« Ответ #11 : 05 Июня 2010, 09:57:06 »
Твой код. :) работает нормально.
« Последнее редактирование: 05 Июня 2010, 09:58:39 от f-dzmitry »
void next(){next();};

Оффлайн DenQ

  • Автор темы
  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: Программирование OpenGL
« Ответ #12 : 06 Июня 2010, 03:30:01 »
f-dzmitry, VestniK, ребят ну просто огромнейшее вас спасибо...
Убрал эффекты(сначала я просто отказывался в это верить) действительно все заработало, очень рад :)
А я уж было думал, придется мне тут только вебом заниматься...
Да код неидеален, и мне даже стыдно, это старый проект - каркас, я обычно с него начинаю, что-то серьезное, переделываю и там все такое...
В общем еще раз спасибо! :)

Оффлайн Упс

  • Старожил
  • *
  • Сообщений: 3231
    • Просмотр профиля
Re: Программирование OpenGL
« Ответ #13 : 06 Июня 2010, 06:58:55 »
xUbuntu 12.04

Оффлайн DenQ

  • Автор темы
  • Новичок
  • *
  • Сообщений: 30
    • Просмотр профиля
Re: Программирование OpenGL
« Ответ #14 : 06 Июня 2010, 13:57:23 »
Упс, еще пока особо нет, но думаю, что мне это пригодится :) так что спасибо. А вообще я старюсь не использовать  движки. Есть у меня такая идеология :)
Но сейчас вроде уже приходит понимание, того, что не зачем изобретать каждый раз велосипед, если все уже давным давно на нем ездят.

 

Страница сгенерирована за 0.032 секунд. Запросов: 25.