Текущее время: Сб 11 янв 2025 3:47

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




Начать новую тему Ответить на тему  [ Сообщений: 567 ]  На страницу Пред.  1, 2, 3, 4, 5 ... 19  След.
Автор Сообщение
 Сообщение Ср 21 дек 2011 10:00
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
Не, ты меня опять не понял. Короче, забей...

Шаман писал(а):
Но свербит в моей попе терраформинг

В следующем проекте будет, если следующий проект будет.
Шаман писал(а):
И даже когда-то показывал тут народу прогу, где торопыжка в реал-тайме носится по карте и разглаживает поверхность. Там у меня ещё и мультитекстуринг динамический был, кстати.

Не видел, покаж, если найдёш.

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


 Сообщение Ср 21 дек 2011 15:26
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
smt005 писал(а):
Не видел, покаж, если найдёш.
Уже не нашёл тут, но нашёл в своих исходниках:
http://smt005.my1.ru/_fr/0/Terraforming.rar
Управление - на цфыв, пробел и стрелки. Жуть.
Но там, помнится, я отрабатывал небо, солнце, шестиугольную сетку ландшафта, псевдомультитекстуринг динамический и терраформинг. По карте бегает торопыжка, меняя текстуру на жёлтый песочек и разравнивая поверхность. Околачивается обычно в центре карты. Найти можно по жёлтому следу, ею оставляемому, если с управлением удастся справиться. :teeth: Старый проект очень. Чисто тестовый.

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


 Сообщение Пт 23 дек 2011 3:42
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Я тут решил пошейдерить слегка на тему деферред шейдинга. Пока ощупывал рычажки и кнопочки и исследовал всё, что может пригодится, вдруг обнаружил неприятную деталь.
Во фрагментном шейдере результирующий цвет пикселя пишется так:
gl_FragColor = ...
или, что как бэ эквивалентно (и проверено лично мною на предмет работоспособности):
gl_FragData[0] = ...
Так вот кака заключается в том, что несмотря на идентичность обоих вариантов в плане получаемой картинки, второй даёт тормоза при большом разрешении экрана (фпс заметно падает). Нет ли идей на предмет "почему"? Связано ли это с дровами/железом или причина может крыться в недоинициализированности ОпенГЛя? :sad:
Дефферед шэйдинг требует второго варианта как ни крути (ибо кроме цвета пикселя нужно в дополнительные буффера писать ещё нормали и параметры материала), поэтому проблему надо как бэ решить... :roll:

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


 Сообщение Пт 23 дек 2011 10:12
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
Может gl_FragData[0] заточен под вывод нескольких "изображений". Проигрывает быстрой gl_FragColor при выводе одного "изображения" но выигрывает при выводе нескольких.
Шаман писал(а):
второй даёт тормоза при большом разрешении

Вероятно во втором случае требуется больше видеопамяти.

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


 Сообщение Пт 23 дек 2011 16:04
Профиль  
#105d99
Аватара пользователя
Сообщения: 15233
Откуда: Москва, сектор бетонных домов
Зарегистрирован: Пн 20 фев 2006 3:56
Ну, судя чисто по синтаксису, в первом случае идет чисто присваивание по адресу, т.е. одна машинная инструкция, во втором как минимум две - вычисление адреса + присваивание. Попробуй так: *gl_Frag_Data = ... хотя это все равно требует вычисления адреса, но хотя бы без сложения с нулем.


 Сообщение Пт 23 дек 2011 19:01
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Razum писал(а):
одна машинная инструкция, во втором как минимум две
Да ну ты что, Разум?! К тому же, тормоза не зависят от сложности шейдера: если рисовать конечный цвет в gl_FragData[0] и если пихать все данные в gl_FragData[1]...gl_FragData[5] и потом из них читать, чтобы высчитать конечный цвет и записать в gl_FragData[0], подтормаживает при большом размере окна в обоих случаях одинаково.
Я подозреваю, что дело в разных моделях GLSL, которая автоматом определяется компиллятором шейдеров исходя из текста шейдеров и используется. Видимо, gl_FragData не входит в список аттрибутики самой простой, первой модели шейдеров (а в какой моделе она появилась - я пока не нашёл). Я проверил - в одном и том же шейдере нельзя юзать одновременно gl_FragColor и gl_FragData. Также я узнал, что буфферов в случае gl_FragData восемь (а gl_FragColor - однослойка). Это натолкнуло меня на мысль, что все эти массивы просто не могут уместиться в кэши видеопроцессора, поэтому при обращении к разным частям этой многомегабайтной структуры происходит тормозное обращение к основной памяти.
Короче говоря, я обвинил своё железо.
Однако в нете я наталкивался на связь с FBO и инициализацию этих буфферов, чего я не делал вообще. Посему я подозреваю, что правильная инициализация этой байды может решить проблему.

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


 Сообщение Сб 24 дек 2011 10:09
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
...Иногда при просмотре мануалов для чайников, написанных другими чайниками, меня посещает желание распространять знания, подчерпнутые из официальных источников. Расскажу про шейдеры. :clever:

