HLSL向けのシンタックスハイライトを作った

HLSL向けのSyntaxHiglighterがパッと見つからなかったので,作ってみました。

GitHubにて差分ソースを公開しています。
https://github.com/ProjectAsura/SyntaxHighlighter

組み込みには別途SyntaxHighlighter Evolvedが必要になります。
https://github.com/Viper007Bond/syntaxhighlighter

元のソースがGPLらしいので,合わせてGPLとしています。
組み込み方法はリポジトリ内にあるREADME.mdを参照してください。
一応下記のような感じで表示されます。

[hlsl]
//
// Global Variables
//
float4x4 World;
float4x4 View;
float4x4 Projection;

// TODO: add effect parameters here.
float3 ModelDiffuseColor;
float g_Rs = 0.5;
float g_nu = 10;
float g_nv = 1000;
float3 g_LightPosition;
float3 g_EyePosition;
const float Pi = 3.141592653589f;

//
// VertexShaderInput
//
struct VertexShaderInput
{
float4 Position : POSITION0;

// TODO: add input channels such as texture
// coordinates and vertex colors here.
float3 Normal : NORMAL;
float3 Tangent : TANGENT;
float3 Binormal : BINORMAL;
};

//
// VertexShaderOutput
//
struct VertexShaderOutput
{
float4 Position : POSITION0;

// TODO: add vertex shader outputs such as colors and texture
// coordinates here. These values will automatically be interpolated
// over the triangle, and provided as input to your pixel shader.
float3 Normal : TEXCOORD0;
float3 Tangent : TEXCOORD1;
float3 Binormal : TEXCOORD2;
float3 ObjPosition : TEXCOORD3;
};

//—————————————————————————————————
// Name : pow5()
// Desc : 指定されたfloat型変数の5乗値を計算
//—————————————————————————————————
float pow5( float value )
{ return (value * value * value * value * value); }

//—————————————————————————————————
// Name : FresnelTerm()
// Desc : フレネル項の計算
//—————————————————————————————————
float3 FresnelTerm( float3 Rs, float LH )
{ return (Rs + (1-Rs) *( 1- pow5(LH) ) ); }

//—————————————————————————————————-
// Name : SpecularTerm()
// Desc : スペキュラー項の計算
//—————————————————————————————————-
float SpecularTerm(
float nu, float nv,
float3 n, float3 h,
float3 k1, float3 k2,
float3 u, float3 v, float3 spec )
{
float hu = dot( h, u );
float hv = dot( h, v );
float hn = dot( h, n );
float3 k = k1;
float hk = dot(h, k);
float nk1 = dot(n, k1);
float nk2 = dot(n, k2);
float exponent = ( ( nu * hu * hu ) + ( nv * hv * hv ) ) / ( 1 – hn * hn );

float term1 = sqrt( (nu + 1) * (nv + 1) )/ ( 8*Pi );
float term2 = pow(hn, exponent)/ ( hk * max( nk1, nk2 ) );

return term1 * term2 * FresnelTerm( spec, hk );
}

//—————————————————————————————————-
// Name : DiffuseTerm()
// Desc : ディフューズ項の計算
//—————————————————————————————————-
float3 DiffuseTerm( float3 Rd, float3 Rs, float3 n, float3 k1, float3 k2 )
{
float3 term1 = ( (28*Rd) /(23*Pi) ) * ( 1 – Rs );
float term2 = ( 1 – pow5( 1 – dot(n, k1)*0.5 ) );
float term3 = ( 1 – pow5( 1 – dot(n, k2)*0.5 ) );

return term1 * term2 * term3;
}

//—————————————————————————————————-
// Name : VertexShaderFunction()
// Desc : 頂点シェーダ
//—————————————————————————————————-
VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
{
VertexShaderOutput output = (VertexShaderOutput)0;

float4 worldPosition = mul(input.Position, World);
float4 viewPosition = mul(worldPosition, View);
output.Position = mul(viewPosition, Projection);

// TODO: add your vertex shader code here.
output.Normal = input.Normal;
output.Tangent = input.Tangent;
output.Binormal = input.Binormal;
output.ObjPosition = input.Position;

return output;
}

//—————————————————————————————————-
// Name : PixelShaderFunction()
// Desc : ピクセルシェーダ
//—————————————————————————————————-
float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
{
// 正規化しておく
float3 N = normalize(input.Normal);
float3 U = normalize(input.Tangent);
float3 V = normalize(input.Binormal);
float3 L = normalize(g_LightPosition – input.ObjPosition);
float3 E = normalize(g_EyePosition – input.ObjPosition);
float3 H = normalize( L + E );

// TODO: add your pixel shader code here.
float3 diffuse = ModelDiffuseColor * DiffuseTerm( ModelDiffuseColor, g_Rs, N, L, E );
float3 specular = SpecularTerm( g_nu, g_nv, N, H, L, E, U, V, g_Rs );
float4 color = float4( diffuse + specular, 1.0 );

return color;
}
[/hlsl]

HLSL向けのシンタックスハイライトを作った」への1件のフィードバック

  1. ピンバック: GLSL向けシンタックスハイライトを作った – ☆PROJECT ASURA☆

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.