В последние пару лет я много занимался программированием SIMD, и большую часть времени я полагался на встроенные функции компилятора (например, для программирования SSE) или на сборку программирования, чтобы добраться до действительно изящные вещи. Однако до сих пор я едва мог найти какой-либо язык программирования со встроенной поддержкой SIMD.
Теперь, очевидно, есть шейдерные языки, такие как HLSL, Cg и GLSL, которые имеют встроенную поддержку для такого рода вещей, однако я ищу что-то, что могло бы по крайней мере компилироваться в SSE без автовекторизации, но со встроенной поддержкой для векторных операций. Существует ли такой язык?
Это пример (часть) Cg-шейдера, который делает прожектор, и с точки зрения синтаксиса это, вероятно, наиболее близко к тому, что я ищу.
float4 pixelfunction(
output_vs IN,
uniform sampler2D texture : TEX0,
uniform sampler2D normals : TEX1,
uniform float3 light,
uniform float3 eye ) : COLOR
{
float4 color = tex2D( texture, IN.uv );
float4 normal = tex2D( normals, IN.uv ) * 2 - 1;
float3 T = normalize(IN.T);
float3 B = normalize(IN.B);
float3 N =
normal.b * normalize(IN.normal) +
normal.r * T +
normal.g * B;
float3 V = normalize(eye - IN.pos.xyz);
float3 L = normalize(light - IN.pos);
float3 H = normalize(L + V);
float4 diffuse = color * saturate( dot(N, L) );
float4 specular = color * pow(saturate(dot(N, H)), 15);
float falloff = dot(L, normalize(light));
return pow(falloff, 5) * (diffuse + specular);
}
Материал, который был бы действительно необходим на этом языке:
- Встроенные операторы Swizzle
- Векторные операции (точка, крест, нормализация, насыщение, отражение и так далее)
- Поддержка пользовательских типов данных (структур)
- Динамическое ветвление было бы неплохо (для циклов, если операторы)