Вот список функций ОпенГЛя, имеющих прямое отношение к инициализации шейдеров:

unsigned int glCreateShader(unsigned int shaderType);
где shaderType - это GL_VERTEX_SHADER или GL_FRAGMENT_SHADER;
функция создаёт пустой шейдер указанного типа (вершинный или фрагментный) и возвращает его идентификационный номер.

void glShaderSource(unsigned int shader, int count, const char **strings, const int* length);
где shader - это идентификационный номер одного из созданных шейдеров;
count - кол.-во строк в тексте шейдера (текст должен быть представлен как массив строк типа char*);
strings - собственно текст шейдера, представленный как массив строк (char*), или другими словами, "массив указателей на массивы char'ов";
length - массив чисел, каждое из которых определяет количество символов в соответствующей строке; разумеется, количества элементов в массивах strings и length должны совпадать, однако для ленивых есть трюк: допускается не указывать массив чисел (length=NULL), т.е. не определять явно длину каждой строки - в таком случае подразумевается, что каждая строка в массиве strings заканчивается символом с кодом 0;

void glCompileShader(unsigned int shader);
где shader - это идентификационный номер одного из созданных шейдеров;
функция "компиллирует" указанный шейдер. Однако по сути, процесс заключается лишь в проверке работоспособности кода шейдера. Удачно ли прошла компилляция, можно узнать так:
int OK; glGetShaderiv(shader, GL_COMPILE_STATUS, &OK);
if(OK==0)return "Shader source compillation FAILED!";
После удачной компилляции шейдер является готовым к использованию.

unsigned int glCreateProgram(void);
функция создаёт пустую программу, готовую стать ехе-шником для графического процессора и возвращает её идентификационный номер;

void glAttachShader(unsigned int program, unsigned int shader);
где program - идентификационный номер программы, для которой указывается шейдер с идентификационным номером shader;
функция указывает шейдер, который будет использован при составлении кода программы; оба типа шейдеров (вершинный и фрагментный) требуется указать с помощью этой функции; нужно отметить, что один и тот же шейдер может быть "пристёгнут" к нескольким программам, ведь под шейдером подразумевается лишь источник кода, на основе которого будет составлен ехе-шник программы для графического процессора; интересная мелочь: указываемые шейдеры вовсе не обязаны быть скомпиллированными на данный момент.

void glLinkProgram(unsigned int program);
где program - идентификационный номер программы;
функция создаёт готовый к использованию ехе-шник для графического процессора. Это самый последний и самый опасный этап. Создание программы может не состояться по ряду причин, в числе которых: не указан или не скомпиллирован один или оба шейдера; шейдеры несовместимы; превышены ограничения, дровами и железом определённые, и т.д. Скрестив пальцы, узнать результат можно так:
int OK; glGetProgramiv(program,GL_LINK_STATUS,&OK);
if(OK==0)return "Program linking FAILED!";
Если "линковка" состоялась, программа готова к использованию, и использованные для её составления шейдеры можно даже удалить. Кстати, уже сразу после линковки можно узнать "адреса" использованных в программе переменных (uniform):

int glGetUniformLocation(unsigned int program, const char* name);
где program - идентификационный номер успешно слинкованной программы, а name - имя переменной (строка "с нулём на конце"), "адрес" которой необходимо узнать.

