mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	add support for HLSL/FX
Add support for DirectX HLSL / FX files. The FX files are just HLSL files with some additional syntax to set render-states and define multiple shader stages in one file. Samples are either written by me, or taken from Chromium.
This commit is contained in:
		| @@ -1323,6 +1323,16 @@ HCL: | ||||
|   ace_mode: ruby | ||||
|   tm_scope: source.ruby | ||||
|  | ||||
| HLSL: | ||||
|   type: programming | ||||
|   extensions: | ||||
|     - .fx | ||||
|     - .fxh | ||||
|     - .hlsl | ||||
|     - .hlsli | ||||
|   ace_mode: text | ||||
|   tm_scope: none | ||||
|  | ||||
| HTML: | ||||
|   type: markup | ||||
|   tm_scope: text.html.basic | ||||
|   | ||||
							
								
								
									
										27
									
								
								samples/HLSL/accelerated_surface_win.hlsl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								samples/HLSL/accelerated_surface_win.hlsl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| // Copyright (c) 2012 The Chromium Authors. All rights reserved. | ||||
| // Use of this source code is governed by a BSD-style license that can be | ||||
| // found in the LICENSE file. | ||||
|  | ||||
| // To compile these two shaders: | ||||
| // fxc /E pixelMain /T ps_2_0 accelerated_surface_win.hlsl | ||||
| // fxc /E vertexMain /T vs_2_0 accelerated_surface_win.hlsl | ||||
| // | ||||
| // fxc is in the DirectX SDK. | ||||
|  | ||||
| struct Vertex { | ||||
|   float4 position : POSITION; | ||||
|   float2 texCoord : TEXCOORD0; | ||||
| }; | ||||
|  | ||||
| texture t; | ||||
| sampler s; | ||||
|  | ||||
| // Passes a position and texture coordinate to the pixel shader. | ||||
| Vertex vertexMain(Vertex input) { | ||||
|   return input; | ||||
| }; | ||||
|  | ||||
| // Samples a texture at the given texture coordinate and returns the result. | ||||
| float4 pixelMain(float2 texCoord : TEXCOORD0) : COLOR0 { | ||||
|   return tex2D(s, texCoord); | ||||
| }; | ||||
							
								
								
									
										105
									
								
								samples/HLSL/corridor.fx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										105
									
								
								samples/HLSL/corridor.fx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,105 @@ | ||||
