Урок Инициализация в Windows я начинаю это пособие непосредственного с кода, разбитого на секции, каждая из которых будет подробно комментироваться. Первое, что вы должны сделать это создать проект в Visual C++



страница8/27
Дата17.11.2018
Размер7.85 Mb.
ТипУрок
1   ...   4   5   6   7   8   9   10   11   ...   27
xg) к скорости перемещения (xi).

Предположим, что скорость перемещения равна 10, а сопротивление равно 1. Первый раз, когда частица выводиться на экран, сопротивление воздействует на нее. Во второй раз, когда она выводится, сопротивление будет действовать, и скорость перемещения понизится от 10 до 9. Это заставит частицу немного замедлится. В третий раз, когда частица выводиться, сопротивление действует снова, и скорость перемещения понизится до 8. Если бы частица горела больше чем 10 перерисовок, то она будет в итоге перемещаться в противоположном направлении, потому что скорость перемещения станет отрицательным значением.

Сопротивление применяется к скорости перемещения по y и z, так же, как и по x.

      particle[loop].xi+=particle[loop].xg; // Притяжение по X для этой записи 


      particle[loop].yi+=particle[loop].yg; // Притяжение по Y для этой записи
      particle[loop].zi+=particle[loop].zg; // Притяжение по Z для этой записи

В следующей строке забирается часть жизни от частицы. Если бы мы не делали этого, то частица бы никогда не сгорела бы. Мы берем текущую жизнь частицы и вычитаем значение угасания для этой частицы. Каждая частица имеет свое значение угасания, поэтому они будут гореть с различными скоростями.

      particle[loop].life-=particle[loop].fade; // Уменьшить жизнь частицы на ‘угасание’

Теперь мы проверим, жива ли частица, после того как мы изменили ее жизнь.

      if (particle[loop].life<0.0f) // Если частица погасла 
      {

Если частица мертва (сгорела), мы оживим ее. Мы сделаем это, задав ей полную жизнь и новую скорость угасания.

        particle[loop].life=1.0f; // Дать новую жизнь
        // Случайное значение угасания
        particle[loop].fade=float(rand()%100)/1000.0f+0.003f;

Мы также сделаем сброс позиций частицы в центр экрана. Мы делаем это, при помощи сброса позиций x, y и z частицы в ноль.

        particle[loop].x=0.0f; // На центр оси X 
        particle[loop].y=0.0f; // На центр оси Y
        particle[loop].z=0.0f; // На центр оси Z

После того, как частица была сброшена в центр экрана, мы задаем ей новую скорость перемещения / направления. Отмечу, что я увеличил максимальную и минимальную скорость, с которой частица может двигаться со случайного значения в диапазоне 50 до диапазона 60, но на этот раз, мы не собирается умножать скорость перемещения на 10. Мы не хотим взрыва на этот раз, мы хотим иметь более медленно перемещающиеся частицы.

Также заметьте, что я добавил xspeed к скорости перемещения по оси X, и yspeed к скорости перемещения по оси Y. Это позволит нам позже контролировать, в каком направлении двигаются частицы.

        particle[loop].xi=xspeed+float((rand()%60)-32.0f);//Скорость и направление по оси X


        particle[loop].yi=yspeed+float((rand()%60)-30.0f);//Скорость и направление по оси Y
        particle[loop].zi=float((rand()%60)-30.0f);       //Скорость и направление по оси Z

Наконец мы назначаем частице новый цвет. В переменной col содержится число от 0 до 11 (12 цветов). Мы используем эту переменную для извлечения красной, зеленой и синей яркостей из нашей таблицы цветов, которую мы сделали в начале программы. В первой строке ниже задается красная яркость (r) согласно значению красного, сохраненного в colors[col][0]. Поэтому, если бы col равен 0, красная яркость равна 1.0f. Зеленые и синие значения получаются таким же способом.

Если Вы не поняли, как я получил значение 1.0f для красной яркости, если col - 0, я объясню это немного более подробно. Смотрите в начало программы. Найдите строку: static GLfloat colors[12][3]. Запомните, что есть 12 групп по 3 числа. Первые три числа - красная яркость. Второе значение - зеленая яркость, и третье значение - синяя яркость. [0], [1] и [2] ниже являются 1-ым, 2-ым и 3-ьим значениями, которые я только что упомянул. Если colравен 0, то мы хотим взглянуть на первую группу. 11 – последняя группа (12-ый цвет).

        particle[loop].r=colors[col][0]; // Выбор красного из таблицы цветов


        particle[loop].g=colors[col][1]; // Выбор зеленого из таблицы цветов
        particle[loop].b=colors[col][2]; // Выбор синего из таблицы цветов
      }