Несмотря на то, что адреса униформов известны сразу после линковки, сами униформы инициализировать можно лишь для той программы, которая активна в данный момент (т.е. используется). Т.е. после линковки можно узнать "адрес" переменной, но само значение переменной выставить ещё нельзя. Подводный камень. Я уже разок навернулся. :teeth:
Переключать успешно слинкованные программы, делая одну из них активной, нужно следующей функцией:

void glUseProgram(unsigned int program);
где program - идентификационный номер успешно слинкованной программы; если указать program равный нулю, графический процессор вернётся к стандартной программе по-умолчанию ("встроенная функциональность").


Вопросы/замечания/дополнения/похвалы/благодарности?..

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


 Сообщение Сб 24 дек 2011 22:57
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Сейчас пропёрло меня осветить самое муторное место в шейдероюзании - загрузку самого шейдерного кода из файла (например, *.txt) в шейдерный объект. Я написал простую функциёвину, создающую шейдер указанного типа (вершинный или фрагментный). Функция загружает код шейдера из файла, компиллирует шейдер и возвращает его идентификационный номер, если всё прошло успешно, либо 0, если что-то навернулось (к примеру, файл не найден, или компилляция не прошла успешно).

unsigned int CreateShader(unsigned int ShaderType, const char* ShaderSourceFilePath){
//Try to open specified file; if it is not possible, return 0 as shader name
int Handle = _open(ShaderSourceFilePath, _O_RDONLY|_O_BINARY);
if(Handle==-1)return 0;
//Check size of the file and allocate buffer of appropriate size
int FileSize = _filelength(Handle);
//int[n+1]+(char*)[n+1]+char[n]+\r\n
void* Buffer = malloc((FileSize/2+1)*8+FileSize+2);
if(Buffer==NULL)return 0; //If memory allocation failed, return 0 as shader identifier
//Map buffer: {array of string lengthes, array of string pointers, strings}

int* length = (int*)Buffer; //Array of lengthes of strings
char** string = (char**)(&length[FileSize/2+1]); //Array of strings' pointers
char* text = (char*)(&string[FileSize/2+1]); //Text buffer location
//Load text and add explicit newline characters at the end; close file after

_read(Handle, text, FileSize); text[FileSize]='\r'; text[FileSize+1]='\n';
_close(Handle);
//Scan text - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
length[0]=0;
string[0]=text;
int count=0; //Quantity of strings (counter variable)
//Search for newline identifiers

for(int c=0,cMax=FileSize+1;c<cMax;c++)if(*((short*)(&text[c]))==2573){
length[count]=(int)&text[c]-(int)string[count];
count++;
string[count]=&text[c+2];
}
//Create new shader object of specified type, pass source code to it and free buffer
unsigned int ShaderID = glCreateShader(ShaderType);
glShaderSource(ShaderID, count, (const char**)string, (const int*)length);
free(Buffer);
//Try to compile shader source and check result
glCompileShader(ShaderID);
int Compiled; glGetShaderiv(ShaderID, GL_COMPILE_STATUS, &Compiled);
//If compilation failed, delete shader and return 0
if(Compiled==0){
glDeleteShader(ShaderID);
return 0;
}
return ShaderID;
}


Под конец пара слов о юзании этой функциёвины. Аргументы:
ShaderType - тип создаваемого шейдера (одна из констант - GL_VERTEX_SHADER или GL_FRAGMENT_SHADER);
ShaderSourceFilePath - путь к файлу, содержащему код шейдера; к примеру, если указать "ShaderSource.txt", то будет загружен код из соответствующего текстового файла, лежащего в той же папке, что и ехе-шник.
Возвращаемое значение - идентификационный номер успешно скомпиллированного шейдера, либо 0, если что-то пошло не так. Причины могут быть следующие:
1) указанный файл не найден или не может быть прочитан;
2) не удалось создать буффер для загрузки файла (маловероятно)
3) компилляция навернулась (недоделанный шейдер в таком случае автоматом удаляется).

