Текущее время: Сб 11 янв 2025 1:07

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 567 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7, 8 ... 19  След.
Автор Сообщение
 Сообщение Вс 29 янв 2012 1:15
Профиль  
Механоид 3 поколения
Аватара пользователя
Сообщения: 490
Откуда: Украина,Донецкая об.
Зарегистрирован: Чт 4 авг 2011 15:54
Шаман писал(а):
Могу в кратце описать что как твориться.
Интересно было бы узнать секрет! :yes:

Да да и мне интересно...


 Сообщение Вс 29 янв 2012 17:50
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
2 Шаман
Я хотел сказать что может профессионалы делают так что работа скрипт-движка не сильно отличается от работы обычной программы, а у меня работаетс использованием простых функций.

Заметка: под обычними/простыми переменными и функциями и подразумеваю функции которые непосредственно работают в приложении.

1. Сначало создаются функции (класс о котором позже напишу) в которых записывается указатель на реальную функцию, которая непосредственно работает в программе, например закрытие приложения. И создаётся переменная (о которй тоже позже наппшу) в которую записывается указатели на все важные ресурсы программы.

2.1. Компиляция. Текст разбивается на элементы ( Token ), например
int Var; float Fun();
разбивается на
int
Var
;
float
Fun
(
)
;

Затем определяется тип элемента:
int - тип
Var - неизвестно
; - разделитель
float - тип
Fun - неизвестно
( - разделитель
) - разделитель
; - разделитель


