Логин: Пароль:    Регистрация Всеми возможностями сайта можно пользоваться
только после авторизации.
   Забыли пароль?
Поиск
L


Статистика
u
Пользователи онлайн: нет
Гостей онлайн: 21
Всего онлайн: 21
Зарегистрировано юзеров: 5759
Комментариев на сайте: 623
Новый юзер: Marcushic



Последние комментарии
c
N0E0O7 прокомментировал "Урок 1 - Инициализация OpenGL":
А у меня форма чёрная запускается
dimonsky прокомментировал "Урок 2 - Простые примитивы":
GetDC(handle) вместо canvas.handle, и убрать вызов FormResize. Тогда получается конфетка.



Мы в соцсетях
c
Delphi
Урок 6 - Наложение текстур

  Текстура в OpenGL – это простой графический файл, который отображается на полигоне.
В этом уроке мы рассмотрим 2 вида текстур: простые и с альфа-каналом (прозрачностью).

  Перед тем, как начать работу, вам необходимо скачать файл Textures.pas (ссылка в конце урока).
Он осуществляет загрузку текстуры в оперативную память, для последующего отображения на полигоне.

  Текстуру мы будем накладывать на куб.
Его надо нарисовать вручную, чтобы не загромождать код, создайте новый юнит и процедуру RenderBox:

Procedure RenderBox();
begin
glBegin(GL_QUADS);
    glNormal3f( 0.0, 0.0, 1.0);
    glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0,  1.0);
    glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0,  1.0);
    glTexCoord2f(1.0, 1.0); glVertex3f( 1.0,  1.0,  1.0);
    glTexCoord2f(0.0, 1.0); glVertex3f(-1.0,  1.0,  1.0);
   glEnd;
   glBegin(GL_QUADS);
    glNormal3f( 0.0, 0.0,-1.0);
    glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, -1.0);
    glTexCoord2f(1.0, 1.0); glVertex3f(-1.0,  1.0, -1.0);
    glTexCoord2f(0.0, 1.0); glVertex3f( 1.0,  1.0, -1.0);
    glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, -1.0);
   glEnd;
   glBegin(GL_QUADS);
    glNormal3f( 0.0, 1.0, 0.0);
    glTexCoord2f(0.0, 1.0); glVertex3f(-1.0,  1.0, -1.0);
    glTexCoord2f(0.0, 0.0); glVertex3f(-1.0,  1.0,  1.0);
    glTexCoord2f(1.0, 0.0); glVertex3f( 1.0,  1.0,  1.0);
    glTexCoord2f(1.0, 1.0); glVertex3f( 1.0,  1.0, -1.0);
   glEnd();
   glBegin(GL_QUADS);
    glNormal3f( 0.0,-1.0, 0.0);
    glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, -1.0, -1.0);
    glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, -1.0, -1.0);
    glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0,  1.0);
    glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0,  1.0);
   glEnd();
   glBegin(GL_QUADS);
    glNormal3f( 1.0, 0.0, 0.0);
    glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, -1.0);
    glTexCoord2f(1.0, 1.0); glVertex3f( 1.0,  1.0, -1.0);
    glTexCoord2f(0.0, 1.0); glVertex3f( 1.0,  1.0,  1.0);
    glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0,  1.0);
   glEnd();
   glBegin(GL_QUADS);
    glNormal3f(-1.0, 0.0, 0.0);
    glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, -1.0);
    glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0,  1.0);
    glTexCoord2f(1.0, 1.0); glVertex3f(-1.0,  1.0,  1.0);
    glTexCoord2f(0.0, 1.0); glVertex3f(-1.0,  1.0, -1.0);
  glEnd();
end;  
Эту процедуру мы будем использовать 2 раза.

  Позиции для текстуры задаются функцией glTexCoord2f(s,t : single). Она задаёт позицию X, Y координаты на полигоне. Вызывать её следует перед заданием позиции каждой точки полигона.

  Для правильного отображения текстуры, надо задать параметры отображения, при помощи функции glTexParameter(тип текстуры, тип фильтра, тип фильтрации) в FormCreate:
