<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5115850793839526420</id><updated>2011-07-30T17:45:58.706-07:00</updated><category term='windows'/><category term='c99'/><category term='fun'/><category term='opengl'/><category term='wget'/><category term='useful'/><category term='c'/><category term='coding'/><title type='text'>::UsefulBytes</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://usefulbytes.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5115850793839526420/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://usefulbytes.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>RadicalEd</name><uri>http://www.blogger.com/profile/09668017543265967344</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_zPA8nD2Po2s/StToFvf0iXI/AAAAAAAAADk/OYJjiIsrJiU/s1600-R/9851414'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>5</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5115850793839526420.post-209008616901227809</id><published>2009-09-26T13:51:00.000-07:00</published><updated>2009-09-26T14:54:00.108-07:00</updated><title type='text'>Кросс-компиляция C/C++ программ для Windows в Linux</title><content type='html'>&lt;p&gt;Кратко расскажу как создать так называемый cross-compile toolchain для компиляции Windows-программ из под Linux. Cross-compile toolchain - это набор средств для создания приложений для целевой платформы не имея собственно самой целевой платформы. Обычно это используется при сборке программ под различные экзотические платформы, в данном случае такой целевой платформой выступает далеко не экзотическая Windows. Термин "целевая платформа" уже прозвучал, помимо него имеется еще термин "хост-платформа" (или "платформа сборки"), думаю их значение пояснять не нужно.&lt;br /&gt;Хватит рассуждать пора делом заниматься, привожу краткую инструкцию в результате которой вы получите готовый инструмент для сборки С/С++ программ для Windows непосредственно в Linux. Используя инструкцию собрал toolchain в ArchLinux и CentOS 5.3, после собрал с помощью него MinGW32 для Windows с последним GCC 4.4.1 с поддержкой C/C++ прямо в Linux. В итоге остался очень доволен и получил ценный опыт, которым собираюсь поделиться с вами.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Перед тем как непосредственно приступить убедитесь что у вас установлены средства разработки, такие как GCC, G++, CVS, Automake, Autoconf, make и т.п. Если что-то не сработает в ходе выполнения инструкции - возможно в системе не хватило каких-то пакетов. Если вы занимаетесь разработкой на C/C++ то скорее всего все эти пакеты в вашей системе уже установлены.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Первым делом получим последние версии MinGW Win32 API и MinGW Win32 Runtime:&lt;br /&gt;&lt;pre&gt;export CVSROOT=:pserver:anoncvs@cygwin.com:/cvs/src&lt;br /&gt;cvs login (пароль anoncvs)&lt;br /&gt;cvs -z3 co -d mingwrt src/winsup/mingw&lt;br /&gt;cvs -z3 co -d w32api src/winsup/w32api&lt;/pre&gt;&lt;br /&gt;Теперь скачаем Binutils, GCC, GCC-G++, GMP и MPFR:&lt;br /&gt;&lt;pre&gt;wget http://ftp.gnu.org/gnu/binutils/binutils-2.19.1.tar.bz2&lt;br /&gt;wget http://gcc-uk.internet.bs/releases/gcc-4.4.1/gcc-core-4.4.1.tar.bz2&lt;br /&gt;wget http://gcc-uk.internet.bs/releases/gcc-4.4.1/gcc-g++-4.4.1.tar.bz2&lt;br /&gt;wget ftp://ftp.gnu.org/gnu/gmp/gmp-4.3.1.tar.bz2&lt;br /&gt;wget http://www.mpfr.org/mpfr-current/mpfr-2.4.1.tar.bz2&lt;/pre&gt;&lt;br /&gt;Распакуем все что скачали:&lt;br /&gt;&lt;pre&gt;tar xjf binutils-2.19.1.tar.bz2&lt;br /&gt;tar xjf gcc-core-4.4.1.tar.bz2&lt;br /&gt;tar xjf gcc-g++-4.4.1.tar.bz2&lt;br /&gt;tar xjf gmp-4.3.1.tar.bz2&lt;br /&gt;tar xjf mpfr-2.4.1.tar.bz2&lt;/pre&gt;&lt;br /&gt;Начнем со сборки и установки Binutils для целевой платформы:&lt;br /&gt;&lt;pre&gt;cd binutils-2.19.1&lt;br /&gt;mkdir build &amp;&amp; cd build&lt;br /&gt;../configure --target=i686-pc-mingw32 --disable-multilib&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;cd ../..&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;make install установит собранные бинарники в /usr/local/i686-pc-mingw32&lt;/span&gt;&lt;br /&gt;Для дальнейшей сборки надо скопировать заголовочные файлы MinGW в папку куда будут устанавливаться файлы для целевой архитектуры:&lt;br /&gt;&lt;pre&gt;sudo cp -r mingwrt/include /usr/local/i686-pc-mingw32&lt;br /&gt;sudo cp -r w32api/include /usr/local/i686-pc-mingw32&lt;/pre&gt;&lt;br /&gt;Если в переменной окружения PATH у вас отсутствует путь /usr/local/bin - добавте его:&lt;br /&gt;&lt;pre&gt;export PATH="/usr/local/bin:$PATH"&lt;/pre&gt;&lt;br /&gt;Теперь соберем и установим GCC с ключом -gcc (предварительно сделаем ссылки на GMP и MPFR, чтобы они тоже собрались):&lt;br /&gt;&lt;pre&gt;cd gcc-4.4.1&lt;br /&gt;ln -s ../gmp-4.3.1 gmp&lt;br /&gt;ln -s ../mpfr-2.4.1 mpfr&lt;br /&gt;mkdir build &amp;&amp; cd build&lt;br /&gt;../configure --target=i686-pc-mingw32 --disable-multilib&lt;br /&gt;make all-gcc&lt;br /&gt;sudo make install-gcc&lt;br /&gt;cd ../..&lt;/pre&gt;&lt;br /&gt;Понадобятся библиотеки из MinGW API:&lt;br /&gt;&lt;pre&gt;cd w32api&lt;br /&gt;mkdir build &amp;&amp; cd build&lt;br /&gt;../configure --host=i686-pc-mingw32 --prefix=/usr/local/i686-pc-mingw32&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;cd ../..&lt;/pre&gt;&lt;br /&gt;К сожалению тут идет неприятная часть с кросс-зависимостями между GCC и MinGW Runtime, которая, впрочем, решается довольно просто. Мы повторно собираем GCC но уже с ключом all:&lt;br /&gt;&lt;pre&gt;cd gcc-4.4.1/build&lt;br /&gt;make&lt;/pre&gt;&lt;br /&gt;Сборка завершится с ошибкой, но нам это не важно, главное были собраны необходимые библиотеки, которые понадобятся для сборки MinGW Runtime, скопируем их в папку целевой платформы:&lt;br /&gt;&lt;pre&gt;sudo cp i686-pc-mingw32/libgcc/crtbegin.o i686-pc-mingw32/libgcc/crtend.o \&lt;br /&gt; i686-pc-mingw32/libgcc/libgcc_eh.a i686-pc-mingw32/libgcc/libgcc.a \&lt;br /&gt; /usr/local/i686-pc-mingw32/lib/&lt;br /&gt;cd ../..&lt;/pre&gt;&lt;br /&gt;Теперь можно собрать и установить MinGW Runtime:&lt;br /&gt;&lt;pre&gt;cd mingwrt&lt;br /&gt;mkdir build &amp;&amp; cd build&lt;br /&gt;../configure --host=i686-pc-mingw32 --prefix=/usr/local/i686-pc-mingw32&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;cd ../..&lt;/pre&gt;&lt;br /&gt;Возвращаемся к сборке GCC, теперь все должно собраться нормально:&lt;br /&gt;&lt;pre&gt;cd gcc-4.4.1/build&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;cd ../..&lt;/pre&gt;&lt;br /&gt;Ну вот и все, cross-compile toolchain готов, можете приступать к сборке нативных Windows-приложений не выходя из Linux. В качестве компилятора для C используйте i686-pc-mingw32-gcc и для C++ используйте i686-pc-mingw32-g++. Для autoconf скриптов configure достаточно указать опции --host=i686-pc-mingw32 и --target=i686-pc-mingw32, тогда скрипт сам определит нужные программы и по возможности попытается собрать весь проект для запуска на целевой платформе, именно так собирается GCC 4.4.1 для запуска в Windows, но об этом в другой раз. Удачных сборок :)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5115850793839526420-209008616901227809?l=usefulbytes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://usefulbytes.blogspot.com/feeds/209008616901227809/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://usefulbytes.blogspot.com/2009/09/cc-windows-linux.html#comment-form' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5115850793839526420/posts/default/209008616901227809'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5115850793839526420/posts/default/209008616901227809'/><link rel='alternate' type='text/html' href='http://usefulbytes.blogspot.com/2009/09/cc-windows-linux.html' title='Кросс-компиляция C/C++ программ для Windows в Linux'/><author><name>RadicalEd</name><uri>http://www.blogger.com/profile/09668017543265967344</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_zPA8nD2Po2s/StToFvf0iXI/AAAAAAAAADk/OYJjiIsrJiU/s1600-R/9851414'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5115850793839526420.post-5778594007970382541</id><published>2009-04-24T16:00:00.000-07:00</published><updated>2009-04-26T12:01:08.085-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c99'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>Пример работы с OpenGL 3</title><content type='html'>Знаете за что я люблю программирование? Казалось бы, работа программиста, это же "обезьяний труд", сидишь с утра до вечера, пишешь код проекта, который большей своей частью состоит из угрюмого кода, такого как проверка на ошибки, защита от дурака, работа с памятью. Все это должно угнетать. Однако, когда вот в такой вот рутине появляется возможность изучить что-то новое, прикоснуться к ранее неизвестному и реализовать это. Это по настоящему приятно, это доставляет моральное удовольствие и иногда это даже лучше чем шоколад :)&lt;br /&gt;&lt;br /&gt;И к чему я это пишу? Да просто хочу вам сказать, что вышел уже OpenGL 3.1 и пора бы его немного пощупать. К сожалению достойных туториалов по Интернету мало, не говоря уже о туторах на русском, поэтому свой опыт знакомства я решил описать именно в виде небольшого пособия, которое, возможно, кому-нибудь да поможет.&lt;br /&gt;&lt;br /&gt;Чем отличается OpenGL 3.0 от более младших версий? Все просто - вся поддержка FFP (fixed function pipeline) переведена в ряд морально устаревших вещей, а точнее помечена deprecated. Это конечно не все, еще часть функций из расширений перекочевала в ядро, но самое важное изменение именно отказ от FFP. Сразу замечу что в OpenGL 3.1 уже убрали все что было помечено deprecated. Осталась одна маленькая лазейка для использования FFP это &lt;span style="font-style: italic;"&gt;GL_ARB_compatibility&lt;/span&gt; (это расширение доступно только в OpenGL 3.1). Вобщем более детально можно почитать в спецификации, которую можно взять с сайта opengl.org&lt;br /&gt;&lt;br /&gt;Чем же грозит отказ от FFP? В первую очередь убран так называемый immediate mode&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;*&lt;/span&gt;, это различные функции вроде &lt;span style="font-style: italic;"&gt;glVertex&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;glNormal&lt;/span&gt; и т.п. Пользоваться &lt;span style="font-style: italic;"&gt;glBegin&lt;/span&gt;/&lt;span style="font-style: italic;"&gt;glEnd&lt;/span&gt; больше нельзя. Убрали &lt;span style="font-style: italic;"&gt;glVertexPointer&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;glNormalPointer&lt;/span&gt; и т.п.. Убрали операции с матрицами, т.е. различные &lt;span style="font-style: italic;"&gt;glLoadIndentity&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;glMultMatrix&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;glLoadMatrix&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;glOrtho&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;glFrustum&lt;/span&gt; и т.п. Убрали дисплейные списки (display list).  И много чего еще. Все эти изменения коснулись также и GLSL, из которого убрали связанные с FFP юниформы (uniform), такие как &lt;span style="font-style: italic;"&gt;gl_ModelViewProjectionMatrix&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;gl_NormalMatrix&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;gl_Vertex&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;gl_FogCoord&lt;/span&gt; и т.п. Теперь вся ответственность за вычисление подобных вещей возложена на программиста, а это, между прочим, не так уж и плохо ;)&lt;br /&gt;&lt;br /&gt;Пожалуй теории на этом хватит, перейдем к некоторым практическим аспектами реализации. Во-первых, нормальной поддержки OpenGL 3.1 в стабильных драйверах ATI и nVidia пока нет, скажу даже больше, пока еще страдает и поддержка OpenGL 3.0. Поэтому будем создавать forward контекст пока что с поддержкой OpenGL 3.0 и будем использовать GLSL 1.3.&lt;br /&gt;&lt;br /&gt;Есть интересная особенность при создании forward контекста, для его создания нужно иметь функцию &lt;span style="font-style: italic;"&gt;wglCreateContextAttribsARB&lt;/span&gt;, которую надо получать через &lt;span style="font-style: italic;"&gt;wglGetProcAddress&lt;/span&gt;. Ничего не смущает? Правильно, использовать &lt;span style="font-style: italic;"&gt;wglGetProcAddress&lt;/span&gt; можно только после создания контекста OpenGL. Замкнутый круг :) На самом деле это не проблема, мы просто создаем временный OpenGL контекст, как мы это делаем обычно, получаем адрес функции, создаем уже forward контекст и удаляем временный. Звучит просто? Так оно и есть, вот пример кода:&lt;br /&gt;&lt;pre&gt;&lt;code class="cpp"&gt;PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB = NULL;&lt;br /&gt;int attribs[] =&lt;br /&gt;{&lt;br /&gt;  WGL_CONTEXT_MAJOR_VERSION_ARB, 3,&lt;br /&gt;  WGL_CONTEXT_MINOR_VERSION_ARB, 0,&lt;br /&gt;  WGL_CONTEXT_FLAGS_ARB,         WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,&lt;br /&gt;  0&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;/* create temp render context */&lt;br /&gt;HGLRC temp_render_context = wglCreateContext(window-&gt;context);&lt;br /&gt;if (!temp_render_context || !wglMakeCurrent(window-&gt;context, temp_render_context))&lt;br /&gt;{&lt;br /&gt;  LOG_ERROR("Creating temp render context fail (%d)\n", GetLastError());&lt;br /&gt;  destroy_opengl_window(window);&lt;br /&gt;  return false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)wglGetProcAddress("wglCreateContextAttribsARB");&lt;br /&gt;&lt;br /&gt;if (NULL == wglCreateContextAttribsARB)&lt;br /&gt;{&lt;br /&gt;  LOG_ERROR("%s fail\n", "wglCreateContextAttribsARB");&lt;br /&gt;  wglDeleteContext(temp_render_context);&lt;br /&gt;  destroy_opengl_window(window);&lt;br /&gt;  return false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* create forward render context */&lt;br /&gt;window-&gt;render_context = wglCreateContextAttribsARB(window-&gt;context, 0, attribs);&lt;br /&gt;if (!window-&gt;render_context || !wglMakeCurrent(window-&gt;context, window-&gt;render_context))&lt;br /&gt;{&lt;br /&gt;  LOG_ERROR("Creating render context fail (%d)\n", GetLastError());&lt;br /&gt;  wglDeleteContext(temp_render_context);&lt;br /&gt;  destroy_opengl_window(window);&lt;br /&gt;  return false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/* delete temp render context */&lt;br /&gt;wglDeleteContext(temp_render_context);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Если сейчас что-то непонятно - не расстраивайтесь, сначала просмотрите всю статью целиком, посмотрите на исходные тексты к этой статье, ссылка на которые приведена в самом конце.&lt;br /&gt;&lt;br /&gt;В качестве тестовой сцены я решил сделать обычный вращающийся куб с натянутой на него текстурой и диффузным повершинным (per vertex) освещением. Данные о вершинах куба и индексы просто забиты руками прямо в код программы, никакой загрузки моделей для этого проекта я делать не стал. Все что загружается извне это код шейдеров и текстура куба (которая представлена в формате TGA).&lt;br /&gt;&lt;br /&gt;Ну что же, мы создали forward контекст... И что дальше? Нету ни &lt;span style="font-style: italic;"&gt;glMatrixMode&lt;/span&gt; ни &lt;span style="font-style: italic;"&gt;gluPerspective&lt;/span&gt;, как установить матрицу перспективного преобразования? В forward контексте - только руками. Например функция, которая сформирует проекционную матрицу аналогичную той, что формирует &lt;span style="font-style: italic;"&gt;gluPerspective&lt;/span&gt;:&lt;br /&gt;&lt;pre&gt;&lt;code class="cpp"&gt;static inline void matrix4_projection(matrix4 M, float fov, float aspect, float znear, float zfar)&lt;br /&gt;{&lt;br /&gt;  float f = 1.0f / tanf(fov/2.0f);&lt;br /&gt;  memset(M, 0, sizeof(float)*16);&lt;br /&gt;  M[0][0] = f/aspect;&lt;br /&gt;  M[1][1] = f;&lt;br /&gt;  M[2][2] = (zfar+znear)/(znear-zfar);&lt;br /&gt;  M[2][3] = 2*zfar*znear/(znear-zfar);&lt;br /&gt;  M[3][2] = -1.0f;&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;Здесь &lt;span style="font-style: italic;"&gt;matrix4&lt;/span&gt; это &lt;span style="font-style: italic;"&gt;typedef float matrix4[4][4]&lt;/span&gt;, все очень просто. Ну а дальше вы берете эту матрицу и отправляете ее в шейдер, вместе с видовой матрицей, делается это вызовом функции &lt;span style="font-style: italic;"&gt;glUniformMatrix4fv&lt;/span&gt;. Более конкретно это показано в исходниках.&lt;br /&gt;&lt;br /&gt;Для вывода самого куба необходимо передать в шейдер данные о его вершинах: позицию в пространстве, нормаль и текстурные координаты для каждой вершины. Для этого в шейдере заводится несколько атрибутов, которые обозначаются с помощью квалификатора &lt;span style="font-style: italic;"&gt;in&lt;/span&gt; (но вообще говоря если никакого квалификатора не указано, то подразумевается что это &lt;span style="font-style: italic;"&gt;in&lt;/span&gt;). До GLSL 1.3, на то, что это атрибут указывал квалификатор &lt;span style="font-style: italic;"&gt;attribute&lt;/span&gt;. Работа с атрибутами внутри программы не поменялась, после загрузки и подготовки шейдеров надо получить позицию (location) атрибута, выбрать активную шейдерную программу и передать в атрибут необходимые значения. Также выглядит и работа с юниформами (uniform). Вот код реализующий передачу данных о вершинах куба в шейдер:&lt;br /&gt;&lt;pre&gt;&lt;code class="cpp"&gt;position_index   = get_attrib_index(&amp;amp;shader, "position");&lt;br /&gt;normal_index     = get_attrib_index(&amp;amp;shader, "normal");&lt;br /&gt;texcoord_index   = get_attrib_index(&amp;amp;shader, "texcoord");&lt;br /&gt;&lt;br /&gt;glEnableVertexAttribArray(position_index);&lt;br /&gt;glEnableVertexAttribArray(normal_index);&lt;br /&gt;glEnableVertexAttribArray(texcoord_index);&lt;br /&gt;&lt;br /&gt;use_shader_program(&amp;amp;shader);&lt;br /&gt;&lt;br /&gt;glVertexAttribPointer(position_index, 3, GL_FLOAT, 0, 0, cube_vertices);&lt;br /&gt;glVertexAttribPointer(normal_index,   3, GL_FLOAT, 0, 0, cube_normals);&lt;br /&gt;glVertexAttribPointer(texcoord_index, 2, GL_FLOAT, 0, 0, cube_texcoords);&lt;/code&gt;&lt;/pre&gt;За более подробной информацией по функциям &lt;span style="font-style: italic;"&gt;get_attrib_index&lt;/span&gt; и &lt;span style="font-style: italic;"&gt;use_shader_program&lt;/span&gt; отсылаю вас к исходникам тествого проекта, коротко говоря это просто обертки над &lt;span style="font-style: italic;"&gt;glGetAttribLocation&lt;/span&gt; и &lt;span style="font-style: italic;"&gt;glUseProgram&lt;/span&gt;, соответственно.&lt;br /&gt;&lt;br /&gt;Вообще на этом можно и закончить и начать просматривать исходники к этой статье, которые я прикладываю. Если там что-то будет непонятно, или у вас появятся какие-либо вопросы, а может вы найдете ошибки в тексте статьи или в программе - не стесняйтесь, пишите комментарии, я постараюсь ответить всем и исправить все обнаруженные неточности и ошибки.&lt;br /&gt;&lt;br /&gt;Ссылка на архив с материалами к данной статье (включает уже собранный проект, текстуру и шейдеры и исходники, а также Makefile для MinGW): &lt;a href="http://rapidshare.com/files/225161208/gl99.7z"&gt;gl99.7z&lt;/a&gt; (220 KB).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;*&lt;/span&gt; Мне уже указали на то, что immediate mode можно вполне использовать и без FFP, но это не меняет того факта, что этот функционал был объявлен deprecated в OpenGL 3.0&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5115850793839526420-5778594007970382541?l=usefulbytes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://usefulbytes.blogspot.com/feeds/5778594007970382541/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://usefulbytes.blogspot.com/2009/04/opengl-3.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5115850793839526420/posts/default/5778594007970382541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5115850793839526420/posts/default/5778594007970382541'/><link rel='alternate' type='text/html' href='http://usefulbytes.blogspot.com/2009/04/opengl-3.html' title='Пример работы с OpenGL 3'/><author><name>RadicalEd</name><uri>http://www.blogger.com/profile/09668017543265967344</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_zPA8nD2Po2s/StToFvf0iXI/AAAAAAAAADk/OYJjiIsrJiU/s1600-R/9851414'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5115850793839526420.post-3271572226670914047</id><published>2009-02-05T01:18:00.000-08:00</published><updated>2009-02-05T01:41:54.015-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='useful'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='wget'/><title type='text'>wget для windows</title><content type='html'>Выкладываю сборку wget для Windows с поддержкой SSL (использована библиотека openssl-0.9.8j): &lt;a href="http://rapidshare.com/files/194154243/wget.7z"&gt;wget для windows&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Не знаю как вам, а мне программа под названием wget очень нравится, я часто ей пользуюсь когда работаю на каком-нибудь *nix сервере через удаленный шелл (впрочем, альтернатив этой утилите там практически нету). Однако в среде Windows эту программу мало кто знает и использует. Тем не менее, существует вполне официальный способ собрать исполняемый файл под Windows и использовать все возможности этой программы.&lt;br /&gt;&lt;br /&gt;Для тех кто не помнит wget - это консольная "качалка" файлов из интернета. Консольная значит что у нее нету графического интерфейса, общаться с программой можно через ключи командной строки. Существуют также сторонние программы предоставлющие грфический интерфейс к этой утилите, однако здесь мы их рассматривать не будем.&lt;br /&gt;&lt;br /&gt;Возможностей у программы много: она может качать через HTTP, HTTPS, FTP; может работать через прокси; может ограничивать скорость закачки; может докачивать файлы в случае обрыва связи; может работать со списками закачек; может скачивать не только файлы, но и целые папки, причем делать это рекурсивно (т.е. скачивая все вложенные папки и файлы). Кстати wget можно использовать как "граббер" сайтов (скачивать сайт подменяя в нем ссылки на локальные файлы). Поистине мощная программа.&lt;br /&gt;&lt;a href="http://rapidshare.com/files/194154243/wget.7z"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5115850793839526420-3271572226670914047?l=usefulbytes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://usefulbytes.blogspot.com/feeds/3271572226670914047/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://usefulbytes.blogspot.com/2009/02/wget-windows.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5115850793839526420/posts/default/3271572226670914047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5115850793839526420/posts/default/3271572226670914047'/><link rel='alternate' type='text/html' href='http://usefulbytes.blogspot.com/2009/02/wget-windows.html' title='wget для windows'/><author><name>RadicalEd</name><uri>http://www.blogger.com/profile/09668017543265967344</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_zPA8nD2Po2s/StToFvf0iXI/AAAAAAAAADk/OYJjiIsrJiU/s1600-R/9851414'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5115850793839526420.post-8947005466842203321</id><published>2009-01-29T15:26:00.000-08:00</published><updated>2009-01-30T02:20:33.139-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>Множество Мандельброта</title><content type='html'>На днях написал небольшую программу на Си, которая строит множество Мандельброта и сохраняет его в BMP-файл. Картинка получается большая (4096х4096), но имеет всего 16 цветов и поэтому весит порядка 8 МБ. А вот и сам код:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;#include&amp;lt;stdio.h&amp;gt;/* this code draw Mandelbrot set and save it into BMP file */&lt;br /&gt;unsigned long h[]={7753026UL,128L,7733248UL,2621440UL,268435456UL,268435456UL,&lt;br /&gt;65536L,4L,0L,0L,0L,1048576L,0L,0L,65280L,336920320UL,673775380UL,1010630440UL,&lt;br /&gt;1347485500UL,1684340560UL,2021195620UL,2358050680UL,2694905740UL,3031760800UL,&lt;br /&gt;3368615860UL,3705470920UL,4042325980UL,4210753520UL,4294967290UL,4294967295UL}&lt;br /&gt;;int main(int n,char**f){FILE*o=fopen("fractal.bmp","wb");if(NULL==o)return 1;&lt;br /&gt;;fwrite(h,1L,118L,o);**f=0;int c,x,y;for(y=-2048;y&amp;lt;2048;++y)for(n=0,x=-3000;x&amp;lt;&lt;br /&gt;1096;n=00,++x){float i,j,k;i=j=k=0;while(i*i+j*j&amp;lt;4&amp;amp;&amp;amp;n++&amp;lt;16){i=i*i-j*j+x/1600.0&lt;br /&gt;;j=2*k*j+y/1600.0;k=i;}c=**f?fputc((c&amp;lt;&amp;lt;4)|(n&amp;amp;15),o):n&amp;amp;15;**f=!**f;}fclose(o);}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;А вот такая получается картинка (уменьшенная копия):&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_zPA8nD2Po2s/SYI9ZpM-BhI/AAAAAAAAAAw/5jGATUb0wEU/s1600-h/fractal.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 320px;" src="http://1.bp.blogspot.com/_zPA8nD2Po2s/SYI9ZpM-BhI/AAAAAAAAAAw/5jGATUb0wEU/s320/fractal.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5296863622507398674" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5115850793839526420-8947005466842203321?l=usefulbytes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://usefulbytes.blogspot.com/feeds/8947005466842203321/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://usefulbytes.blogspot.com/2009/01/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5115850793839526420/posts/default/8947005466842203321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5115850793839526420/posts/default/8947005466842203321'/><link rel='alternate' type='text/html' href='http://usefulbytes.blogspot.com/2009/01/blog-post.html' title='Множество Мандельброта'/><author><name>RadicalEd</name><uri>http://www.blogger.com/profile/09668017543265967344</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_zPA8nD2Po2s/StToFvf0iXI/AAAAAAAAADk/OYJjiIsrJiU/s1600-R/9851414'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_zPA8nD2Po2s/SYI9ZpM-BhI/AAAAAAAAAAw/5jGATUb0wEU/s72-c/fractal.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5115850793839526420.post-2562114087679047359</id><published>2009-01-22T11:07:00.000-08:00</published><updated>2009-01-30T02:21:24.656-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c99'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>Hello, World!</title><content type='html'>Читая стандарт C99 я открыл для себя много нового и интересного. В частности мне понравились удивительные синтаксические конструкции которые можно  создавать используя информацию из стандарта C99.&lt;br /&gt;&lt;br /&gt;Приведу пример двух программ которые печатают "Hello, World!" на экран:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;%:include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;main()&amp;lt;%char*a&amp;lt;::&amp;gt;=&amp;lt;%"Hello,World!",0%&amp;gt;;puts(a&amp;lt;:(int)a&amp;lt;:1:&amp;gt;:&amp;gt;);%&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;    puts((char&amp;lt;::&amp;gt;)&amp;lt;%&amp;lt;:0x8:&amp;gt;=0x6F,&amp;lt;:0xA:&amp;gt;=0x6C,&amp;lt;:0x9:&amp;gt;=0x72,&amp;lt;:0x0:&amp;gt;=0x48,&lt;br /&gt;    &amp;lt;:0x6:&amp;gt;=0x20,&amp;lt;:0x2:&amp;gt;=0x6C,0x6C,&amp;lt;:0x4:&amp;gt;=0x6F,&amp;lt;:0x1:&amp;gt;=0x65,&amp;lt;:0x5:&amp;gt;=0x2C,&lt;br /&gt;    &amp;lt;:0xB:&amp;gt;=0x64,&amp;lt;:0x7:&amp;gt;=0x57,&amp;lt;:0xC:&amp;gt;=0x21,0x00%&amp;gt;);&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;В обоих примерах используются так называемые диграфы, это пара символов призванная заменить один, их использование вполне допустимо в языке Си и тесно связано с его происхождением. Когда язык Си появился на свет, имелись клавиатуры на которых отсутствовали символы '{', '}', '[', ']', '#' и бог его знает какие еще. Но, как известно, эти символы широко используются в языке Си и, чтобы не ущемлять права владельцев подобных "клав" в стандарт были введены диграфы, которые позволяли заменить эти символы на пару других, например '{' и '}' заменяются на '&amp;lt;%' и '%&amp;gt;', а '[' и ']' заменяются на '&amp;lt;:' и ':&amp;gt;', а также '#' заменяется на '%:'. Кончено, в наше время это кажется странным, но из стандарта диграфы так и не ушли.&lt;br /&gt;&lt;br /&gt;И если с первым примером все становится более-менее ясно, то вот второй, даже после "исправления" диграфов, кажется странным. Тут все дело в стандарте C99. Дело в том, что там позволяется делать интересные вещи: объявлять безымянные массивы и посылать их в функцию, а также явно задавать положение элементов в объявленном массиве. Т.е. конструкция (char[]){1, 2, 3, 4, 5} есть не что иное как массив, тот же самый результат даст конструкция (char[]){[1]=2, [0]=1, [2]=3, 4, 5}. Вот теперь все должно встать на свои места :)&lt;br /&gt;&lt;br /&gt;Удачного кодинга!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5115850793839526420-2562114087679047359?l=usefulbytes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://usefulbytes.blogspot.com/feeds/2562114087679047359/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://usefulbytes.blogspot.com/2009/01/hello-world.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5115850793839526420/posts/default/2562114087679047359'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5115850793839526420/posts/default/2562114087679047359'/><link rel='alternate' type='text/html' href='http://usefulbytes.blogspot.com/2009/01/hello-world.html' title='Hello, World!'/><author><name>RadicalEd</name><uri>http://www.blogger.com/profile/09668017543265967344</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://1.bp.blogspot.com/_zPA8nD2Po2s/StToFvf0iXI/AAAAAAAAADk/OYJjiIsrJiU/s1600-R/9851414'/></author><thr:total>0</thr:total></entry></feed>