| float4x4 matWorldView : WORLDVIEW; | ||||
| float4x4 matWorldViewProjection : WORLDVIEWPROJECTION; | ||||
|  | ||||
| struct VS_INPUT { | ||||
| 	float4 Position : POSITION0; | ||||
| 	float3 Normal : NORMAL; | ||||
| 	float3 Tangent : TANGENT; | ||||
| 	float3 Binormal : BINORMAL; | ||||
| 	float2 TexCoord0 : TEXCOORD0; | ||||
| 	float2 TexCoord1 : TEXCOORD1; | ||||
| }; | ||||
|  | ||||
| struct VS_OUTPUT { | ||||
| 	float4 Position : POSITION0; | ||||
| 	float2 TexCoord0 : TEXCOORD0; | ||||
| 	float2 TexCoord1 : TEXCOORD1; | ||||
| 	float3x3 TangentToView : TEXCOORD2; | ||||
| }; | ||||
|  | ||||
| VS_OUTPUT vs_main(VS_INPUT input) | ||||
| { | ||||
| 	VS_OUTPUT output; | ||||
| 	output.Position = mul(input.Position, matWorldViewProjection); | ||||
| 	output.TexCoord0 = input.TexCoord0 * 5; | ||||
| 	output.TexCoord1 = input.TexCoord1; | ||||
| 	output.TangentToView[0] = mul(float4(input.Tangent, 0), matWorldView).xyz; | ||||
| 	output.TangentToView[1] = mul(float4(input.Binormal, 0), matWorldView).xyz; | ||||
| 	output.TangentToView[2] = mul(float4(input.Normal, 0), matWorldView).xyz; | ||||
| 	return output; | ||||
| } | ||||
|  | ||||
| struct PS_OUTPUT { | ||||
| 	float4 gbuffer0 : COLOR0; | ||||
| 	float4 gbuffer1 : COLOR1; | ||||
| }; | ||||
|  | ||||
| texture albedo_tex; | ||||
| sampler albedo_samp = sampler_state { | ||||
| 	Texture = (albedo_tex); | ||||
| 	MipFilter = Linear; | ||||
| 	MinFilter = Linear; | ||||
| 	MagFilter = Linear; | ||||
| 	AddressU = Wrap; | ||||
| 	AddressV = Wrap; | ||||
| 	sRGBTexture = True; | ||||
| }; | ||||
|  | ||||
| texture normal_tex; | ||||
| sampler normal_samp = sampler_state { | ||||
| 	Texture = (normal_tex); | ||||
| 	MipFilter = Linear; | ||||
| 	MinFilter = Linear; | ||||
| 	MagFilter = Linear; | ||||
| 	AddressU = Wrap; | ||||
| 	AddressV = Wrap; | ||||
| 	sRGBTexture = False; | ||||
| }; | ||||
|  | ||||
| texture specular_tex; | ||||
| sampler specular_samp = sampler_state { | ||||
| 	Texture = (specular_tex); | ||||
| 	MipFilter = Linear; | ||||
| 	MinFilter = Linear; | ||||
| 	MagFilter = Linear; | ||||
| 	AddressU = Wrap; | ||||
| 	AddressV = Wrap; | ||||
| 	sRGBTexture = True; | ||||
| }; | ||||
|  | ||||
| texture ao_tex; | ||||
| sampler ao_samp = sampler_state { | ||||
| 	Texture = (ao_tex); | ||||
| 	MipFilter = Linear; | ||||
| 	MinFilter = Linear; | ||||
| 	MagFilter = Linear; | ||||
| 	AddressU = Wrap; | ||||
| 	AddressV = Wrap; | ||||
| 	sRGBTexture = True; | ||||
| }; | ||||
|  | ||||
| PS_OUTPUT ps_main(VS_OUTPUT Input) | ||||
| { | ||||
| 	PS_OUTPUT o; | ||||
|  | ||||
| 	float3 tangentNormal = normalize(tex2D(normal_samp, Input.TexCoord0).xyz * 2 - 1); | ||||
| 	float3 eyeNormal = normalize(mul(tangentNormal, Input.TangentToView)); | ||||
|  | ||||
| 	float3 albedo = tex2D(albedo_samp, Input.TexCoord0).rgb; | ||||
| 	float ao = tex2D(ao_samp, Input.TexCoord1).r * 0.75; | ||||
| 	float spec = tex2D(specular_samp, Input.TexCoord0).r; | ||||
|  | ||||
| 	o.gbuffer0 = float4(eyeNormal, spec * ao); | ||||
| 	o.gbuffer1 = float4(albedo, 1 - ao); | ||||
| 	return o; | ||||
| } | ||||
|  | ||||
| technique mesh { | ||||
| 	pass Geometry { | ||||
| 		VertexShader = compile vs_3_0 vs_main(); | ||||
| 		PixelShader  = compile ps_3_0 ps_main(); | ||||
|  | ||||
| 		AlphaBlendEnable = False; | ||||
| 		ZWriteEnable = True; | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										119
									
								
								samples/HLSL/jellyfish.fx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								samples/HLSL/jellyfish.fx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,119 @@ | ||||
| float4x4 matWorldViewProjection : WORLDVIEWPROJECTION; | ||||
| float4x4 matWorldView : WORLDVIEW; | ||||
| float4x4 matWorld : WORLD; | ||||
| float4x4 matView : VIEW; | ||||
|  | ||||
| uniform float4 vViewPosition; | ||||
|  | ||||
| struct VS_INPUT  | ||||
| { | ||||
| 	float3 Pos:      POSITION; | ||||
| 	float3 Normal:   NORMAL; | ||||
| 	float3 Tangent:  TANGENT; | ||||
| 	float3 Binormal: BINORMAL; | ||||
| }; | ||||
|  | ||||
| struct VS_OUTPUT  | ||||
| { | ||||
| 	float4 Pos        : POSITION; | ||||
| 	float3 reflection : TEXCOORD1;  | ||||
| 	float3 refraction : TEXCOORD2;  | ||||
| 	float  fresnel    : TEXCOORD3; | ||||
| }; | ||||
|  | ||||
| uniform float3 amt; | ||||
| uniform float3 scale; | ||||
| uniform float3 phase; | ||||
|  | ||||
| float3 deform(float3 p) | ||||
| { | ||||
| 	float s = 3; | ||||
| 	float3 p2 = p * scale + phase; | ||||
| 	s += sin(p2.x) * amt.x; | ||||
| 	s += sin(p2.y) * amt.y; | ||||
| 	s += sin(p2.z) * amt.z; | ||||
| 	return p * s / 3; | ||||
| } | ||||
|  | ||||
| VS_OUTPUT vs_main( VS_INPUT In ) | ||||
| { | ||||
| 	VS_OUTPUT Out; | ||||
|  | ||||
| 	float3 pos = In.Pos; | ||||
| 	float3 norm = In.Normal; | ||||
|  | ||||
| 	float3 p1 = pos + In.Tangent * 0.05; | ||||
| 	float3 p2 = pos + In.Binormal * 0.05; | ||||
| 	pos = deform(pos); | ||||
| 	p1  = deform(p1); | ||||
| 	p2  = deform(p2); | ||||
|  | ||||
| 	p1 -= pos; | ||||
| 	p2 -= pos; | ||||
| 	norm = normalize(cross(p1, p2)); | ||||
|  | ||||
| 	float3 view = normalize(pos - vViewPosition.xyz); | ||||
|  | ||||
| 	Out.Pos           = mul(float4(pos,  1.0), matWorldViewProjection); | ||||
| 	Out.reflection    = reflect(view, norm); | ||||
| 	Out.refraction    = reflect(view, norm * 0.4f); /* fake, but who cares? */ | ||||
| 	Out.fresnel       = dot(view, norm); | ||||
| 	norm = mul(float4(norm, 0.0), matWorldViewProjection); | ||||
|  | ||||
| 	return Out; | ||||
| } | ||||
|  | ||||
| #define PS_INPUT VS_OUTPUT | ||||
|  | ||||
| #if 0 | ||||
| textureCUBE reflectionMap; | ||||
| samplerCUBE reflectionMapSampler = sampler_state | ||||
| { | ||||
| 	Texture = (reflectionMap); | ||||
| 	MipFilter = LINEAR; | ||||
| 	MinFilter = LINEAR; | ||||
| 	MagFilter = LINEAR; | ||||
| }; | ||||
| #else | ||||
| // textures | ||||
| texture reflectionMap  | ||||
| <  | ||||
|     string type = "CUBE"; | ||||
|     string name = "test_cube.dds"; | ||||
| >; | ||||
|  | ||||
| samplerCUBE reflectionMapSampler = sampler_state | ||||
| { | ||||
| 	Texture = (reflectionMap); | ||||
| 	MipFilter = LINEAR; | ||||
| 	MinFilter = LINEAR; | ||||
| 	MagFilter = LINEAR; | ||||
| }; | ||||
| #endif | ||||
|  | ||||
| struct PS_OUTPUT  | ||||
| { | ||||
|    float4 color    : COLOR0; | ||||
| }; | ||||
|  | ||||
| PS_OUTPUT ps_main( PS_INPUT In ) | ||||
| { | ||||
| 	PS_OUTPUT Out; | ||||
| 	 | ||||
| 	float4 reflection = texCUBE(reflectionMapSampler, normalize(In.reflection)) * 1.5; | ||||
| 	float4 refraction = texCUBE(reflectionMapSampler, normalize(In.refraction)); | ||||
| 	float fresnel = In.fresnel; | ||||
| //	float fresnel = abs(normalize(In.normal).z); | ||||
| 	Out.color = lerp(reflection, refraction, fresnel) *  pow(1.0 - fresnel * 0.75, 1.0); | ||||
|  | ||||
| 	return Out; | ||||
| } | ||||
|  | ||||
| technique blur_ps_vs_2_0 | ||||
| { | ||||
| 	pass P0 | ||||
| 	{ | ||||
| 		VertexShader = compile vs_2_0 vs_main(); | ||||
| 		PixelShader  = compile ps_2_0 ps_main(); | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										41
									
								
								samples/HLSL/noise.fx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								samples/HLSL/noise.fx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| float alpha = 1.f; | ||||
|  | ||||
| texture tex; | ||||
| sampler tex_sampler = sampler_state | ||||
| { | ||||
| 	Texture = (tex); | ||||
| 	MipFilter = LINEAR; | ||||
| 	MinFilter = LINEAR; | ||||
| 	MagFilter = LINEAR; | ||||
| 	 | ||||
| 	AddressU = WRAP; | ||||
| 	AddressV = WRAP; | ||||
| }; | ||||
|  | ||||
| struct VS_OUTPUT | ||||
| { | ||||
| 	float4 pos  : POSITION; | ||||
| 	float2 tex  : TEXCOORD1; | ||||
| }; | ||||
|  | ||||
| VS_OUTPUT vertex(float4 ipos : POSITION, float2 tex  : TEXCOORD0) | ||||
| { | ||||
| 	VS_OUTPUT Out; | ||||
| 	Out.pos = ipos; | ||||
| 	Out.tex = tex * 2; | ||||
| 	return Out; | ||||
| } | ||||
|  | ||||
| float4 pixel(VS_OUTPUT In) : COLOR | ||||
| { | ||||
| 	return tex2D(tex_sampler, In.tex) * alpha; | ||||
| } | ||||
|  | ||||
| technique blur_ps_vs_2_0 | ||||
| { | ||||
| 	pass P0 | ||||
| 	{ | ||||
| 		VertexShader = compile vs_2_0 vertex(); | ||||
| 		PixelShader  = compile ps_2_0 pixel(); | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user