Строка ниже контролирует, насколько гравитация будет притягивать вверх. При помощи нажатия клавиши 8 на цифровой клавиатуре, мы увеличиваем переменную yg (y гравитация). Это вызовет притяжение вверх. Этот код расположен здесь, потому что это сделает нашу жизнь проще, гравитация будет назначена ко всем нашим частицам с помощью цикла. Если бы этот код был бы вне цикла, мы должны были бы создать другой цикл, чтобы проделать ту же самую работу, поэтому мы можем также сделать это прямо здесь.

      // Если клавиша 8 на цифровой клавиатуре нажата и гравитация меньше чем 1.5

      // тогда увеличим притяжение вверх


      if (keys[VK_NUMPAD8] && (particle[loop].yg<1.5f)) particle[loop].yg+=0.01f;

Эта строка создает точно противоположный эффект. При помощи нажатия 2 на цифровой клавиатуре мы уменьшаемyg, создавая более сильное притяжение вниз.

      // Если клавиша 2 на цифровой клавиатуре нажата и гравитация больше чем -1.5

      // тогда увеличим притяжение вниз


      if (keys[VK_NUMPAD2] && (particle[loop].yg>-1.5f)) particle[loop].yg-=0.01f;

Теперь мы модифицируем притяжение вправо. Если клавиша 6 на цифровой клавиатуре нажата, то мы увеличиваем притяжение вправо.

      // Если клавиша 6 на цифровой клавиатуре нажата и гравитация меньше чем 1.5

      // тогда увеличим притяжение вправо


      if (keys[VK_NUMPAD6] && (particle[loop].xg<1.5f)) particle[loop].xg+=0.01f;

Наконец, если клавиша 4  на цифровой клавиатуре нажата, то наша частица будет больше притягиваться влево. Эти клавиши позволяют получить некоторые действительно интересные результаты. Например, Вы сможете сделать поток частиц, стреляющих прямо в воздух. Добавляя немного притяжения вниз, Вы сможете превратить поток частиц в фонтан воды!

      // Если клавиша 4 на цифровой клавиатуре нажата и гравитация больше чем -1.5

      // тогда увеличим притяжение влево


      if (keys[VK_NUMPAD4] && (particle[loop].xg>-1.5f)) particle[loop].xg-=0.01f;

Я добавил этот небольшой код только для развлечения. Мой брат думает, что взрыв интересный эффект :). При помощи нажатия клавиши табуляции все частицы будут отброшены назад к центру экрана. Скорость перемещения частиц будет еще раз умножена на 10, создавая большой взрыв частиц. После того, как частицы взрыва постепенно исчезнут, появиться предыдущий столб частиц.

      if (keys[VK_TAB]) // Клавиша табуляции вызывает взрыв 
      {
        particle[loop].x=0.0f; // Центр по оси X
        particle[loop].y=0.0f; // Центр по оси Y
        particle[loop].z=0.0f; // Центр по оси Z
        particle[loop].xi=float((rand()%50)-26.0f)*10.0f; // Случайная скорость по оси X 
        particle[loop].yi=float((rand()%50)-25.0f)*10.0f; // Случайная скорость по оси Y
        particle[loop].zi=float((rand()%50)-25.0f)*10.0f; // Случайная скорость по оси Z
      }
    }
  }
  return TRUE; // Все OK
}

Код в KillGLWindow()CreateGLWindow() и WndProc() не изменился, поэтому мы перейдем к WinMain(). Я повторю весь этот раздел кода, чтобы сделать просмотр кода проще.

int WINAPI WinMain(

          HINSTANCE hInstance,     // Экземпляр

          HINSTANCE hPrevInstance, // Предыдущий экземпляр

          LPSTR     lpCmdLine,     // Параметры командной строки

          int       nCmdShow)      // Показать состояние окна