glTexParameter (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameter (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
Ну и разрешить режим наложения текстуры в FormCreate:
glEnable(GL_TEXTURE_2D);
  После ключевого слова implementation необходимо записать процедуру самого наложения, потому что её нет в стандартной библиотеке OpenGL.pas поставляемой с Delphi 7.
procedure glBindTexture(target: GLenum; texture: GLuint); stdcall; external opengl32; 
В OpenGL есть специальный тип данных «Uint». Он хранит индекс загруженной текстуры в памяти.

  Теперь нужно загрузить нашу текстуру при старте программы. Для этого создайте глобальную переменную Tex типа Uint и запишите следующий код в FormCreate:
Loadtexture('Tex.tga',Tex,false);
Файлы текстур уже готовы и находится в папке с исходником.
Здесь мы загружаем текстуру в память и присваиваем индекс этой текстуры переменной Tex.

Подготовка закончена.

  Нарисуем наш кубик:
procedure TForm1.FormPaint(Sender: TObject);
  begin
…
    RenderBox();	//рисуем куб
…
  End; 


И наложим текстуру:
procedure TForm1.FormPaint(Sender: TObject);
  begin
…
   glBindTexture(GL_TEXTURE_2D, Tex); // накладываем текстуру
    RenderBox();	//рисуем куб
…
  End; 


  Вызвав один раз glBindTexture, текстура будет накладываться на все полигоны, нарисованные после вызова. Для того, чтобы текстура не накладывалась можно запретить режим наложения glDisable(GL_TEXTURE_2D), а потом разрешить или наложить нулевую текстуру, то есть ничего glBindTexture(GL_TEXTURE_2D, 0).
Готово!!!

Перейдём к текстуре с прозрачностью.
Для того, чтобы текстура имела прозрачные места, необходимо разрешить альфа-тест и задать его параметры в FormCreate:
 glEnable(GL_ALPHA_TEST);     //разрешаем альфа-тест 
 glAlphaFunc(GL_GREATER,0.0);  // устанавливаем параметры
для того чтоб не было резких границ между прозрачным местом и текстурой:
 glEnable (GL_BLEND);         //Включаем режим смешивания цветов
 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ; //параметры смешивания 
Загрузим текстуру в созданную переменную Glass в FormCreate:
Loadtexture('Tex.tga',Glass,false);
Теперь наложим заранее созданную текстуру с альфа каналом:
procedure TForm1.FormPaint(Sender: TObject);
  begin
…
   glBindTexture(GL_TEXTURE_2D, Glass); // накладываем текстуру
    RenderBox();	//рисуем куб
…
  End; 


Ну и наконец, отобразим два куба с разными текстурами.
procedure TForm1.FormPaint(Sender: TObject);
  begin
…
glBindTexture(GL_TEXTURE_2D, Glass);
   glPushMatrix();
   glTranslatef(0,1.5,0);
   glRotatef(angle,0,0,1);
   glRotatef(angle1,0,1,0);
    RenderBox();
 glPopMatrix;

 glBindTexture(GL_TEXTURE_2D, Tex);
  glPushMatrix();
  glTranslatef(0,-1.5,0);
  glRotatef(angle,0,0,1);
  glRotatef(angle1,0,1,0);
   RenderBox();
 glPopMatrix;
…
  End; 


В следующем уроке мы узнаем, как сделать туман (дым) в OpenGL.

Зарегистрируйтесь или авторизуйтесь, чтобы скачать.

Источник: www.thedelphi.ru
Автор: Клящицкий Виталий
Опубликовано: 25 Июня 2012
Просмотров:

Урок 5 - Материалы и освещение Урок 7 - Туман

Зарегистрируйтесь или авторизуйтесь, чтобы добавлять комментарии.



аватар Добавил(а): катари [Новичок] Дата: 2012-12-18
а можно сделать так чтобы пользователь мог менять цвет текстуры? хотя бы, чтобы мог менять цвет от светлого к темному подскажите пожалуйста как это реализовать




аватар Добавил: Admin [Сэнсэй] vk.com/savelev_a_y Дата: 2012-12-19
Я не уверен, но думаю, что скорее всего цвет нужно менять через пиксельный шейдер. Автор уроков подробнее ответить тебе в течении дня.




аватар Добавил: Klesh [Программист] Дата: 2012-12-19
Никаких шейдеров тут не надо. Всё можно сделать ,вписав одну строку перед отрисовкой, glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, @dif); где dif - массив с 4 значениями типа GLFloat (R,G,B,A). Если задать значения к примеру (1,1,1,1) то будет максимальная яркость, а если (0.2,0.2,0.2,1) то будет темный цвет.




аватар Добавил(а): HALF-LIFE [Новичок] Дата: 2013-03-06
Как нанести одно и тоже изображение несколько раз не растягивая её на поверхность?




аватар Добавил: juzhnij [Новичок] Дата: 2013-05-29
Ставлю любую свою текстуру без фона и куб уже не прозрачный, таким образом урок ничего не обьясняет, а просто кывидывает информацию как кость собаке.




аватар Добавил: Klesh [Программист] Дата: 2013-05-29
В каком редакторе вы работаете? Я работал в фотошопе и сохранял текстуру с включенной маской, все что было под маской становилось прозрачным. Это уже вопрос редактора и устройства формата TGA, выходящий за рамки этого урока.




аватар Добавил: dmch_d [Новичок] Дата: 2014-05-25
В примере добавлен DGLUT. Разве он используется?