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; }
ピンバック: GLSL向けシンタックスハイライトを作った – ☆PROJECT ASURA☆