{

  MSG  msg;        // Структура сообщения окна



  BOOL done=FALSE; // Булевская переменная выхода из цикла

 

  // Запросим пользователя какой режим отображения он предпочитает



  if (MessageBox(NULL,"Would You Like To Run In Fullscreen Mode?",

      "Start FullScreen?",MB_YESNO|MB_ICONQUESTION)==IDNO)

  {

    fullscreen=FALSE;              // Оконный режим



  }

 

  // Создадим наше окно OpenGL



  if (!CreateGLWindow("NeHe's Particle Tutorial",640,480,16,fullscreen))

  {


    return 0;                  // Выходим если окно не было создано

  }


 

Далее наше первое изменение в WinMain(). Я добавил код, который проверяет, в каком режиме пользователь решил запустить программу - в полноэкранном режиме или в окне. Если  используется полноэкранный режим, я изменяю переменную slowdown на 1.0f вместо 2.0f. Вы можете опустить этот небольшой код, если Вы хотите. Я добавил этот код, чтобы ускорить полноэкранный режим на моем 3dfx (потому что при этом выполнение программы намного медленнее, чем в режиме окна по некоторым причинам).

  if (fullscreen)  // Полноэкранный режим ( ДОБАВЛЕНО )
  {
    slowdown=1.0f; // Скорость частиц (для 3dfx) ( ДОБАВЛЕНО )
  }

  while (!done) // Цикл, который продолжается пока done=FALSE

  {

    if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) // Есть ожидаемое сообщение?



    {

      if (msg.message==WM_QUIT) // Мы получили сообщение о выходе?

      {

        done=TRUE; // Если так done=TRUE



      }

      else // Если нет, продолжаем работать с сообщениями окна

      {

        TranslateMessage(&msg); // Переводим сообщение



        DispatchMessage(&msg);  // Отсылаем сообщение

      }


    }

    else // Если сообщений нет

    {

      // Рисуем сцену. Ожидаем нажатия кнопки ESC и сообщения о выходе от DrawGLScene()



      // Активно?  Было получено сообщение о выходе?

      if ((active && !DrawGLScene()) || keys[VK_ESCAPE])

      {

        done=TRUE; // ESC или DrawGLScene просигналили "выход"



      }

      else // Не время выходить, обновляем экран

      {

        SwapBuffers(hDC); // Переключаем буферы (Двойная буфферизация)



 

Я немного попотел со следующим куском кода. Обычно я не включаю все в одну строку, и это делает просмотр кода немного яснее :).

В строке ниже проверяется, нажата ли клавиша ‘+’ на цифровой клавиатуре. Если она нажата, и slowdown больше чем 1.0f, то мы уменьшаем slowdown на 0.01f. Это заставит частицы двигаться быстрее. Вспомните, что я говорил выше о торможении и как оно воздействует на скорость, с которой частица перемещается.

        if (keys[VK_ADD] && (slowdown>1.0f)) slowdown-=0.01f;//Скорость частицы увеличилась

В этой строке проверяется, нажата ли клавиша ‘-‘ на цифровой клавиатуре. Если она нажата, и slowdown меньше чем 4.0f, то мы увеличиваем slowdown. Это заставляет частицы двигаться медленнее. Я выставил предел в 4.0f, потому что я не хочу, чтобы они двигались очень медленно. Вы можете изменить минимальные и максимальные скорости, на какие Вы хотите :).

        if (keys[VK_SUBTRACT] && (slowdown<4.0f)) slowdown+=0.01f; // Торможение частиц 

В строке ниже проверяется, нажата ли клавиша PAGE UP. Если она нажата, то переменная zoom увеличивается. Это заставит частицы двигаться ближе к нам.

        if (keys[VK_PRIOR]) zoom+=0.1f; // Крупный план

В этой строке создается противоположный эффект. Нажимая клавишу Page down, zoom уменьшиться, и сцена сместиться глубже в экран. Это позволит нам увидеть больше частиц на экране, но при этом частицы будут меньше.

        if (keys[VK_NEXT]) zoom-=0.1f; // Мелкий план

В следующей секции кода происходит проверка, была ли нажата клавиша Enter. Если она нажата в первый раз, и она не удерживается уже некоторое время, мы позволим компьютеру узнать, что она нажата, устанавливая rp в true. Тем самым мы переключим режим радуги. Если радуга была true, она станет false. Если она была false, то станетtrue. В последней строке проверяется, была ли клавиша Enter отпущена. Если это так, то rp устанавливается в false, сообщая компьютеру, что клавиша больше не нажата.

        if (keys[VK_RETURN] && !rp) // нажата клавиша Enter


        {
          rp=true; // Установка флага, что клавиша нажата 
          rainbow=!rainbow; // Переключение режима радуги в Вкл/Выкл 
        }
        if (!keys[VK_RETURN]) rp=false; // Если клавиша Enter не нажата – сбросить флаг 

Код ниже немного запутанный. В первой строке идет проверка, нажата ли клавиша пробела и не удерживается ли она. Тут же проверяется, включен ли режим радуги, и если так, то проверяется значение переменной delay больше чем 25. delay - счетчик, который используется для создания эффекта радуги. Если Вы меняете цвет каждый кадр, то все частицы будут иметь разный цвет. При помощи создания задержки, группа частиц останется с одним цветом, прежде чем цвет будет изменен на другой.

Если клавиша пробел была нажата, или радуга включена, и задержка больше чем 25, цвет будет изменен!

        if ((keys[' '] && !sp) || (rainbow && (delay>25))) // Пробел или режим радуги 


        {

Строка ниже была добавлена, для того чтобы режим радуги был выключен, если клавиша пробел была нажата. Если бы мы не выключили режим радуги, цвета продолжили бы циклически повторяться, пока клавиша Enter не была бы нажата снова. Это сделано, для того чтобы можно было просмотреть все цвета, нажимая пробел вместо Enter.

          if (keys[' ']) rainbow=false; // Если пробел нажат запрет режима радуги 

Если клавиша пробел была нажата, или режим радуги включен, и задержка больше чем 25, мы позволим компьютеру узнать, что пробел было нажат, делая sp равной true. Затем мы зададим задержку равной 0, чтобы снова начать считать до 25. Наконец мы увеличим переменную col, чтобы цвет изменился на следующий цвет в таблице цветов.

          sp=true; // Установка флага нам скажет, что пробел нажат 
          delay=0; // Сброс задержки циклической смены цветов радуги 
          col++;   // Изменить цвет частицы 

Если цвет больше чем 11, мы сбрасываем его обратно в ноль. Если бы мы не сбрасывали col в ноль, наша программа попробовала бы найти 13-ый цвет. А мы имеем только 12 цветов! Попытка получить информацию о цвете, который не существует, привела бы к краху нашей программы.

          if (col>11) col=0; // Если цвет выше, то сбросить его 
        }

Наконец, если клавиша пробел больше не нажата, мы позволяем компьютеру узнать это, устанавливая переменную spв false.

        if (!keys[' ']) sp=false; // Если клавиша пробел не нажата, то сбросим флаг 

Теперь внесем немного управления нашими частицами. Помните, что мы создали 2 переменные в начале нашей программы? Одна называлась xspeed, и вторая называлась yspeed. Также Вы помните, что после того как частица сгорит, мы давали ей новую скорость перемещения и добавляли новую скорость или к xspeed или к yspeed. Делая это, мы можем повлиять, в каком направлении частицы будут двигаться, когда они впервые созданы.

Например. Пусть частица имеет скорость перемещения 5 по оси X и 0 по оси Y. Если мы уменьшим xspeed до -10, то скорость перемещения будет равна -10 (xspeed) +5 (начальная скорость). Поэтому вместо перемещения с темпом 10 вправо, частица будет перемещаться с темпом -5 влево Понятно?

Так или иначе. В строке ниже проверяем, нажата ли стрелка "вверх". Если это так, то yspeed будет увеличено. Это заставит частицы двигаться вверх. Частицы будут двигаться вверх с максимальной скоростью не больше чем 200. Если бы они двигались быстрее этого значения, то это выглядело бы не очень хорошо.

        //Если нажата клавиша вверх и скорость по Y меньше чем 200, то увеличим скорость
        if (keys[VK_UP] && (yspeed<200)) yspeed+=1.0f;

В этой строке проверяем, нажата ли клавиша стрелка "вниз". Если это так, то yspeed будет уменьшено. Это заставит частицу двигаться вниз. И снова, задан максимум скорости вниз не больше чем 200.

        // Если стрелка вниз и скорость по Y больше чем –200, то увеличим скорость падения 
        if (keys[VK_DOWN] && (yspeed>-200)) yspeed-=1.0f;

Теперь мы проверим, нажата ли клавиша стрелка вправо. Если это так, то xspeed будет увеличено. Это заставит частицы двигаться вправо. Задан максимум скорости не больше чем 200.

        // Если стрелка вправо и X скорость меньше чем 200, то увеличить скорость вправо 
        if (keys[VK_RIGHT] && (xspeed<200)) xspeed+=1.0f;

Наконец мы проверим, нажата ли клавиша стрелка влево. Если это так... то Вы уже поняли что... xspeed уменьшено, и частицы двигаются влево. Задан максимум скорости не больше чем 200.

        // Если стрелка влево и X скорость больше чем –200, то увеличить скорость влево 
        if (keys[VK_LEFT] && (xspeed>-200)) xspeed-=1.0f;

И последнее, что мы должны сделать - увеличить переменную delay. Я уже говорил, что delay управляет скоростью смены цветов, когда Вы используете режим радуги.

        delay++; // Увеличить счетчик задержки циклической смены цветов в режиме радуги 

Так же как и во всех предыдущих уроках, проверьте, что заголовок сверху окна правильный.

        if (keys[VK_F1])             // Была нажата кнопка F1?

        {

          keys[VK_F1]=FALSE;         // Если так - установим значение FALSE

          KillGLWindow();            // Закроем текущее окно OpenGL 

          fullscreen=!fullscreen;    // Переключим режим "Полный экран"/"Оконный"

          // Заново создадим наше окно OpenGL

          if (!CreateGLWindow("NeHe's Particle Tutorial",640,480,16,fullscreen))

          {

            return 0;                // Выйти, если окно не было создано

 

          }



        }

      }


    }

  }


 

  // Сброс

  KillGLWindow();                    // Закроем окно

  return (msg.wParam);               // Выйдем из программы

}

 

