Теперь я начинаю изучать шейдеры (HLSL, GLSL), и я видел много учебников, в которых было создано не так много переменных, и это усложняло чтение. Мне было интересно, влияет ли создание новых переменных на производительность шейдера.Должен ли я избегать создания нескольких переменных при программировании шейдера?
Так, например (в CG):
Это
inline float alphaForPos(float4 pos, float4 nearVertex){
return (1.0/_FogMaxRadius)*clamp(_FogRadius - max(length(pos.z - nearVertex.z),length(pos.x - nearVertex.x)), 0.0, _FogRadius)/_FogRadius;
}
быстрее, чем это?
inline float alphaForPos(float4 pos, float4 nearVertex){
float distX = length(pos.x - nearVertex.x);
float distZ = length(pos.z - nearVertex.z);
float alpha = 0.0;
alpha = _FogRadius - max(distZ,distX);
alpha = clamp(alpha, 0.0, _FogRadius);
return (1.0/_FogMaxRadius)*alpha/_FogRadius;
}
Аппаратное обеспечение шейдера не имеет стек вызовов, поэтому понятия, такие как inline и область переменных, совершенно разные; однако, как вы настраиваете переменные в объявлении функции ***, важно ***. В GLSL вы можете использовать классификаторы хранилища в объявлениях функций (например, 'alphaForPos (в vec4 pos, in vec4 nearVertex)'), чтобы сообщить компилятору сделать локальную копию переменной, если вы внесли изменения в значение внутри тела функции. 'inout', с другой стороны, означает, что любые изменения, внесенные внутри функции, разрешаются для распространения вне нее, и копия не требуется. –
Так добр, как передача в качестве ссылки в C#, и она не делает копию, такую как использование const Object & var в C++, правильно? – Hodor
Да, вы можете так думать. Создание копий переменных не так непредсказуемо дорого, как на языке, таком как C++, где он может ссылаться на нетривиальный конструктор копирования, но вам все же приходится иметь дело с ограниченным пространством регистров, потерянными тактовыми циклами и т. Д. –