Показать сообщение отдельно
Старый 13.08.2014, 17:55   #169
Samodelkin
Мастер
 
Регистрация: 12.01.2009
Сообщений: 979
Написано 388 полезных сообщений
(для 631 пользователей)
Ответ: Xors3D. Шейдеры. Урок первый

2Arton
struct A { ... }; это описание структуры, то есть как шаблон, реальный объект при этом не создается.
Объект структуры создается так:
A object; - то есть сначала тип, потом имя объекта.
Если нужно обратиться к полю созданного объекта:
object.value;

Теперь вот смотри, в графическом конвеере не всё делают шейдеры. То есть в частности между вершинным и пиксельным тоже происходят скрытые вычисления. То есть это я к тому что если структура VSOutput у тебя определена один раз, то объекта два. Сначала создаешь output в вершинном шейдере и записываешь туда явно вычисленные значения, затем происходят скрытые вычисления, и в пиксельный шейдер тебе возвращается уже другой объект, даже если он того же типа, значения полей будут другими - это важно понимать. В данном случае ты одной структурой описал объекты для выходных вершинных и входных пиксельных данных, но иногда бывают другие ситуации, когда данные различаются и нужно например объявлять отдельно VSOutput и PSInput.

Также вот в такая запись:
float4 PSMain( float4 pos : POSITION0, float whatFace : VFACE ) {...}
будет эквивалентна такой:
struct PSInput {
float4 pos : POSITION0;
float whatFace : VFACE;
};
float4 PSMain( PSInput input ) {...}
Во втором случае мы все входные параметры описали одной стрктурой и передали в качестве аргумента все параметры как один объект.
Только внутри функции уже нужно обращаться к параметрам как к полям объекта input.pos и т. д.
Точно также мы можем объявить и выходную структуру, например в данном случае будет:
struct PSOutput {
float4 col : COLOR0;
};
В данном случае для одного параметра это избыточно, но механизм я думаю ясен.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Arton (13.08.2014)