ここ数年、私は多くの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);
}
この言語で本当に必要なものは次のとおりです。
- 組み込みのスウィズル演算子
- ベクトル演算(ドット、クロス、正規化、飽和、反映など)
- カスタムデータ型(構造体)のサポート
- 動的分岐が便利です(forループ、ifステートメント)