Следует также отметить, что перед запуском данной функции все требуемые процедуры ОпенГЛя должны быть доступны(glCreateShader, glShaderSource, glCompileShader, glGetShaderiv, glDeleteShader) - указатели на них должны быть объявлены (чтобы компиллятор не ругался) и инициализированы (чтобы не вылетели красные кресты).

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


 Сообщение Вс 25 дек 2011 4:44
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
smt005 писал(а):
Что касается программирования, то помощь нужна только в программировании шейдеров, а именно сами шейдеры, и если интересно, написать класс шейдеров.
Я написал "класс шейдеров"! :twisted:
Вот хеадер со всем причитающимся:

Shaders.h

Поскольку имею дурную привычку писать комменты в кодах на ломаном инглише, тута буду объяснять всё на человеческом языке. :smile:
В хеадере описан класс TShaderProgram, представляющий программу шейдеров.
Единственным членом класса является unsigned int Program - идентификатор шейдерной программы, ассоциированной с данным классом, однако эта переменная недоступна напрямую. Для её чтения описан спец. оператор, позволяющий юзать члены класса TShaderProgram в тех местах, где ожидается применять идентификатор программы, к примеру:

TShaderProgram MyShadingProgram;
glUseProgram(MyShadingProgram);
//Или так:
MyShadingProgram.Use();

Встроенные функции класса TShaderProgram:

int TShaderProgram::BuildProgram(const char* VertexShaderFilePath, const char* FragmentShaderFilePath);
Функция создаёт программу, используя коды шейдеров, находящиеся в двух указанных файлах - VertexShaderFilePath (путь к файлу с кодом вершинного шейдера) и FragmentShaderFilePath (путь к файлу с кодом фрагментного шейдера). Можно не указывать путь (ввести NULL) - тогда замест этого шейдера будет использована встроенная функциональность. Возвращаемое значение равно нулю, если всё прошло успешно и программа готова к использованию; если значение больше нуля, возвращённое значение кодирует код ошибки:
1 - не удалось создать пустую программу; возможно, ОпенГЛ ещё не был инициализирован и функция glCreateProgram была недоступна;
2 - не удалось создать пустой вершинный шейдер; причина может быть как и в случае 1;
3 - не удалось загрузить код вершинного шейдера; либо путь к файлу не действителен, либо загрузить его содержимое не удалось;
4 - не удалось скомпиллировать вершинный шейдер; ищите ашипки в коде шейдера или валите всё на старое железо, не поддерживающее требуемую модель шейдеров;
5 - не удалось создать пустой фрагментный шейдер; причина может быть как и в случае 1;
6 - не удалось загрузить код фрагментного шейдера; либо путь к файлу не действителен, либо загрузить его содержимое не удалось;
7 - не удалось скомпиллировать фрагментный шейдер; см. 4;
8 - последняя стадия навернулась - не удалось "слинковать" программу; возможно, вершинный и фрагментный шейдер несовместимы; более полную информацию о причине неудачи поможет узнать встроенная в класс функция GetProgramInfoLog():

TShaderProgram MyShadingProgram;
MyShadingProgram.BuildProgram("VertexShader.txt", "FragmentShader.txt");
char* i = MyShadingProgram.GetProgramInfoLog();
... //Читаем информацию
free(i); //Обязательно освобождаем буффер!

После линковки программы исходные шейдеры удаляются (не, файлы остаются на месте! :smile: ).
Если шейдерная программа успешно составлена, она готова к использованию. Уже можно узнать "адреса" uniform-переменных, использованных в шейдерах:

int MyTexture1Location = MyShadingProgram.GetUniformLocation("MyTexture1Location");
Или, что эквивалентно:
int MyTexture1Location = glGetUniformLocation(MyShadingProgram, "MyTexture1Location");

Чтобы сделать программу активной ("включить"), юзаем встроенную функцию Use():

MyShadingProgram.Use();
Или, что эквивалентно:
glUseProgram(MyShadingProgram);

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

+++