В этом уроке, я пробовал детально объяснять все шаги, которые требуются для создания простой, но впечатляющей системы моделирования частиц. Эта система моделирования частиц может использоваться в ваших собственных играх для создания эффектов типа огня, воды, снега, взрывов, падающих звезд, и так далее. Код может быть легко модифицирован для обработки большего количество параметров, и создания новых эффектов (например, фейерверк).



Благодарю Richard Nutman за предложение о том, что частицы можно позиционировать с помощью glVertex3f()вместо сброса матрицы модели просмотра и перепозиционирования каждой частицы с помощью glTranslatef(). Оба метода эффективны, но его метод уменьшил количество вычислений для вывода каждой частицы, что вызвало увеличение быстродействия программы.

Благодарю Antoine Valentim за предложение использовать полоски из треугольников для ускорения программы и введения новой команды в этом уроке. Замечания к этому уроку были великолепными, и я признателен за это!

Я надеюсь, что Вам понравился этот урок. Если Вы что-то не понимаете, или Вы нашли ошибку в этом уроке, пожалуйста, сообщите мне об этом. Я хочу сделать уроки лучше. Ваши замечания очень важны!

Урок 20. Маскирование

Добро пожаловать на урок номер 20. Растровый формат изображения поддерживается, наверное, на каждом компьютере, и, скорее всего во всех операционных системах. С ним не только легко работать, но и очень просто загружать и использовать как текстуру. До этого урока мы использовали смешивание, чтобы вывести текст на экран и другие изображения без стирания того, что под текстом или изображением. Это эффективно, но результат не всегда удовлетворительный.

В большинстве случаев текстура смешивается излишне или не достаточно хорошо. При разработке игры со спрайтами, Вы не хотите, чтобы сцена за вашим персонажем просвечивала через его тело. Когда вы выводите текст на экран, Вы хотите, чтобы текст был сплошным и легким для чтения.

В данном случае очень пригодиться маскирование. Маскирование – двух шаговый процесс. Вначале мы выводим черно-белое изображение нашей текстуры поверх сцены. Белое - прозрачная часть нашей текстуры. Черное - сплошная часть нашей текстуры. Мы будем использовать такой тип смешивания, при котором только черное будет появляться на сцене. Это похоже на форму для выпечки. Затем мы меняем режим смешивания, и отображаем нашу текстуру поверх, того, что вырезано черным. Опять же, из-за того режима смешивания, который мы используем, только те части нашей текстуры будут скопированы на экран, которые находятся сверху черной маски.

Я приведу весь код в этом уроке кроме тех разделов, которые не изменились. Итак, если Вы готовы научиться кое-чему новому, давайте начнем!

 

#include   // Заголовочный файл для Windows



#include      // Заголовочный файл для математической библиотеки Windows

#include     // Заголовочный файл для стандартной библиотеки ввода/вывода

#include     // Заголовочный файл для библиотеки OpenGL32

#include    // Заголовочный файл для библиотеки GLu32

#include // Заголовочный файл для библиотеки Glaux

 

HDC        hDC=NULL;  // Приватный контекст устройства GDI



HGLRC      hRC=NULL;  // Постоянный контекст визуализации

HWND       hWnd=NULL; // Сохраняет дескриптор окна

