OpenGL в Linux

Цикл уроков по программированию OpenGL в Linux.Примечаниев первом уроке не будем расматривать CodeBlocks и SDL, но подготовим все до следующих уроковЧасть 0.1 - немного об Linux.Linux, произносится «ли́нукс» (также GNU/Linux, произносится «гну ли́нукс» или «гну слэш ли́нукс»]) — общее название Unix-подобных операционных систем на основе одноимённого ядра и собранных для него библиотек и системных программ, разработанных в рамках проекта GNU.Linux работает на PC-совместимых системах семейства Intel x86, а также на x86-64, PowerPC, ARM, Alpha AXP, Sun SPARC, Motorola 68000, Hitachi SuperH, IBM S/390, MIPS, HP PA-RISC, AXIS CRIS, Renesas M32R, Atmel AVR32, Renesas H8/300, NEC V850, Tensilica Xtensa и многих других.В отличие от большинства других операционных систем, Linux не имеет единой « официальной » комплектации. Вместо этого Linux поставляется в большом количестве так называемых дистрибутивов, в которых ядро Linux соединяется с утилитами GNU и другими прикладными программами (например, X.org), делающими её полноценной многофункциональной операционной средой.Наиболее известными дистрибутивами Linux являются Arch Linux, CentOS, Debian, Fedora, Gentoo, Mandriva, Mint, openSUSE, Red Hat, Slackware, Ubuntu.Российские дистрибутивы — ALT Linux, ASPLinux, Calculate Linux, НауЛинукс, AgiliaLinux (ранее MOPSLinux) и Linux XPЧасть 1 - подготавливаемся.будем работать без компиляторатак что скачивать его не надотак будет прощепоставим компилятор g++. Заходим в Synaptic и пишем в поиске g++. Ставим галку напротив g++-4.4 и напротив libstdc++6-4.4-dev жмем применить и ждем пока все поставится.Часть 2 - создаем первый проект на С++.1. Запускаем терминал (я у себя поставил его запуск на тильду)2. В нем сразу мы находимся в домашнем каталоге. это можно проверить написав pwd и перед вами напишется строчка в каком каталоге вы находитесь. я предлагаю создать еще один каталог Projects в терминале все делается просто написав mkdir <название каталога> у меня это команда mkdir Projects/теперь в него надо перейти. для этого есть команда cd <название каталога> у меня это cd Projects/примечание: терминал чуствителен к регистру так что если у вас папка Projects/ а вы напишете projects/ то не перейдети еще для быстрого набора используйте TAB напишите Pro и нажмите TAB и у вас автоматически допишется Projects/3. ну вот каталог для проектов сделали теперь давайте напишем сам исходный код. напишем следующее gedit main.cpp это означает что мы включаем текстовый редактор gedit и создаем в папке в которой находимся файл main.cppпримечание: gedit раскрашивает текст в cpp файлах так что будет удобно писать =)теперь перед вами откроется окно редактора.4. начнем писать коддаже если вы совсем не знаете OpenGL то после этой статьи вы сможете свободно рисовать 2D графику и будете свободно ориентироваться в коде. каждую строчку кода я буду комментироватьпишем следующий код:

/*http://esate.ru, isaer*/


//подключаем библиотеку glut
#include &lt;GL/glut.h&gt;

void dis() //вот и та функция дисплея 
{

   glClear(GL_COLOR_BUFFER_BIT);//очищаем буфер цвета
   glPointSize(5);//устанавливаем размер точки (так как если не установим, то она будет очень маленькой)
   glBegin(GL_POINTS);//начинаем рисовать точку (также есть и другие флаги как GL_LINES GL_TRAINGLE (вроде так =)) ) если вы рисуете линии то вам надо указать 2 точки и нарисуются линии
   glColor3f(0.0, 0.0, 0.0);// устанавливаем цвет которым будем рисовать (если вы рисуете много точек или линий то можно пере тем как нарисовать что- либо установить для него цвет, если вам не устраивает цвет то 0 до 1 то можно установить glColor3ub и тогда будут 255 цвета
   glVertex2f(0.25, 0.25);//рисуем точку 2f означает, что мы будем рисовать в 2 координатах и там координаты (а теперь можно пояснить glOrtho если бы мы установили размер экрана 100х100 то и поставили в glOrtho значение glOrtho(0.0, 100, 0.0, 100, -1.0, 1.0); то эту точку можно было бы нарисовать так glVertex2f(25, 25); и она была бы там же (да и если мы написали бы вместо 100 480 она была бы там ) надеюсь разобрались
   //если вам надо много точек то не надо писать заново все с glBegin и тд можно просто написать сюда множество точек и  они нарисуются
   glEnd();//заканчиваем рисовать
   glFlush();//отрисовываем все что нарисовали

}
int main(int argc, char **argv)//точка входа приложения
{
   glutInit(&amp;argc, argv);//инициализация glut
   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //установка дисплея GLUT_SINGLE означает что мы будем использовать 1 буфер (для 2D графики) а GLUT_RGB означает что мы будем использовать RGB цвета
   glutInitWindowSize(480, 480);//устанавливаем размер окна 
   glutInitWindowPosition(200, 200);//устанавливаем положение окна при запуске
   glutCreateWindow("First programm");//создаем окно с названием "First program"
   glClearColor(1.0, 1.0, 1.0, 1.0);//очищаем окно в белый цвет
   glMatrixMode(GL_PROJECTION);//устанавливаем матрицу проекции
   glLoadIdentity();//сбрасываем матрицу (устанавливаем нулевую)
   glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);//устанавливаем ортогональный вид (или как он там называется в скобках значения)
   // которым будет все измеряться то есть первые 2 - это по Х, вторые 2 - это про У и третьи 2 - это по Z. для более подробного понятия 
   // значения от нуля до единицы по Х это будет само окно, то есть  480 (не знаю как объяснить) значение Z не имеет значения так как мы рисуем 2D
   glutDisplayFunc(dis);//указываем функцию дисплея(ну или рисования)
   glutMainLoop();//цикл обработки всякого (типа нажатия на клавишу и тд)
}

5. ну теперь закрываем редактор, теперь надо все это дело откомпилировать. в терминале пишем g++ main.cpp -lglut -o opengl тут вроде все понятно компилируем файл main.cpp и ставим с библиотеками glut, а -o означает файл будет на выходе, теперь все это дело надо запустим в терминале пишем gdb opengl перед вами тут всякое напишется теперь пишем run теперь ваше приложение запустится чт бы выйти из отладки напишите quitна этом урок законченесли вы хотите компилировать проекты не OpenGL то просто напиши g++ file.cpp -o fileтам где file.cpp это ваш С++ файл а там где -o file это файл на выходе (вместо file пишите что угодно).надеюсь урок будет полезенпонравилось? поставь плюсик
0       9233        05.08.2010        33

0  
05.08.2010 00:00:00
Да =))
написал первый урок =)
переписывал его 3 раза =))
и вот он итоговый вариант =))
теперь надо только выделить код что бы виден нормально был
подскажите что как сделать что бы он нормально выглядел
0  
05.08.2010 00:00:00
и еще просто не знал куда написать это вот решил в коменты написать
SDL это типа Glut но только мощнее намного
в нем намного больше всего он кроссплатформенный как и Glut
в общем он там нам не понадобится оч так сильно
надо будет только для инициализации окна обработке клавишь
так что код написаный с помощью SDL можно легко переделать под Glut
так что уроки полезны будут всем
да и большинство уроков в сети (теже самые nehe) написаны без glut
0  
05.08.2010 00:00:00
Ответил в топике «Проблема с массивом вершин (GL_VERTEX_ARRAY).», ты там коммент оставлял.
0  
05.08.2010 00:00:00
Кстати, чтобы текст топика не висел до самого конца страницы, нужно в редакторе html, который при создании можно вызвать, написать <cut>, тогда все что ниже свернется под кнопку «Читать далее». Этот совет висел справа на странице, когда ты топик создавал :)
0  
05.08.2010 00:00:00
да так норм
решил убрать SDL
так как сам сейчас на нем попрограммил и понял что он слишком бредовый
оч сложно понять
glut намного лучше
а со звуком и тд и тп можно пристроить будет как нить отдельно
0  
05.08.2010 00:00:00
и там в main скобки не стоят
поставить не могу так как редоктирую у мя все с начала приходится
0  
06.08.2010 00:00:00
вечером постараюсь глянуть (помочь с оформлением).

Одна просьба — прогонять орфографию и пунктуацию вордом перед публикацией.
0  
06.08.2010 00:00:00
как я тебе это сделаю??
ну как ты думаеш мог бы я написать статью про то что не знаю??
у мя у самого стоит линукс
там ворда нет
ок и еще выкинь на главную про геймдев может кого заинтересует
0  
06.08.2010 00:00:00
опа
а куда делась инфа про SDL и CodeBlocks
0  
09.01.2011 00:00:00
Супер статья! Теперь в Linux знаю как откомпилить, большое спасибо за урок!
0  
22.01.2011 00:00:00
рад =)
0  
31.01.2011 00:00:00
Статья супер! А в eclipse не знаете как можно скомпилировать? Ну ли в NetBeans.
0  
01.02.2011 00:00:00
нет, к сожалению не знаю, даже не видел эти IDE, по мне так самый лучший это Code::Blocks =)
0  
01.02.2011 00:00:00
0  
01.02.2011 00:00:00
А будут ли еще уроки по разработке в Linux?
Ведь тут есть намек на продолжение:
в первом уроке не будем расматривать CodeBlocks и SDL, но подготовим все до следующих уроков=))
CodeBlocks ваще незнаю — это я так тонко намекаю)), на просьбу продолжать освещать Linux.
0  
01.02.2011 00:00:00
да я его и сам толком не знаю
умею только настраивать под себя =) ну и там библиотеки подключать
сделаю как нить урок про мой любимый C::B =))

вот только сейчас наобещаю уроков разных и не сделаю их то будет плохо =(( так что вы там пишите мне что бы я не забыл про них

попрошу у админов сделать ветку про линукс и буду там описывать все что сам знаю =)
0  
01.02.2011 00:00:00
попрошу у админов сделать ветку про линукс и буду там описывать все что сам знаю =)Буду ждать. Надо срочно искать место, чтоб Линукс поставить))) а то пришлось windows обратно ставить а места мало было, и пришлось Linux сносить((((
0  
01.02.2011 00:00:00
А ты Blender хорошо знаешь?)
Мне надо объект в центр координат сдвинуть, чтоб 0,0,0 было по центру объекта. Не подскажешь как сделать?
0  
01.02.2011 00:00:00
жмешь N на клавиатуре и там будет справа окошко (конешн надо переж этим объект выделить) потом там будет 3 поля в которых распологается этот объект всмысле координаты, там и ставь их, блендер знаю намного, когда то хотелл стать великим моделлером =))
0  
02.02.2011 00:00:00
Сенк, за отклик.
У меня объект составной(экспортированный с 3ds), двигается только его центральная часть.
Нет другого способа?
у мя как то раз получилось, я клацал де то в object=>Transform но не понял, что помогло. А больше не получалось.(
Заранее спасибо.
0  
02.02.2011 00:00:00
кинь файл, а то я чет не совсем понял о чем ты
0  
02.02.2011 00:00:00
Куда кинуть можно?
0  
02.02.2011 00:00:00
файлообменник
0  
02.02.2011 00:00:00
А можно скайп или почта? Не хочу региться на обменике.
0  
03.02.2011 00:00:00
зачем регаться?? depositfiles.ru там ссразу лить можно
ну или skype: isaer
0  
20.10.2011 00:00:00
Где то не доглядел, ссылку скоро исправлю.
0  
10.02.2012 00:00:00

Все делал по порядку…
0  
10.02.2012 00:00:00
все же ясно как белый день, нету glut'а у тебя, скачай откуда нибуть (лучше с офф сайта) glut.h и библиотеку (libglut.so)
0  
10.02.2012 00:00:00
Спасибо разобрался)
0  
10.02.2012 00:00:00
А можно ли воспользоваться Code::Blocks IDE? Не могу разобраться как. Постоянно так компилировать напряг. Заранее спасибо.
0  
10.02.2012 00:00:00
ну естественно =))
ставь CB и в настройках билдера пропиши опции компиляции -lGL -lglut и тд
0  
10.02.2012 00:00:00
а еще лучше ставь Emacs, со временем поймешь что он лучше всех! =))
0  
10.02.2012 00:00:00
#include <GL/glut.h>
#include <iostream>
#include <ctime>

float x1 = 84.0;
float y1 = 90.0;

void RenderScene(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0f, 0.0f, 0.0f);
glRectf( 58.0f, 90.0f, -58.0f, -90.0f);

// фигура
glColor3f(0.0f, 1.0f, 0.0f);
glRectf( -3.0f, x1, 3.0f, y1);

glColor3f(0.75f, 0.75f, 0.75f);
glRectf( -3.0f, x1-6.0, 3.0f, y1-6.0);

glColor3f(1.0f, 1.0f, 0.0f);
glRectf( -3.0f, x1-12.0, 3.0f, y1-12.0);

glColor3f(0.60f, 0.40f, 0.70f);
glRectf( -9.0f, x1-12.0, -3.0f, y1-12.0);

glutSwapBuffers();
}

void TimerFunction(int value)
{
x1 -= 6.0;
y1 -= 6.0;

if(x1 <-90.0+12)
{
x1 = 84.0;
y1 = 90.0;
}

glutPostRedisplay();
glutTimerFunc(333,TimerFunction, 1);
}

void SetupRC(void)
{
glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
}

void ChangeSize(GLsizei w, GLsizei h)
{
GLfloat aspectRatio;

if(h == 0)
h = 1;
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
aspectRatio = (GLfloat)w/(GLfloat)h;
if(w <= h)
glOrtho(-100.0, 100.0, -100/aspectRatio, 100.0/aspectRatio,
1.0, - 1.0);
else
glOrtho(-100.0 * aspectRatio, 100.0 * aspectRatio,
-100.0, 100.0, 1.0, -1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}


int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutCreateWindow("GLRect");
glutDisplayFunc(RenderScene);
glutReshapeFunc(ChangeSize);
glutTimerFunc(333, TimerFunction, 1);
SetupRC();
glutMainLoop();

return 0;
}
Не получаеться. Подскажите пожалуйста как запустить в удобной среде. На linuxe 3 дня…
Вот так работает: g++ main.cpp -lglut -o opengl но писать это каждый раз… и писать в текстовом редакторе не удобно. Помогите! )
^