Вот очень простой шейдер,
float4 vert (float4 vertex :POSITION, out PositionHolder o) :SV_POSITION
{
UNITY_INITIALIZE_OUTPUT(PositionHolder,o);
o.localPos = vertex;
return UnityObjectToClipPos(vertex);
}
fixed4 frag (PositionHolder IN) :SV_Target
{
if (IN.localPos.y > -.2)
return _UpperColor;
else
return _LowerColor;
}
(Таким образом, если на четырехугольнике он просто рисует верхние 70% одним цветом, а нижнюю полосу - другим цветом).
Обратите внимание, что единственное, что делает vert
, это передает локальный элемент в позиции вершины меша.
Вот структура для этого
struct PositionHolder
{
float3 localPos;
};
Однако (в любом случае в Unity) этозахочет семантику для этого float3.
Изучая документацию Unity, у них, конечно, нет, но естьссылка на
https://docs.microsoft.com/en-us/windows/desktop/direct3dhlsl/dx-graphics-hlsl-semantics
(Кроме того - какой, насколько я понимаю, специально для D3D, но, я полагаю, это синтаксис / семантика в любом случае?)
Мое прочтение ситуации,
предлагает вам использовать, скажем,
struct PositionHolder
{
float3 localPos :POSITION1;
};
Или действительно, позиция-любое-число, которого вы еще не сделалииспользуя в качестве ресурса.
Как насчет
struct PositionHolder
{
float3 localPos :POSITION8;
};
на удачу.
(Смущает, что, кажется, они бегут только от пробел до 9 , я незнать, отражает ли это аппаратную реальность, или это просто что-то нехорошее - или что. Но в любом случае, в основном, «любое число от 1 до 9, которое вы еще нигде не используете.)
Примечаниев любом случае, POSITION
является float4, действительно ли это нормально для моего float3 ?? Есть ли что-то лучше, чем POSITION для float3 общего назначения? (Я заметил, что если вы просто используете, скажем,ЦВЕТ, он также отлично работает. Имеет ли это значение?? Я не таю gpu или что-то подобное?
Хм, я заметил, что вы можете просто ввести НИЧЕГО там (скажем, "abcd1"). Но, конечно, тогда это не такна самом деле аппаратный регистр чтоли ???