HINSTANCE  hInstance; // Сохраняет экземпляр приложения

 

Мы будем использовать 7 глобальных переменных в этой программе. masking - логическая переменная (ИСТИНА / ЛОЖЬ), которая будет отслеживать, действительно ли маскировка включена или выключена. mp используется, чтобы быть уверенным, что клавиша 'M' не нажата. sp используется, чтобы быть уверенным, что 'Пробел' не нажат, и переменная scene будет отслеживать, действительно ли мы рисуем первую или вторую сцену.



Мы выделяем память для 5 текстур, используя переменную texture[5]loop - наш общий счетчик, мы будем использовать его несколько раз в нашей программе, чтобы инициализировать текстуры, и т.д. Наконец, мы имеем переменную roll. Мы будем использовать roll, чтобы сделать прокрутку текстуры по экрану. Создавая изящный эффект! Мы будем также использовать ее для вращения объекта в сцене 2.

 

bool  keys[256];      // Массив для работы с клавиатурой



bool  active=TRUE;    // Флаг активации окна, по умолчанию = TRUE

bool  fullscreen=TRUE;// Флаг полноэкранного режима

 

bool  masking=TRUE;   // Маскирование Вкл/Выкл



bool  mp;             // M нажата?

bool  sp;             // Пробел нажат?

bool  scene;          // Какая сцена выводиться

 

GLuint  texture[5];   // Память для пяти наших текстур



GLuint  loop;         // Общая переменная цикла

 

GLfloat  roll;        // Катание текстуры



 

LRESULT  CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Объявление WndProc

 

Код загрузки картинки не изменился. Он тот же, какой был в уроке 6, и т.д.



В коде ниже мы резервируем память для 5 изображений. Мы очищаем место и загружаем все 5 картинок. Мы делаем цикл по всем изображениям и конвертируем их в текстуры для использования в нашей программе. Текстуры сохранены в texture[0-4].

 

int LoadGLTextures()                // Загрузка картинки и конвертирование в текстуру



{

  int Status=FALSE;                 // Индикатор состояния

  AUX_RGBImageRec *TextureImage[5]; // Создать место для текстуры

  memset(TextureImage,0,sizeof(void *)*5); // Установить указатель в NULL

 

  if ((TextureImage[0]=LoadBMP("Data/logo.bmp")) &&   // Текстура эмблемы



      (TextureImage[1]=LoadBMP("Data/mask1.bmp")) &&  // Первая маска

      (TextureImage[2]=LoadBMP("Data/image1.bmp")) && // Первое изображение

      (TextureImage[3]=LoadBMP("Data/mask2.bmp")) &&  // Вторая маска

      (TextureImage[4]=LoadBMP("Data/image2.bmp")))   // Второе изображение

  {

    Status=TRUE;                    // Задать статус в TRUE



    glGenTextures(5, &texture[0]);  // Создать пять текстур

 

    for (loop=0; loop<5; loop++)    // Цикл по всем пяти текстурам



    {

      glBindTexture(GL_TEXTURE_2D, texture[loop]);

      glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

      glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);

      glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[loop]->sizeX, TextureImage[loop]->sizeY,

        0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[loop]->data);

    }

  }


  for (loop=0; loop<5; loop++)      // Цикл по всем пяти текстурам

  {


    if (TextureImage[loop])         // Если текстура существуют

    {


      if (TextureImage[loop]->data) // Если изображение текстуры существует

      {


        free(TextureImage[loop]->data); // Освободить память изображения

      }


      free(TextureImage[loop]);     // Освободить структуру изображения

    }


  }

  return Status;                    // Возвращаем статус

}

 

Код 


Каталог: forum
forum -> Лечение гепатозов
forum -> Система ведения овцеводства в крестьянско-фермерских и личных хозяйствах населения
forum -> Yaesuft-857 (ft-897) – переходник для подключения cat интерфейса к микрофонному разъему трансивера
forum -> Васильев Владимир Юрьевич
forum -> tl-wr1043ND Беспроводной гигабитный маршрутизатор серии n copyright & trademarks
forum -> Цели и задачи Контакта rtf docx
forum -> Назовите не менее трех результатов революции 1905- 1907гг. Приведите не менее трех положений, отражающих значение революции для отечественной истории начала 20 века


Поделитесь с Вашими друзьями:
1   ...   4   5   6   7   8   9   10   11   ...   27


База данных защищена авторским правом ©vossta.ru 2019
обратиться к администрации

    Главная страница