Помимо класса TShaderProgram в файле Shaders.h находятся дефайны использованных ОпенГЛ-констант и указатели на необходимые функции, не входящие в состав версии 1.1, описанный в стандартном хеадере GL.h, поэтому хеадер Shaders.h не требует никаких дополнительных определений и хеадеров с расширениями, хотя если таковые и входят в состав Вашего проекта, конфликтов компиллятора быть не должно. Я применил интересный трюк: указатели на функции-расширения изначально указывают на "функции-заглушки", которые при первом вызове достают адрес соответствующей им реальной функции-расширения, подменивают значение указателя, и затем запускают реальную функцию. Благодаря такому подходу, использованные в хеадере Shaders.h функции-расширения ОпенГЛ загружаются автоматически при первом их вызове, не требуя специальной инициализации (если, конечно, они у Вас больше нигде не объявлены в других файлах - иначе извольте сами инициализировать свои указатели - мой код очень скромный и ненавязчивый :tongue: ).

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


Последний раз редактировалось Shaman Вс 25 дек 2011 18:51, всего редактировалось 1 раз.

 Сообщение Вс 25 дек 2011 12:43
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
Цитата:
Я написал "класс шейдеров"!

Теперь тебе надо написать сами шейдеры.

В твоём классе нет важной штуки (в моём пока тоже), сообщения о синтаксических ошибках, в случае если шейдер не скомпилируется.

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


 Сообщение Вс 25 дек 2011 22:32
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
smt005 писал(а):
В твоём классе нет важной штуки (в моём пока тоже), сообщения о синтаксических ошибках, в случае если шейдер не скомпилируется.
Как я понимаю, это нужно лишь на этапе отладки программы? Типа, нужно проверить синтаксис указанного шейдера, да? Напиши такую вот простую функциёвину (инклюдать Shaders.h да требуется):

void CheckShaderSyntax(unsigned int shaderType, const char* ShaderFilePath){
unsigned int shader = glCreateShader(shaderType);
LoadShaderSource(shader, ShaderFilePath);
glCompileShader(shader);
int Length=0; glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &Length);
if(Length>0){
char* Info=(char*)malloc(Length);
glGetShaderInfoLog(shader, Length, NULL, Info);
MessageBox(Handle, Info, ShaderFilePath, MB_OK);
free(Info);
}
glDeleteShader(shader);
}

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

Аргументы:
shaderType - тип шейдера (GL_VERTEX_SHADER или GL_FRAGMENT_SHADER);
ShaderFilePath - путь к файлу с шейдером.

Знач функция создаёт временный шейдерный объект, грузит код из файла, компиллирует шейдер, выкидывает сообщение с путём файла в заголовке и текстом ругани компиллятора в теле сообщения, затем удаляет шейдерный объект. Чисто функция проверки шейдера.
Я бы не хотел пихать её прямо в Shaders.h, поскольку MessageBox требует хэндлера окна приложения, так что добавь функцию CheckShaderSyntax в хеадер главной формы.

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

З.Ы.: добавил в файл Shaders.h "автоинициализатор" функции glGetShaderInfoLog и перезалил файл.

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

А чё, прыкольно фурычит! Если тайпо ф шейдере накалякаю, разругивается на пару строчек, а если в шейдере ошибок нет, пишет "No errors." :smile:
Нужно ли чутка расфлюстратить функцию, чтобы не выкидывала ничего, если ошибок нет? :hm:

Добавлено спустя 13 минут:

Шаман писал(а):
Нужно ли чутка расфлюстратить функцию, чтобы не выкидывала ничего, если ошибок нет?
Во, в таком варианте будет выкидывать сообщение только если шейдер некомпиллируемый или файл отсутствует:

void CheckShaderSyntax(unsigned int shaderType, const char* ShaderFilePath){
unsigned int shader = glCreateShader(shaderType);
bool Loaded = LoadShaderSource(shader, ShaderFilePath);
if(Loaded){
glCompileShader(shader);
int OK=0; glGetShaderiv(shader,GL_COMPILE_STATUS,&OK);
if(OK==0){
int Length=0; glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &Length);
if(Length>0){
char* Info=(char*)malloc(Length);
glGetShaderInfoLog(shader, Length, NULL, Info);
MessageBox(Handle, Info, ShaderFilePath, MB_OK);
free(Info);
}
}
}else MessageBox(Handle, "File is missing!", ShaderFilePath, MB_OK);
glDeleteShader(shader);
}

Добавлено спустя 2 часа 12 минут 22 секунды:

---

А я тут выяснил проблему с gl_FragData[...]. Оказывается, фрагментный шейдер может использовать для записи эти буффера в случае, если аппликашка юзает Multiple Rendering Targets, с которыми я так и не сумел разобраться. :sad: Эти буффера требуют инициализации, ибо по-умолчанию есть лишь один - gl_FragData[0], а все последующие не доступны без особого ритуала, постичь который в рамках OpenGL2.0 мне так и не удалось. Как минимум, мои попытки пока не увенчались успехом. Внятных туториалов также не удалось найти.
Ну вот, я поделился неудачами тут, так что, по закону подлости, скоро должно найтись решение... я надеюсь... :sad:

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

Упрощённо попытаюсь объяснить, чего я добиваюсь.
У меня две шейдерных программы: одна используется для растеризации моделей, распихивая по буфферам gl_FragData[1], gl_FragData[2], gl_FragData[3]... разные аттрибуты пиксела (цвет в один буффер, нормаль в другой, бляскучесть в третий и т.д.), а вторая шейдерная прога накладывает освещение, используя данные из всех этих буфферов для вычисления конечного цвета пикселя в основном буффере - gl_FragData[0].
Т.е. процесс происходит так:
1) Включаю растеризационный шейдер;
2) растеризую все модели, заполняя буффера.
3) Включаю шейдер-освещалку;
4) накладываю все источники света.
В итоге полученной на экране каши я пнял, что лишь gl_FragData[0] хранит данные, в то время как чтения из всех остальных буфферов дают рандомные данные (т.е. не читаются и не пишутся).
Ну и как мне эти буффера инициализировать средствами OpenGL2.0 - я не вкуриваю.

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


 Сообщение Вс 25 дек 2011 23:18
Профиль  
Трёхмерный
Аватара пользователя
Сообщения: 3622
Зарегистрирован: Пн 17 янв 2005 19:23
Вкуривай если интересно.

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


 Сообщение Вс 1 янв 2012 3:50
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Вкурил! Чокнутого Шамана не остановит даже такой праздник, как Новый Год!
Оказалось, gl_FragData[...], как и gl_FragColor доступны только для записи, но читать из них нельзя (несмотря на то, что компилятор шейдеров молчит в тряпочку). Таким образом, если разбивать рисовку сцены на два шейдера - один для набивки кадра, а другой - для наложения света, то второй шейдер не может читать входные данные прямо из gl_FragData[...] или gl_FragColor, заполненных первым шейдером.
Реализуется этот двустадийный подход к рисованию с помощью Framebuffer Objects (FBO) и Multiple Render Targets (MRT), являющимися широкораспространёнными расширениями ОпенГЛя, хотя и вошедшими в состав её ядра лишь в третьей версии.
Идея такая: на первом этапе рендерить нужно в текстуры, прицепив их к специально созданному фрэймбуфферу, а на втором этапе - юзать эти текстуры и рендерить в стандартный фрэймбуффер.
Геморрой порядочный. Добиться требуемой картинки на экране мне удалось лишь через неделю, полную бессонных ночей и напарываний на все грабли ОпенГЛя, который чем дальше, тем запутаннее.
Короче говоря, вроде бы разобрался чутка с deferred shading. Буду отрабатывать технологию.

Добавлено спустя 2 часа 2 минуты 27 секунд:

...А пока интересно было бы узнать статистику по способностям железа нашего - у кого мой ехешник запустилсо, и если нет, то как ругнулся?
Архив с прогой тута (3х-метровый - текстурки там :angel: ):
https://sites.google.com/site/shamanlab ... ects=0&d=1
Должно рисовать 4 ржавые "бочки", освещаемые несколькими светильниками. Перемещаться - на ЦФЫВ, С, пробел и стрелки.
Пашет, а? :hm:

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


 Сообщение Вс 1 янв 2012 3:53
Профиль  
Механоид 4 поколения
Аватара пользователя
Сообщения: 682
Откуда: Клин
Зарегистрирован: Пт 10 июл 2009 0:04
НГ же, не?

_________________
123


 Сообщение Вс 1 янв 2012 10:24
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Бз! Пускается, не?

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


 Сообщение Вс 1 янв 2012 10:31
Профиль  
Механоид 1 поколения
Аватара пользователя
Сообщения: 119
Откуда: Казахстан, Астана
Зарегистрирован: Пн 11 май 2009 20:02
У меня при запуске выводится текст ошибок:

Fragment shaser failed to compile with the foolowing errors:
ERROR: 5:1: error (#248) Function already has a body main
ERROR: error (#273) 1 compilation errors. No code generated


Затем при нажатии на ОК, выходит новое окно:
Error#2: can not load or compile shaders!

И на этом конец.


 Сообщение Вс 1 янв 2012 11:37
Профиль  
Механоид 5 поколения
Аватара пользователя
Сообщения: 3570
Откуда: Самара
Зарегистрирован: Чт 30 апр 2009 19:07
Запустилось. Камера примерно в центре, освещение движется по часовой вокруг "бочек".

_________________
I'm going in for the kill, I'm doing it for a thrill.
Super locrian is dope.


 Сообщение Вс 1 янв 2012 15:28
Профиль  
Механоид 4 поколения
Аватара пользователя
Сообщения: 682
Откуда: Клин
Зарегистрирован: Пт 10 июл 2009 0:04
Ошибки аналогичные как у Vercus.

_________________
123


 Сообщение Вс 1 янв 2012 16:10
Профиль  
Механоид 3 поколения
Аватара пользователя
Сообщения: 490
Откуда: Украина,Донецкая об.
Зарегистрирован: Чт 4 авг 2011 15:54
У меня запустилось всё без ошибок OС Windows 7 x64
вот скрин http://aim2online.ucoz.ru/bez_imeni-1.jpg


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

Работает.

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


 Сообщение Вс 1 янв 2012 18:30
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
О, шикарно - у многих запахало, причём даже на 7-ке!
Vercus писал(а):
Fragment shaser failed to compile with the foolowing errors:
ERROR: 5:1: error (#248) Function already has a body main
ERROR: error (#273) 1 compilation errors. No code generated
На моём Radeon X300 то же самое. Интересно, в чём причина? 2 Vercus: какое железо - не секрет?

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


 Сообщение Вс 1 янв 2012 19:00
Профиль  
Механоид 1 поколения
Аватара пользователя
Сообщения: 119
Откуда: Казахстан, Астана
Зарегистрирован: Пн 11 май 2009 20:02
Шаман писал(а):
какое железо - не секрет?

У меня на ноуте не работает программа. Характеристика ноутбука:
Процессор: AMD Turion(tm) II Dual-Core M520 2.30GHz.
RAM: 3Gb.
OS: Windows 7 SP1 x64
Video: ATI Mobility Radeon HD 4500/5100 Series.


Делал запуск на коме программы. На компьютере она работает. Может проблемма из-за нехватки библиотек?


 Сообщение Вс 1 янв 2012 19:01
Профиль  
Механоид 4 поколения
Аватара пользователя
Сообщения: 682
Откуда: Клин
Зарегистрирован: Пт 10 июл 2009 0:04
Как вариант проблема может быть именно в том что видеокарта Radeon, у меня ведь тоже она и ошибка.

_________________
123


 Сообщение Вс 1 янв 2012 19:16
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Да, дрова ATI виноваты. Оказалось, если в коде шейдера (файлы *.frg и *.vrt) есть пустые строки (которые я вводил для удобочитаемости человеческими организмами), у некоторых компилляторов едет крыша. Кстати, интелловский компиллятор шейдеров не переваривает комментарии с "//", зато глотает пустые строки. :smile:
Короче говоря, будет нам с smt005 уроком: в шейдерах не должно быть комментариев, пустых строк, и, на всякий пожарный, желательно ещё и лишние пробелы не ставить - авось чей-нить компиллер ещё и на это ругаться начнёт?

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


 Сообщение Чт 5 янв 2012 17:09
Профиль  
Механоид 3 поколения
Аватара пользователя
Сообщения: 490
Откуда: Украина,Донецкая об.
Зарегистрирован: Чт 4 авг 2011 15:54
Я считаю можно попробовать сделать на движке UNITY3D говорят хороший не сложный да и мультиплеер можно легко запилять...


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

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


 Сообщение Вс 8 янв 2012 1:19
Профиль  
Механоид 3 поколения
Аватара пользователя
Сообщения: 490
Откуда: Украина,Донецкая об.
Зарегистрирован: Чт 4 авг 2011 15:54
Сори что вопрос не по теме.Как модели глайдеров ну и остальные экспортировать в 3ds max?
Думаю если что не получиться прошлый план (описан в другой теме) то попробую двигло "CryENGINE 3" ,знаю что двиг крутой и тяжелый ну а что надо с чего то начинать тем более уроки есть,а скрипты наверно "Lmb" на пишит. Вот это я загнул с двиглом :mrgreen:
Мне "Lmb@ предлагал этот двиг но графика не очень гуд http://gcup.ru/load/pixellight/3-1-0-1494

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

В принципи нечего погрызу край энгейч 3 брошу,погрызу брошу,погрызу может что и выйдет :teeth:


 Сообщение Вс 8 янв 2012 10:21
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
А какие требования к движку вообще имеются? Из каких критериев выбирать (если уж пошло на то, что не самому писать)?
Заявы типа "а вот с этим движком графика лучше" не катят.
Короче, чего хотим?
Я хочу в обязательном порядке бамп, тени. Параллакса не надо. Очень желательно отражения - в Мехах дофига железа, оно должно сочно переливаться. :smile: Ещё нужно неограниченное количество источников света - в игре огромный арсенал плазмомётов и лазеров - каждый снаряд или точка попадания лазера должен(а) освещать окружающие предметы, или, как минимум, отбрасывать блики на металле вокруг. Это требование не проблема при deferred shading'е, поскольку источники света накладываются отдельно в неограниченном количестве. Упрощение в данном варианте - теней от этих источников света не нужно.
Ещё я люблю эффект bloom - размытие засвеченных пикселов. Но фиг с ним с HDR (динамическая подстройка освещения) - всегда более тормозной эффект, чем полезный.
Огонь нужен - жутко нереалистично было в М1-М2 палить всё вокруг из плазмомёта и не наблюдать пожара. Дым туда же.
Точечные повреждения, отметины на корпусе в местах попаданий хочу. :smile:
Физика. Задней мыслью чувствую, что в мире парящих на антигравах шариков, PhysX уж как-то чересчур серьёзно, но мы все хотим нормальную полноценную физику, и я то же. Однако симулятор антиграва, ИМХО, всё равно лучше написать отдельно.
Но самое стрёмное - терраформинг. Подозреваю, это требование сильно сузит круг движков-кандидатов. Под терраформингом я подразумеваю не только корректировку карты высот в реал-тайме, но ещё и перераспределение текстур (превращение пологого участка поверхности в обрыв должно сопровождаться заменой текстуры "травка" на "скала"). Под терраформингом подразумевается в простейшем варианте образование кратеров в местах взрывов глайдов и бомб. Отметины на ландшафте также необходимы.

Вот такое у меня представление о движке М3 в час ночи. :smile:

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


 Сообщение Вс 8 янв 2012 10:33
Профиль  
Механоид 1 поколения
Аватара пользователя
Сообщения: 119
Откуда: Казахстан, Астана
Зарегистрирован: Пн 11 май 2009 20:02
У меня такое же представление о движке для механоидов, только ещё генератора погоды не хватает. Плюс управление глайдером может быть осложнено из-за сильного ветра к примеру. Чтобы была система точечных повреждений глайдера, из-за которых меняется поведение глайдера. Повредил крыло - падает маневренность (или смотря как крыло будет обломано, глайдер может заносить в разные стороны на скорости, эффект как у машины спущенное колесо или типа того), подстрелены двигатели - падает скорость, и ещё что-то в этом роде.


 Сообщение Вс 8 янв 2012 21:47
Профиль  
Разработчик идей
Аватара пользователя
Сообщения: 4577
Откуда: Минск, Беларусь
Зарегистрирован: Ср 14 ноя 2007 19:00
Это всё приписывается к движку внешне, ИМХО.

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


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

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


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

Сейчас этот форум просматривают: Ahrefs [Bot] и гости: 5


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

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