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

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

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

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

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

//
// 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向けのシンタックスハイライトを作った」への1件のフィードバック

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

コメントを残す

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください