alexprey alexprey

Добавил скриншоты на главную, позже загружу дневники разработки игры, где можно будет посмотреть с чего все начиналось :)

alexprey alexprey

EfReeZe, о да, тогда было знатное время и игра казалась сделано круто :D До сих пор иногда играю на телефоне от скуки)

EfReeZe EfReeZe

Это был наш далёкий 2014...

Jusper Jusper

Запись трансляции на YouTube

Jusper Jusper

Случайно сделали битву сварщиков
https://devtribe.ru/p/slash-polygon

Jusper Jusper

Внезапно на сайте потерялся 15-й выпуск. Перевыложили.

Jusper Jusper

Я вам еще не закончил писать обратную связь по боевке, есть много вещей которые немного смутили, но они поправимы. Завтра, если перестанут дергать - чиркану. Спасибо за демку!

Jusper Jusper

ruggaraxe,

Да, в этом плане все ок. Логично, что графен на старой машине, если не упарываться, не взлетит. Но я рад, что это было не 5 фпс, как даже в некоторых АА (типа Pillars of Eternity в некоторых схватках...

Jusper Jusper

ruggaraxe,

Подкреплю ее к публикации.

ruggaraxe ruggaraxe

Jusper, вот ссылка на анкету (я затупил со ссылкой с топике, сорри)
https://docs.google.com/forms/d/e/1FAIpQLSd_Wn53lJFrnfGpWI2IX...

ruggaraxe ruggaraxe

Jusper, честно говоря, да на 800х600 даже не проверяли... :) сорри. Ориентировались на FullHD и выше. Хотя над интерфейсом конечно же надо еще хорошенько поработать.
Тултипы постараемся сделать обязательно к следующей версии...

GenElCon GenElCon

Jusper,

Наверное. В прошлом они сделали Endless Legend - посмотри и сразу станет ясно в какую сторону они работают.

Jusper Jusper

GenElCon,

Я не очень понял по трейлеру геймплей. Это что-то типа цивы? Или это RTS?

GenElCon GenElCon

Humankind от разработчиков Endless Legends (и Space, но тут важно именно Legends).
А также согревающие сердца олдов трейлеры Port Royal 4 и Knights of Honor.

Jusper Jusper

Похвалю темную атмосферу, отличную работу с освещением, тенями и шейдерами. Происходящее на экране корректно задает атмосферу до тех пор, пока не начнется сам экшон, об это напишу далее. Управление персонажем отзывчивое...

Jusper Jusper

Первое, оно же самое тяжелое - UI. Я конечно, понимаю, что 800x600 совсем уже не в моде (завтра проверю на нормальной широформатной машине). Заблюренный текст я еще прочитать могу, но вот конкретно размер его крайне мал...

...
Jusper Jusper

ruggaraxe, я поиграл на старом маке 2012 года (Macbook Pro, Intel HD 4000), рад что с учетом довольно нагруженной по свету и теням картинке игруля не лагает как последняя сволочь (лагает конечно, но очень терпимо...

Логотип проекта Unity

#2 ShaderLab

Прежде чем начать писать шейдер, нам нужно изучить ShaderLab.
ShaderLab - это описательный язык программирования, внутри которого пишется сам шейдер. Этот язык выполняет различные функции:

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

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

Структура ShaderLab

ShaderLab является языком программирования, а значит как и у любого языка, у него есть своя структура.
Давайте разбираться. :)

Любой шейдер в юнити пишется по такому шаблону:

Shader "Name" { 
	[Properties] 
	SubShader{
		CGPROGRAM  
		// Код на языке CG  
		ENDCG
	} 
	[Fallback] 
}

Начинается шейдер с ключевого слова Shader, после, в кавычках, указывается имя шейдера. Причем в имени можно указать путь в выпадающем окне выбора шейдера в материале. Далее идет блок свойств. Начинается он с ключевого слова Properties {}. Остановимся на нем
подробнее.

Properties

В этом блоке мы описываем переменные, которые будут видны в инспекторе. Задавать их нужно в таком формате:

ИмяПеременной("Имя в инспекторе", ТипПеременной) = значение переменной по-умолчанию

Типы переменных в блоке Properties

  • Range(min,max) = number // float в промежутке от min до max
  • Float = number
  • Int = number
  • Vector = (numer, number, number, number) // x,y,z,w
  • Color = (numer, number, number, number) // r,g,b,a
  • 2D = "defaulttexture" {} // 2D текстура
  • Cube = "defaulttexture" {} // Кубическая текстура

Пример:

_MainTexture("MainTexture", 2D) = "white" {} 
_MainColor("MainColor",Color) = (1,1,1,1) 
_Atten("Atten",Range(0,1)) = 0.5 
Вид параметров в инспекторе Unity — #2 ShaderLab — Unity — DevTribe: Разработка игр
Вид параметров в инспекторе Unity

SubShader

Каждый шейдер в Unity содержит список subshader’ов (должен быть как
минимум один). Когда Unity должен отобразить меш, он ищет шейдер для использования и выбирает первый subshader, который способен работать на видеокарте пользователя.

Subshader определяет список проходов рендеринга (Pass'ов) и опционально устанавливает любое, общее для всех проходов, состояние. Кроме того, могут быть установлены специфичные для subshader тэги. Смотрите Документацию юнити.

Т.е. SubShader состоит из определенного числа проходов, в которых выполняются определенные инструкции (CG код). А теперь немного про тэги. Тэги нужны для того, что бы назначить, как и когда будет рендерится шейдер.

Пример:

SubShader 
{
   Tags{"Queue" = "Transparent"} 
      Pass  
          {
             CGPROGRAM 
             ENDCG
          }
}

Тэги шейдеров Unity

Тэги пишутся внутри блока Tags{} по шаблону:

Tags { "Имя тэга1" = "значение1"  "Имя тэга" = "значение2"  }

Отсюда видно, что тэги идут парами ["Тэг" = "значение"] (с кавычками)

Разберем самый используемый тэг, служащий для назначения порядки отрисовки:

Имя тэга здесь будет Queue, что в переводе означает очередь. Возможные значения тега Queue:

  • Background - объект рендерится в первую очередь. Используется обычно для скайбоксов или чего-нибудь похожего.
  • Geometry - стандартная очередь рендера, используется для

большинства непрозрачных объектов.

  • AlphaTest - используется для Альфа-теста геометрии. Во время рендера отделяет эту очередь отрисовки от Geometry т.к. более эффективно отрисовывать Альфа-тест геометрию после того как все остальные объекты отрисованы в Geometry.
  • Transparent - отрисовка выполняется после Geometry и AlphaTest, отрисовывая объект сзади наперед. Используется для рендера таких объектов как стекло, частицы и т.д.
  • Overlay - объект рендерится в последнюю очередь. Используется для эффектов наложения (lens flares и т.д.)

[ Документация ]

Путь рендера (Pass)

Вертексные и пиксельные шейдеры пишутся внутри блока Pass {}. Подробнее про написание шейдеров мы поговорим в следующей статье, а сейчас лишь обратим внимание на тэги и установки для рендера. Мы уже знаем, что, тэги уже были в SubShader, в Pass так-же есть свои тэги. Тэги в Pass пишутся так-же в блоке Tags{}, и даже по тому-же шаблону. Просто имена тэгов и значения разные, соответственно, они обозначают другие свойства. Для того, что бы понять, что они делают, нужно прочитать [ это]. А после прочесть следующую [ страницу о Pass-тэгах].

Установки для рендера

Для того что-бы задать определенные установки для рендера в пределах одного Pass'а,такие как: смешивание, отсечение пикселей, настройки Z буффера, смещение и т.д., используют специальные команды. Пишутся они в формате: Имя Значение. Например:

Cull Off
Zwrite On

Основные установки и значения:

  • Cull - Задаёт те стороны полигонов, которые должны быть отсечены (не рисуются)
    1. Cull Back - отсекает полигоны, которые направлены от камеры
    2. Cull Front - отсекает полигоны, которые направлены на камеру
    3. Off - отключает отсечение
  • ZWrite - Записываются ли пиксели объекта в буфер глубины (по умолчанию On)
    1. On - Записывает
    2. Off - Не записывает
  • ZTest - Как проверка глубины должна быть исполнена. По умолчанию LEqual ( про Z буферизацию)
    1. Less - Отрисовывает ближайшие пиксели ( с меньшей глубиной)
    2. LEqual (Less or Equal) - Отрисовывает ближайшие пиксели, скрывает те что позади их
    3. Greater - Отрисовывает пиксели с большей глубиной
    4. GEqual ( Greater + Equal)
    5. Always - Отрисовывает пиксели не зависимо от глубины.
  • Blend - смешивание. Тема интересная и важная,но и большая по объему. Вот ссылки на материал, в котором очень хорошо описано смешивание в юнити:
    1. Статья на хабре очень хорошо объясняет как это работает.
    2. Документация. Unity
  • AlphaTest - выполняется перед смешиванием. С помощью этой конструкции нам дают возможность ("последний шанс", как это говорится в документации) отекать пиксели с помощью операторов (Greater, GEqual, Less, LEqual, Equal, NotEqual, Always, Never) и значения переменной AlphaValue.

-
Пример:

Pass
{
...
	AlphaTest Less 0.7 // рендерим только те пиксели, значение альфа у которых меньше 0.7 
 ... 
}
Shader "MyShaders/AlphaTest" 
{
	Properties 
	{ 
		 _Alpha("AlphaValue",Range(0,1)) = 0.6
	}
	SubShader
	{
		Pass
   		{
			AlphaTest Greater _Alpha // рендерим только те пиксели, значение альфа у которых больше _Alpha
    		CGPROGRAM
		... 
		ENDCG
		}
	}
}

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

Uniform переменные

Про uniform переменные много говорить не стану. Просто нужно знать, что это внешние переменные, которые располагаются в CG коде и должны быть названы точно так же, как в блоке Properties{}, что бы ShaderLab смог автоматически передать значения в эти переменные.

Shader "MyShaders/AnotherShader" 
{
	Properties 
	{ 
		_SomeVar('SomeVariable",Range(0,1)) = 0.5 
		_Tex("Texture",2D) = white{}
	}
	SubShader
	{
		Pass
		{    
			CGPROGRAM
			 ... 
			uniform float _SomeVar; 
			uniform sampler2D _Tex; 
			... 
			ENDCG
		}
	}
}

Fallback

После всех SubShader'ов можно назначить Fallback. Роль Fallback'а заключается в том, что если не один из SubShader'ов не сможет запуститься на данном устройстве, то запустится шейдер, который указан в Fallback'е.

В данном примере, если SubShader по каким-то причинам не запустится,
то для объекта выполнится шейдер "Diffuse"

Shader "AlphaTest" 
{
	SubShader
	{
		Pass
		{
			CGPROGRAM
			... 
			uniform float _SomeVar; 
			uniform sampler2D _Tex; 
			... 
			ENDCG
		}
	}
	Fallback "Diffuse" 
}

Здесь еще никто не оставил комментарий

Справка