2.2 Основываясь на комбинациях типа и значения элементов, определяется что написано.
Реальный код:
while (iToken < aToken.GetSize())
{ // - 1
int iTokenBuff = iToken;
//--------------------------------------------------------------------------
if ( aToken[iToken] == END) break;
// Объявления
DecVareable(iToken);
DecFunction(iToken);
ChildFunction(iToken);
ReturnFun(iToken);
BreakFun(iToken);
ClosingFunction(iToken);

// Операции с переменными
AssignVar(iToken);
SearchFun(iToken, NULL, NULL);

// Специальные функции
IfElse(iToken);
While(iToken);
For(iToken);

//--------------------------------------------------------------------------
// Если сдвиг не произошо, значит требуемая комбинация не нашлась - ОШИБКА
if ( iTokenBuff == iToken )
{
ERROR_LOG << "СООБЩЕНИЕ: Остановка чтения на строке: " << aToken[iToken].NamLine + 1 << " [" << aToken[iToken].Text() << "]" << endl;
return false;
}

К примеру, "DecVareable(iToken);", если нашлась нужная комбинация (тип, неизвестно, разделитель), значит создаётся перемекнная и происходит сдвиг счётчика iToken.
Если не нашлась никакая комбинация, счётчик не увеличивается и ищется другая комбинация, например "DecFunction(iToken);", объявление функции.
Если ни одна комбинация не совпала, значит гдето косяк в написанном скрипте - компиляция останавливается указывая на номер строки и номер элемента.

3. Функция, класс в которм хранится (в кратце):
class C_Function
{ // - 0
public:
char * pName; // Наименование функции
C_Var *VarReturn; // Фозвращаемая переменная функции
C_Var *aGlobalVar; // Указатель на массив глобальных переменных
// Массив параметров функции
int CountParamVar;
C_Var *aParamVar;
// Локальные переменные
int CountLocalVar;
C_Var *aLocalVar;
C_Var *(*pPerfomFun)(C_Function *Func); // Указатель на исполняющую функцию
// Массивданным для вызова функций
int CountFun;
S_FunData *aFun;
...
};

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


Последний раз редактировалось smt005 Вс 29 янв 2012 18:45, всего редактировалось 2 раз(а).

 Сообщение Вс 29 янв 2012 18:36
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
4. Что такое переменная "C_Var" - это структура с типом union который может принимать любой тип - переменные до 4 байт или указатели.

5. Пространство имён. Переменные храняться в трёх местах:
а. Глобальные переменные, массив в классе скриптов.
б. Локальные переменные - массив в классе функции.
в. Параметры функции - тоже массив переменных по типу локальных переменных.

Доступ к переменной происходит не с помощью указателя а с помощью индексов.
class ID
{
private:
int Pos;
int Loc;
...
};

Где Loc определяет из какого массива надо получить переменную.
#define SCR_GLOBAL -2 // - из массива глобальных переменных
#define SCR_PARAM -1 // из параметров (других локальных переменных) текущей функции
#define SCR_LOCAL 0 // из массива локальных переменных текущей функции
#define SCR_LOCAL 1 // тоже самое что и выше только в дочерней функции, дочерних функций может быть сколько угодно (теоретичеки).

Pos номер переменной в конкретном массиве.

6.1 "C_Var *(*pPerfomFun)(C_Function *Func);" Так называемая мной "исполняющая функция", это функция которая получает из переменных C_Var обычные переменные которые передаются в уже обычные функции движка.
Пример
// SCR_Multiplication
//------------------------------------------------------------------------------
C_Var *SCR_Multiplication(C_Function *Func)
{ // - 0
C_Var * VarReturn = new C_Var;
C_Var * VarParam0 = &Func->aParamVar[0]; // Массив параметров функции, переменные можно взять из aLocalVar и aGlobalVar если надо.
C_Var * VarParam1 = &Func->aParamVar[1];

float FLOAT = VarParam0->Float() * VarParam1->Float();

*VarReturn = FLOAT;
return VarReturn;
} // - 0


Сначало находятся сами переменные из массивов, замет получение обычных переменных, их умножение, и присвоение значение новой переменой "C_Var * VarReturn".
Шаман, я уверен что ты захочешь сказать что я не написал "delete VarReturn", но "delete" происходит в функции "C_Function".

Эта исполняющая функция выполняется если указатель "*pPerfomFun" не равен NULL.

6.2 Если "*pPerfomFun" РАВЕН NULL. то выполняется другое...
Это структура данных на основании которой работает функция
class S_FunData
{ //- 0
public:
ID *RetID; // Удентификатор на возвращаемую переменнту
// Массив параметров которые доолжна принять функцияи
int CountParamID;
ID *aParamID;
C_Function *Function; // Указатель на функцию которая должна выполнится и получить, и передать параметрам которые описаны выше.
...
}; // - 0


Так вот, если не выполняется пункт 6.1, выполняется цикл, который вызывает функции из массива "S_FunData *aFun;

7. Немного подробней.
Т.е. получается, есть массив функций "class C_Function" в классе скриптов в котором записаны локальные переменные и указатель на успоняющую функцию "pPerfomFun" и/или на массив массив "class S_FunData".
Когда вызывается функция: выполняется пунк 6.1 или 6.2.
Если 6.2, то функция из "S_FunData" не просто вызывается, а копируется
C_Function *pPerfomFun = new C_Function; // Уже не в массив, а просто гдето в памяти
*pPerfomFun = *aFun[i].Function;


Копирование нужно для того чтобы в процессе работы с локальными переменными они не изменялись, это позволяет вызывать функцию не один раз, возможна даже рекурсия.
Из "S_FunData" находятся и копируются переменные-параметры в массив "aParamVar

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Вс 29 янв 2012 19:22
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Всё пнятненько, smt005 - у тебя 100% скриптовый движок, работающий по принципу "читаю-исполняю". Выходит, каждый раз, как ты запускаешь скрипт, двой движок жуёт файл и исполняет его по кусочкам.
В общем, у нас только до сюда одинаково:
smt005 писал(а):
1. Сначало создаются функции (класс о котором позре напишу) в которых записывается указатель на реальную функцию, которая непосредственно работает в программе, например закрытие приложения. И создаётся переменная (о которй тоже позже наппшу) в которую записывается указатели на все важные ресурсы программы.

У меня подход похожий, но мой движок жуёт код один раз. Он точно так же нарезает код на фразы, каждая из которых содержит несколько токенов определённого вида (по одному токену каждого вида на фразу):
токен-идентификатор (переменной или функции), по-простому название, состоит из символов, отличных от
(){}[]",
Токен-аллокатор - это текст в квадратных скобках [] - определитель байтового размера переменной;
Токенов-инициализаторов у меня два - текстовый (текст между двумя двойными кавычками) и аргументный {...}. Круглые скобки тоже идут в подтип инициализаторов, но отправляют компиллер ковыряться иным алгоритмом.
Короче, мой компиллер нарезает код на фразы, затем бьёт каждую фразу на токены - имя, аллокатор и инициализатор. Если инициализатор - не круглые скобки, то компиллер воспринимает фразу как "создание переменной". Аллоцируется память, имя переменной заносится в отдельный список дополнительных ресурсов для дальнейшей компилляции данного скрипта, память заполняется данными (если инициализатор дан) и т.д.
Если же в выдернутой фразе токен-инициализатор заключён в круглые скобки, значит фраза - это вызов функции. Вызовы функций я компиллирую в скрипт так:
1) Компиллятор ищет имя функции в ресурсах. Если не нашёл - вызов функции не компиллируется. Если нашёл, 4-хбайтный адрес функции (указатель) идёт в карман компиллятору.
2) Сбор аргументов функции. Компиллер шарит внутри круглых скобок и "упрощает" каждый из аргументов функции до 4-хбайтного значения. Если аргумент - число, оно переводится в двоичный формат; если имя - компиллер ищет его в списке ресурсов и кладёт в карман 4-хбайтный указатель, этому имени соответствующий. Если это целая фразуха по созданию переменной - переменная создаётся и адрес на неё идёт компиллеру в карман.
3) Когда все аргументы функции (4-хбайтные значения) собраны, и указатель на функцию тоже есть, компиллятор формирует машинный код вызова функции, который в ассемблере выглядел бы так:

//Запихать в стак все аргументы функции, начиная с конца
push dword ptr ArgN; //Запихать в стак последний аргумент
...
push dword ptr Arg3; //Запихать в стак третий аргумент
push dword ptr Arg2; //Запихать в стак второй аргумент
push dword ptr Arg1; //Запихать в стак первый аргумент
mov ebx, FunctionPointer; //Запихать в регистр ebx адрес функции
call ebx; //Вызвать функцию, адрес которой находится в регистре ebx

Вот так формируется вызов функции формата __stdcall - пихание аргументов в стак в обратном порядке, затем вызов функции. Мой компиллер компиллирует вызовы всех функций подобным образом, составляя буффер функции скрипта, затем ставит в конце:

ret; //Возврат из функции

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

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Чт 2 фев 2012 22:50
Профиль  
Переменчивый
Аватара пользователя
Сообщения: 13659
Откуда: Королёв, сборочные цеха
Зарегистрирован: Сб 15 сен 2007 21:53
Newarrior писал(а):
посмотрел муву глянул и могу сказать тебе для развития мехов 3 нужны хорошие скриптеры,дизайнеры и продюсер который писал с.жет для мехов

Действительно, для создания М3 нужна всего навсего полноценная студия. So easy.
Продюсер, пишущий сюжет - это сильно.

_________________
-=S.A.L.K.E.R.=-
Совпадение? Не думаю.


 Сообщение Чт 2 фев 2012 23:37
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Намтаре интерраптнул канал манапередачи. Пересылка пакета положительных эмоций прервана.
Ну вот зачем, а? Засвербило чтоль?

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Пт 3 фев 2012 16:43
Профиль  
Переменчивый
Аватара пользователя
Сообщения: 13659
Откуда: Королёв, сборочные цеха
Зарегистрирован: Сб 15 сен 2007 21:53
Что зачем? Я вот своим проектом занимаюсь без всяких каналов положительных эмоций.

_________________
-=S.A.L.K.E.R.=-
Совпадение? Не думаю.


 Сообщение Пт 3 фев 2012 17:34
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Ах, ну прости - просто никто ж об этом не знает... :roll: :wink:

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Пт 3 фев 2012 22:57
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
Шаман писал(а):
нужны хорошие скриптеры,дизайнеры и продюсер
Этим всем я занимаюсь один единтвенный.

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Пт 3 фев 2012 23:23
Профиль  
Механоид 5 поколения
Аватара пользователя
Сообщения: 4676
Зарегистрирован: Вс 29 авг 2010 18:18
Цитата:
Продюсер, пишущий сюжет - это сильно.

Часто так и бывает. Сюжет пишет продюсер, а сценарий - сценарист.

Добавлено спустя 1 минуту 4 секунды:

Шаман писал(а):
Ах, ну прости - просто никто ж об этом не знает...

Для тебя так удивительно, что человек не показывает свои труды, пока не доделает?

_________________
GAMES ARE ONLY FUN IF THEY HURT A LITTLE BIT


 Сообщение Пт 3 фев 2012 23:31
Профиль  
Переменчивый
Аватара пользователя
Сообщения: 13659
Откуда: Королёв, сборочные цеха
Зарегистрирован: Сб 15 сен 2007 21:53
Цитата:
Часто так и бывает. Сюжет пишет продюсер, а сценарий - сценарист.

Зависит от индустрии, насколько я знаю.

_________________
-=S.A.L.K.E.R.=-
Совпадение? Не думаю.


 Сообщение Пт 3 фев 2012 23:37
Профиль  
Механоид 5 поколения
Аватара пользователя
Сообщения: 4676
Зарегистрирован: Вс 29 авг 2010 18:18
Да, в сталепромышленной, кажется, обходятся без сценариев. Но я не уверен.

_________________
GAMES ARE ONLY FUN IF THEY HURT A LITTLE BIT


 Сообщение Пт 3 фев 2012 23:42
Профиль  
Переменчивый
Аватара пользователя
Сообщения: 13659
Откуда: Королёв, сборочные цеха
Зарегистрирован: Сб 15 сен 2007 21:53
Рекламная индустрия, индустрия кинематографа, игровая индустрия...

_________________
-=S.A.L.K.E.R.=-
Совпадение? Не думаю.


 Сообщение Пт 3 фев 2012 23:46
Профиль  
Механоид 5 поколения
Аватара пользователя
Сообщения: 4676
Зарегистрирован: Вс 29 авг 2010 18:18
В рекламной точно так, сценаристу выдают сюжет и катай к нему сценарий.

Добавлено спустя 30 секунд:

Причем еще иногда перезванивают и меняют сюжет, когда ты уже почти дописал.

Добавлено спустя 1 минуту 36 секунд:

В кинематографе тоже так же. Основная идея всегда от продюсера идет. Режиссеры очень поэтому с продюсерами срутся. Собственно, у моего братушки (ну, который мультфильмы рисует) из-за разногласий с продюсерами не вышло запустить мультсериал.

_________________
GAMES ARE ONLY FUN IF THEY HURT A LITTLE BIT


 Сообщение Пт 3 фев 2012 23:46
Профиль  
Переменчивый
Аватара пользователя
Сообщения: 13659
Откуда: Королёв, сборочные цеха
Зарегистрирован: Сб 15 сен 2007 21:53
Насчёт рекламной я и не сомневаюсь. А вот в игровой продюсер не часто пишет сюжет.

_________________
-=S.A.L.K.E.R.=-
Совпадение? Не думаю.


 Сообщение Пт 3 фев 2012 23:46
Профиль  
Механоид 5 поколения
Аватара пользователя
Сообщения: 4676
Зарегистрирован: Вс 29 авг 2010 18:18
Да и в игровой, мне кажется, тоже так же. Хотя не уверен.

_________________
GAMES ARE ONLY FUN IF THEY HURT A LITTLE BIT


 Сообщение Пт 3 фев 2012 23:49
Профиль  
Переменчивый
Аватара пользователя
Сообщения: 13659
Откуда: Королёв, сборочные цеха
Зарегистрирован: Сб 15 сен 2007 21:53
Влияние на сюжет у них есть, но как правило идея сюжета принадлежит не им. Продюсерам сюжет уже приносят.

_________________
-=S.A.L.K.E.R.=-
Совпадение? Не думаю.


 Сообщение Сб 4 фев 2012 0:30
Профиль  
Скриптизёр
Сообщения: 10646
Откуда: Мариуполь
Зарегистрирован: Пт 13 апр 2007 17:15
Намтар Чёрный писал(а):
Продюсер, пишущий сюжет - это сильно.
Тем не менее продюсер действительно не помешал бы!


 Сообщение Сб 4 фев 2012 9:10
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Кроготе, а давай не будем мешать Намтару с Пеком пакетиками тут друг перед другом оттрясывать... :angel:

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Сб 4 фев 2012 11:09
Профиль  
Переменчивый
Аватара пользователя
Сообщения: 13659
Откуда: Королёв, сборочные цеха
Зарегистрирован: Сб 15 сен 2007 21:53
Цитата:
Тем не менее продюсер действительно не помешал бы!

Твоя правда.

_________________
-=S.A.L.K.E.R.=-
Совпадение? Не думаю.


 Сообщение Сб 4 фев 2012 19:23
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Слил. :tongue2:

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Сб 4 фев 2012 20:16
Профиль  
Механоид 5 поколения
Аватара пользователя
Сообщения: 4676
Зарегистрирован: Вс 29 авг 2010 18:18
У тебя неправильные представления о сливе. Возможно, именно из-за этого тебя собьет грузовик в дветыщи тридцатом.

_________________
GAMES ARE ONLY FUN IF THEY HURT A LITTLE BIT


 Сообщение Сб 4 фев 2012 21:38
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
Флуд пошёл!!!

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Пн 6 фев 2012 0:02
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
2 smt005: какие данные модели ты используешь в своём движке? Ну координаты вершин и текстурные координаты, ясен пень. Нормали. А колор юзаешь, или ставишь белый цвет всей модели, полагаясь на текстуру?

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Пн 6 фев 2012 0:42
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
Делаю всё белым и полагаюсь на текстуры.
Планирую две тектуры, дифузный с альфа и карту нормалей (normal map) с картой бликов.

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Пн 6 фев 2012 2:29
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Карта нормалей или бамп-мапа? Это две разные вещи: в карте нормалей нормали находятся в трансформированном виде, а бамп-мапа TBN матриц от каждой вершины требует для перевода. Думаю, ты второй вариант юзаешь. Не знаю, думал ли ты об этом, но раз ты цвета для модели не юзаешь (ИМХО, архаизм, действительно), то TBN матрицу можно посылать с помощью glNormal3f+glColor3f+glSecondaryColor3f, чтобы не париться с дополнительными аттрибутами вершины для бинормалей и тангент.
Просто насчёт цвета хотел уточнить и убедиться, что он наф не нужен. :smile:

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Пн 6 фев 2012 10:10
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
2 Шаман
Я же написал "карту нормалей (normal map)", это первый вариант.

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Пн 6 фев 2012 14:25
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Ух ты! Вот же здорово! А есть у тебя модель какого-нить глайда в соответствующем формате? Я бы тогда прямо-таки юзанул его в тесте деферед-шейдингового нет-клиента - мой рендерер умеет ренедерить только недеформируемые модели с float[3] вершинами и float[2] текскоордами, беря нормали прямо из карты нормалей. Но из-за симметричности моделей в Мехах один и тот же кусок текстуры накладывается на разные участки глайда, посему из всех моделей у меня только самодельная бочка - я с текстурингом никакущий. :teeth:
Дай глайд! :god:

Добавлено спустя 25 секунд:

Пожалйуйста! :god: :god: :god:

Добавлено спустя 24 минуты 20 секунд:

А я вот класс TShaderProgram доработал - теперь если компилляция шейдера заваливается, автоматом выкидывает сообщение с путём файла в шапке и руганью компиллера внутри. Помнишь, ты просил, а я это отдельной функцией сделал? Вот теперь всё встроено:

Shaders.h

_________________
Сообщество креативных механоидов:
aim-fans.ru


 Сообщение Пн 6 фев 2012 18:06
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
http://smt005.my1.ru/KopEngine/Base.rar

У меня текстуры хранятся в двух текстурых *.DDS, загрузка других форматов тоже поддержывается.

_________________
https://sites.google.com/site/intelligencecells
http://www.youtube.com/user/IntelligenceCells


 Сообщение Вт 7 фев 2012 4:07
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Арргх! Нет же - это бамп-мапы у тебя! Вот пример нормал-мапы для цилиндра:
ИзображениеБамп-мапа вся голубая, а нормал-мапа разноцветная. Бамп-мапа модифицирует направление нормали, используя TBN матрицу, а нормал-мапа задаёт направление нормали однозначно (ибо содержит готовое значение нормали). Если юзать бамп-мапу, геометрия модели должна содержать нормали, бинормали и тангенты для каждой вершины (TBN матрица), а в случае нормал-мапы не нужно даже нормалей. Основной минус нормал-мапы - она не позволяет накладывать один и тот же участок текстуры на поверхности, ориентация которых различна. Т.е. каждому пикселу текстуры соответствует уникальный участок поверхности модели - нельзя юзать один и тот же кусок для двух боков симметричной модели, ибо нормали там, очевидно, торчат в разные стороны. Нормал-мапа, в отличие от бамп-мапы, не паттернуется и уникальна для каждой модели.
Другими словами, нормал-мапа - это способ хранения нормалей модели в текстуре, нежели в виде массива; нормал-мапа самостоятельно задаёт нормаль в точке, а бамп-мапа использует TBN матрицу для получения значения нормали. При юзании нормал-мапы вся геометрия модели ограничивается лишь координатами вершины и координатами текстуры.
У меня есть коды, которые генерят нормал-мапу для ОБЖ-объекта, содержащего нормали и имеющего бамп-мапу, но есть особое требование к модели - текстурные координаты: текстура должна накладываться на объект без повторений. Симметричные объекты вечно имеют зеркально-наложенную текстуру, из-за чего нормал-мапа получается верной лишь для одной из сторон объекта, а для второй нормали выворачиваются примерно наизнанку.

Почему я так привязался к нормал-маповому способу прямого задания нормалей - это более чем в 3 раза уменьшает размер геометрии (только вершины и текстурные координаты - никаких нормалей, бинормалей и тангент в придачу) и соответствующий малый траффик данных геометрии, хотя всё тот жет траффик текстурных данных; а также в разы упрощает рисование модели: отсутствует транформация TBN в вертексном шейдере, не нужна нормализация вектора нормали во фрагментном шейдере, ибо нет искажений из-за апроксимации нормали, бинормали и тангенты между вершинами и их неортогональности, в то время как аппроксимация нормалей между соседними текселями нормал-мапы в большинстве случаев даёт минимальные погрешности в длине нормали, что позволяет сэкономить на тормозной нормализации.
Второй плюс - если составить нормал-мапу для высокополигонального варианта модели, а затем накладывать её на угловатый низкополигональный вариант, модель всё равно будет выглядеть гладко. Это можно было видеть в тестовой проге дефферед-шейдинга, что я показывал - там восьмиугольный цилиндр выглядит круглой трубой, если смотреть сбоку. :smile: В случае же бамп-мапы этого можно будет добиться лишь нормализацией.
Третий плюс нормал-маппинга - оптимизация полигонов. Поскольку по каждой вершине идут лишь координаты текстуры, то бОльшее количество вершин можно логически объединять в цикл вывода одного полигона: те совпадающие по координатам вершины, что лежат на ребре модели и различаются нормалями, могут быть объединены в один полигон. Правда, само ребро станет в данном случае сглаженным, так что эта оптимизация довольно спорная.

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

_________________
Сообщество креативных механоидов:
aim-fans.ru


Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 567 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7, 8 ... 19  След.

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB