2013-12-22 2 views
4

Теперь я начинаю изучать шейдеры (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; 
    } 
+1

Аппаратное обеспечение шейдера не имеет стек вызовов, поэтому понятия, такие как inline и область переменных, совершенно разные; однако, как вы настраиваете переменные в объявлении функции ***, важно ***. В GLSL вы можете использовать классификаторы хранилища в объявлениях функций (например, 'alphaForPos (в vec4 pos, in vec4 nearVertex)'), чтобы сообщить компилятору сделать локальную копию переменной, если вы внесли изменения в значение внутри тела функции. 'inout', с другой стороны, означает, что любые изменения, внесенные внутри функции, разрешаются для распространения вне нее, и копия не требуется. –

+0

Так добр, как передача в качестве ссылки в C#, и она не делает копию, такую ​​как использование const Object & var в C++, правильно? – Hodor

+0

Да, вы можете так думать. Создание копий переменных не так непредсказуемо дорого, как на языке, таком как C++, где он может ссылаться на нетривиальный конструктор копирования, но вам все же приходится иметь дело с ограниченным пространством регистров, потерянными тактовыми циклами и т. Д. –

ответ

5

Это не повлияет на производительность.

В конце концов все в порядке, и оптимизирующая часть компилятора не будет заботиться об отдельных переменных по завершении оптимизации времени.

Я скомпилировал два простых пиксельных шейдера, которые называют эти две функции, и скомпилировать до 9 команд в HLSL.

Пойдите для удобочитаемости и доверия, чтобы компилятор поступил правильно (по крайней мере, на этом :)).

+0

Имеет большой смысл для проверки количества инструкций в скомпилированном шейдере. В компиляторе мы доверяем :) – Hodor