<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Vulkan Tessellation: vkCreateGraphicsPipelines crashes on Intel UHD 630 in Developing Games on Intel Graphics</title>
    <link>https://community.intel.com/t5/Developing-Games-on-Intel/Vulkan-Tessellation-vkCreateGraphicsPipelines-crashes-on-Intel/m-p/1336924#M1819</link>
    <description>&lt;P&gt;Hi! Windows 10 X64 dirver 30.0.101.1069, 11.11.2021&lt;/P&gt;
&lt;P&gt;I attached full demo with source HLSL files and spir-v result:&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://www.dropbox.com/s/qytvexihn7r0sqx/VulkanDemoTerrainTessellation.7z?dl=0" target="_blank" rel="noopener nofollow ugc"&gt;VulkanDemoTerrainTesselation&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Shader from&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://www.dropbox.com/s/qytvexihn7r0sqx/VulkanDemoTerrainTessellation.7z?dl=0" target="_self" rel="nofollow ugc"&gt;VulkanDemoTerrainTesselation&lt;/A&gt;:&lt;/P&gt;
&lt;P&gt;vs.vert - Vertex shader&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="hljs lua"&gt;#define location(x) &lt;SPAN class="hljs-string"&gt;[[vk::location(x)]]&lt;/SPAN&gt;
struct Output {
	float4 pos : SV_POSITION;
	location(&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;) float2 texCoord : TEXCOORD0;
	location(&lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;) float3 Normal : NORMAL;
};

struct Input {
	location(&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;) float4 pos: SV_POSITION;
	location(&lt;SPAN class="hljs-number"&gt;8&lt;/SPAN&gt;) float2 uv	: TEXCOORD0;
	location(&lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;) float3 Normal	: NORMAL;
};

Output vsMain(&lt;SPAN class="hljs-keyword"&gt;in&lt;/SPAN&gt; Input &lt;SPAN class="hljs-built_in"&gt;input&lt;/SPAN&gt;) {
	Output &lt;SPAN class="hljs-built_in"&gt;output&lt;/SPAN&gt;;
	&lt;SPAN class="hljs-built_in"&gt;output&lt;/SPAN&gt;.pos = float4(&lt;SPAN class="hljs-built_in"&gt;input&lt;/SPAN&gt;.pos.xyz, &lt;SPAN class="hljs-number"&gt;1.0&lt;/SPAN&gt;f);
	&lt;SPAN class="hljs-built_in"&gt;output&lt;/SPAN&gt;.Normal = &lt;SPAN class="hljs-built_in"&gt;input&lt;/SPAN&gt;.Normal;	
	&lt;SPAN class="hljs-built_in"&gt;output&lt;/SPAN&gt;.texCoord = &lt;SPAN class="hljs-built_in"&gt;input&lt;/SPAN&gt;.uv;
	&lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; &lt;SPAN class="hljs-built_in"&gt;output&lt;/SPAN&gt;;
}
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;hs.tesc - Hull shader&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="hljs csharp"&gt;&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;define&lt;/SPAN&gt; location(x) [[vk::location(x)]]&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;define&lt;/SPAN&gt; binding(x) [[vk::binding(x)]]&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;define&lt;/SPAN&gt; MAX_TF 20.0f&lt;/SPAN&gt;
&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; ConstantsHSOutput {
		&lt;SPAN class="hljs-built_in"&gt;float&lt;/SPAN&gt; Edges[&lt;SPAN class="hljs-number"&gt;4&lt;/SPAN&gt;]	: SV_TessFactor;
		&lt;SPAN class="hljs-built_in"&gt;float&lt;/SPAN&gt; Inside[&lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;] : SV_InsideTessFactor;
	};
&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; Input{
		float4 pos : SV_POSITION;
		location(&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;) float2 uv : TEXCOORD0;
		location(&lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;) float3 Normal : NORMAL;
};
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;define&lt;/SPAN&gt; MAX_TF 20.0f&lt;/SPAN&gt;
binding(&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;) cbuffer b0: register(b0) {
	row_major float4x4 view;
	row_major float4x4 proj;
	float4 cameraPosition;
	&lt;SPAN class="hljs-built_in"&gt;float&lt;/SPAN&gt; LodDistance;
	&lt;SPAN class="hljs-built_in"&gt;float&lt;/SPAN&gt; tessellationFactor;
	&lt;SPAN class="hljs-built_in"&gt;float&lt;/SPAN&gt; tessellatedEdgeSize;
	float2 viewportDim;
	&lt;SPAN class="hljs-built_in"&gt;uint&lt;/SPAN&gt; numLods;
};
&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-built_in"&gt;float&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;distSq&lt;/SPAN&gt;(&lt;SPAN class="hljs-params"&gt;float3 p0, float3 p1&lt;/SPAN&gt;)&lt;/SPAN&gt; {
	float3 d = p0 - p1;
	&lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; dot(d, d);
}
&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-built_in"&gt;float&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;screenSpaceTessFactor&lt;/SPAN&gt;(&lt;SPAN class="hljs-params"&gt;float4 p0, float4 p1&lt;/SPAN&gt;)&lt;/SPAN&gt; {
	float4 midPoint = &lt;SPAN class="hljs-number"&gt;0.5f&lt;/SPAN&gt; * (p0 + p1);
	&lt;SPAN class="hljs-built_in"&gt;float&lt;/SPAN&gt; radius = distance(p0, p1) * &lt;SPAN class="hljs-number"&gt;0.5f&lt;/SPAN&gt;;
	float4 v0 = mul(midPoint, view);	float4 clip0 = mul(float4(v0.x - radius, 
v0.yzw), proj);
	float4 clip1 = mul(float4(v0.x + radius, v0.yzw), proj);
	clip0 /= clip0.w;
	clip1 /= clip1.w;
	clip0.xy *= viewportDim;
	clip1.xy *= viewportDim;
&lt;SPAN class="hljs-meta"&gt;#ifdef D3D12&lt;/SPAN&gt;
	&lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; max(distance(clip0, clip1) / tessellatedEdgeSize * tessellationFactor, &lt;SPAN class="hljs-number"&gt;1.0f&lt;/SPAN&gt;);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;else&lt;/SPAN&gt;&lt;/SPAN&gt;
	&lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; clamp(distance(clip0, clip1) / tessellatedEdgeSize * tessellationFactor, &lt;SPAN class="hljs-number"&gt;1.0f&lt;/SPAN&gt;, MAX_TF);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt;&lt;/SPAN&gt;
}
&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-built_in"&gt;float&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;CalculateTessFactor&lt;/SPAN&gt;(&lt;SPAN class="hljs-params"&gt;float4 p0, float4 p1&lt;/SPAN&gt;)&lt;/SPAN&gt; {
&lt;SPAN class="hljs-meta"&gt;#ifdef USE_SS_TESS_FACTOR_CALC&lt;/SPAN&gt;
	&lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; screenSpaceTessFactor(p0, p1);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;else&lt;/SPAN&gt;&lt;/SPAN&gt;
	float3 center = (p0 + p1).xyz * &lt;SPAN class="hljs-number"&gt;0.5f&lt;/SPAN&gt;;
	&lt;SPAN class="hljs-built_in"&gt;float&lt;/SPAN&gt; factor = LodDistance / distSq(center, cameraPosition);
	&lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; clamp(factor, &lt;SPAN class="hljs-number"&gt;1.0f&lt;/SPAN&gt;, numLods);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt;&lt;/SPAN&gt;
}
&lt;SPAN class="hljs-function"&gt;ConstantsHSOutput &lt;SPAN class="hljs-title"&gt;ConstantsHS&lt;/SPAN&gt;(&lt;SPAN class="hljs-params"&gt;InputPatch&amp;lt;Input, &lt;SPAN class="hljs-number"&gt;4&lt;/SPAN&gt;&amp;gt; ip, &lt;SPAN class="hljs-built_in"&gt;uint&lt;/SPAN&gt; PatchID : SV_PrimitiveID&lt;/SPAN&gt;)&lt;/SPAN&gt; {
	ConstantsHSOutput hsOut;
	hsOut.Edges[&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;] = CalculateTessFactor(ip[&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;].pos, ip[&lt;SPAN class="hljs-number"&gt;3&lt;/SPAN&gt;].pos);
	hsOut.Edges[&lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;] = CalculateTessFactor(ip[&lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;].pos, ip[&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;].pos);
	hsOut.Edges[&lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;] = CalculateTessFactor(ip[&lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;].pos, ip[&lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;].pos);
	hsOut.Edges[&lt;SPAN class="hljs-number"&gt;3&lt;/SPAN&gt;] = CalculateTessFactor(ip[&lt;SPAN class="hljs-number"&gt;3&lt;/SPAN&gt;].pos, ip[&lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;].pos);
	hsOut.Inside[&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;] = lerp(hsOut.Edges[&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;], hsOut.Edges[&lt;SPAN class="hljs-number"&gt;3&lt;/SPAN&gt;], &lt;SPAN class="hljs-number"&gt;0.5f&lt;/SPAN&gt;);
	hsOut.Inside[&lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;] = lerp(hsOut.Edges[&lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;], hsOut.Edges[&lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;], &lt;SPAN class="hljs-number"&gt;0.5f&lt;/SPAN&gt;);
	&lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; hsOut;
}
[&lt;SPAN class="hljs-meta"&gt;domain(&lt;SPAN class="hljs-meta-string"&gt;"quad"&lt;/SPAN&gt;)&lt;/SPAN&gt;]
[&lt;SPAN class="hljs-meta"&gt;partitioning(&lt;SPAN class="hljs-meta-string"&gt;"integer"&lt;/SPAN&gt;)&lt;/SPAN&gt;]
[&lt;SPAN class="hljs-meta"&gt;outputtopology(&lt;SPAN class="hljs-meta-string"&gt;"triangle_cw"&lt;/SPAN&gt;)&lt;/SPAN&gt;]
[&lt;SPAN class="hljs-meta"&gt;outputcontrolpoints(4)&lt;/SPAN&gt;]
[&lt;SPAN class="hljs-meta"&gt;patchconstantfunc(&lt;SPAN class="hljs-meta-string"&gt;"ConstantsHS"&lt;/SPAN&gt;)&lt;/SPAN&gt;]
[&lt;SPAN class="hljs-meta"&gt;maxtessfactor(MAX_TF)&lt;/SPAN&gt;]
&lt;SPAN class="hljs-function"&gt;Input &lt;SPAN class="hljs-title"&gt;hMain&lt;/SPAN&gt;(&lt;SPAN class="hljs-params"&gt;InputPatch&amp;lt;Input, &lt;SPAN class="hljs-number"&gt;4&lt;/SPAN&gt;&amp;gt; ip, &lt;SPAN class="hljs-built_in"&gt;uint&lt;/SPAN&gt; i : SV_OutputControlPointID, &lt;SPAN class="hljs-built_in"&gt;uint&lt;/SPAN&gt; PatchID : SV_PrimitiveID&lt;/SPAN&gt;)&lt;/SPAN&gt; {
	Input output;
	output.pos = float4(ip[i].pos.xyz, &lt;SPAN class="hljs-number"&gt;1.0f&lt;/SPAN&gt;);
	output.uv = ip[i].uv;
	output.Normal = ip[i].Normal;
	&lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; output;
}
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;ds.tese - Domain shader&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="hljs cpp"&gt;&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;define&lt;/SPAN&gt; location(x) [[vk::location(x)]]&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;define&lt;/SPAN&gt; binding(x) [[vk::binding(x)]]&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;define&lt;/SPAN&gt; MULTIPLE_LIGHTS 1&lt;/SPAN&gt;

&lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;ConstantsHSOutput&lt;/SPAN&gt; {&lt;/SPAN&gt;
		&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; Edges[&lt;SPAN class="hljs-number"&gt;4&lt;/SPAN&gt;]	: SV_TessFactor;
		&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; Inside[&lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;] : SV_InsideTessFactor;
	};
&lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;Output&lt;/SPAN&gt;{&lt;/SPAN&gt;
		&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;) float4 pos : POSITION;
		&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;) float2 texCoord : TEXCOORD0;
		&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;) float3 Normal : NORMAL;
		&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;3&lt;/SPAN&gt;) float3 lightDir : TEXCOORD1;
		&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;4&lt;/SPAN&gt;) float4 shadowCrd : TEXCOORD2;
		&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;5&lt;/SPAN&gt;) float4 lightProjSpaceLokup : TEXCOORD3;
		&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;6&lt;/SPAN&gt;) float3 vVec : TEXCOORD4;
		&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;7&lt;/SPAN&gt;) float3 viewDir : TEXCOORD5;
};

&lt;SPAN class="hljs-built_in"&gt;binding&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;) cbuffer b0 : &lt;SPAN class="hljs-built_in"&gt;&lt;SPAN class="hljs-keyword"&gt;register&lt;/SPAN&gt;&lt;/SPAN&gt;(b0) {
	row_major float4x4 ModelViewProjection;
	row_major float4x4 proj;
	float4 cameraPosition;
	float4 LightDir;
	row_major float4x4 MatTexture;
	row_major float4x4 ViewMatrix;
	&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; scaleHeight;
	float2 uvScale;
};
&lt;SPAN class="hljs-built_in"&gt;binding&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;) Texture2D HeightMap : &lt;SPAN class="hljs-built_in"&gt;&lt;SPAN class="hljs-keyword"&gt;register&lt;/SPAN&gt;&lt;/SPAN&gt;(t0);
&lt;SPAN class="hljs-built_in"&gt;binding&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;) SamplerState Sampler : &lt;SPAN class="hljs-built_in"&gt;&lt;SPAN class="hljs-keyword"&gt;register&lt;/SPAN&gt;&lt;/SPAN&gt;(s0);
&lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;Input&lt;/SPAN&gt; {&lt;/SPAN&gt;
	&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;) float4 pos: SV_POSITION;
	&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;8&lt;/SPAN&gt;) float2 uv	: TEXCOORD0;
	&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;) float3 Normal	: NORMAL;
};
&lt;SPAN class="hljs-function"&gt;float4 &lt;SPAN class="hljs-title"&gt;CalcLightProjSpaceLookup&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(float4 projectSpace)&lt;/SPAN&gt; &lt;/SPAN&gt;{	projectSpace.xy = (projectSpace.xy + &lt;SPAN class="hljs-built_in"&gt;float2&lt;/SPAN&gt;(projectSpace.w, projectSpace.w)) * &lt;SPAN class="hljs-number"&gt;0.5&lt;/SPAN&gt;;	&lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; projectSpace;}

&lt;SPAN class="hljs-function"&gt;Output &lt;SPAN class="hljs-title"&gt;vsMain&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(in Input input)&lt;/SPAN&gt; &lt;/SPAN&gt;{
	Output output;
	float4 Pos = &lt;SPAN class="hljs-built_in"&gt;float4&lt;/SPAN&gt;(input.pos.xyz, &lt;SPAN class="hljs-number"&gt;1.0f&lt;/SPAN&gt;); 
	output.pos = &lt;SPAN class="hljs-built_in"&gt;mul&lt;/SPAN&gt;(Pos, ModelViewProjection);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;ifdef&lt;/SPAN&gt; MULTIPLE_LIGHTS&lt;/SPAN&gt;
	output.lightProjSpaceLokup = &lt;SPAN class="hljs-built_in"&gt;CalcLightProjSpaceLookup&lt;/SPAN&gt;(output.pos);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;ifdef&lt;/SPAN&gt; NO_LIGHT_VIEW_SPACE&lt;/SPAN&gt;
	output.vVec = pos.xyz;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;else&lt;/SPAN&gt;&lt;/SPAN&gt;
	output.vVec = &lt;SPAN class="hljs-built_in"&gt;mul&lt;/SPAN&gt;(Pos, ViewMatrix).xyz;
	output.viewDir = cameraPosition.xyz - Pos.xyz;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt;&lt;/SPAN&gt;
	output.shadowCrd = &lt;SPAN class="hljs-built_in"&gt;mul&lt;/SPAN&gt;(Pos, MatTexture);
	output.texCoord = input.uv;
	output.Normal = &lt;SPAN class="hljs-built_in"&gt;mul&lt;/SPAN&gt;(input.Normal, (float3x3)ViewMatrix);
	output.lightDir = -LightDir.xyz;
    &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; output;
}
[&lt;SPAN class="hljs-built_in"&gt;domain&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"quad"&lt;/SPAN&gt;)]
&lt;SPAN class="hljs-function"&gt;Output &lt;SPAN class="hljs-title"&gt;dMain&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(in ConstantsHSOutput input, float2 domain : SV_DomainLocation, &lt;SPAN class="hljs-keyword"&gt;const&lt;/SPAN&gt; OutputPatch&amp;lt;Input, &lt;SPAN class="hljs-number"&gt;4&lt;/SPAN&gt;&amp;gt; patch)&lt;/SPAN&gt; &lt;/SPAN&gt;{
	Output dsOutput;
	Input vsIn;
	vsIn.pos = &lt;SPAN class="hljs-built_in"&gt;lerp&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;lerp&lt;/SPAN&gt;(patch[&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;].pos, patch[&lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;].pos, domain.x), &lt;SPAN class="hljs-built_in"&gt;lerp&lt;/SPAN&gt;(patch[&lt;SPAN class="hljs-number"&gt;3&lt;/SPAN&gt;].pos, patch[&lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;].pos, domain.x), domain.y);
	float2 uv = vsIn.pos.xz * uvScale;
	vsIn.pos.y = HeightMap.&lt;SPAN class="hljs-built_in"&gt;SampleLevel&lt;/SPAN&gt;(Sampler, uv, &lt;SPAN class="hljs-number"&gt;0.0&lt;/SPAN&gt;).r * scaleHeight;
	vsIn.uv = &lt;SPAN class="hljs-built_in"&gt;lerp&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;lerp&lt;/SPAN&gt;(patch[&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;].uv, patch[&lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;].uv, domain.x), &lt;SPAN class="hljs-built_in"&gt;lerp&lt;/SPAN&gt;(patch[&lt;SPAN class="hljs-number"&gt;3&lt;/SPAN&gt;].uv, patch[&lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;].uv, domain.x), domain.y);
	vsIn.Normal = &lt;SPAN class="hljs-built_in"&gt;lerp&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;lerp&lt;/SPAN&gt;(patch[&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;].Normal, patch[&lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;].Normal, domain.x), &lt;SPAN class="hljs-built_in"&gt;lerp&lt;/SPAN&gt;(patch[&lt;SPAN class="hljs-number"&gt;3&lt;/SPAN&gt;].Normal, patch[&lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;].Normal, domain.x), domain.y);
	dsOutput = &lt;SPAN class="hljs-built_in"&gt;vsMain&lt;/SPAN&gt;(vsIn);
	&lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; dsOutput;
}
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;ps.frag - Pixel shader&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="hljs cpp"&gt;&lt;SPAN class="hljs-comment"&gt;//&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;define&lt;/SPAN&gt; location(x) layout(location = x)&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;define&lt;/SPAN&gt; binding(x) [[vk::binding(x)]]&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;define&lt;/SPAN&gt; SIMPLE_POINT_LIGHT&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#defne MULTIPLE_LIGHTS&lt;/SPAN&gt;

&lt;SPAN class="hljs-comment"&gt;//&lt;/SPAN&gt;
&lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;PSOutput&lt;/SPAN&gt; {&lt;/SPAN&gt;
	&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;) float4 pos : SV_POSITION;
	&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;) float2 texCoord : TEXCOORD0;
	&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;) float3 Normal : NORMAL;
	&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;3&lt;/SPAN&gt;) float3 lightDir : TEXCOORD1;
	&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;4&lt;/SPAN&gt;) float4 shadowCrd: TEXCOORD2;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;ifdef&lt;/SPAN&gt; MULTIPLE_LIGHTS&lt;/SPAN&gt;
	&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;5&lt;/SPAN&gt;) float4 lightProjSpaceLokup : TEXCOORD3;
	&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;6&lt;/SPAN&gt;) float3 vVec : TEXCOORD4;
	&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;7&lt;/SPAN&gt;) float3 viewDir : TEXCOORD5;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt;&lt;/SPAN&gt;
};

&lt;SPAN class="hljs-built_in"&gt;binding&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;3&lt;/SPAN&gt;) Texture2D tex1 : &lt;SPAN class="hljs-built_in"&gt;&lt;SPAN class="hljs-keyword"&gt;register&lt;/SPAN&gt;&lt;/SPAN&gt;(t0);
&lt;SPAN class="hljs-built_in"&gt;binding&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;3&lt;/SPAN&gt;) SamplerState samLinear1 : &lt;SPAN class="hljs-built_in"&gt;&lt;SPAN class="hljs-keyword"&gt;register&lt;/SPAN&gt;&lt;/SPAN&gt;(s0);

&lt;SPAN class="hljs-built_in"&gt;binding&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;4&lt;/SPAN&gt;) Texture2D tex2 : &lt;SPAN class="hljs-built_in"&gt;&lt;SPAN class="hljs-keyword"&gt;register&lt;/SPAN&gt;&lt;/SPAN&gt;(t1);
&lt;SPAN class="hljs-built_in"&gt;binding&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;4&lt;/SPAN&gt;) SamplerState samLinear2 : &lt;SPAN class="hljs-built_in"&gt;&lt;SPAN class="hljs-keyword"&gt;register&lt;/SPAN&gt;&lt;/SPAN&gt;(s1);

&lt;SPAN class="hljs-built_in"&gt;binding&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;5&lt;/SPAN&gt;) Texture2D ShadowMap : &lt;SPAN class="hljs-built_in"&gt;&lt;SPAN class="hljs-keyword"&gt;register&lt;/SPAN&gt;&lt;/SPAN&gt;(t2);
&lt;SPAN class="hljs-built_in"&gt;binding&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;5&lt;/SPAN&gt;) SamplerState sShadowMap : &lt;SPAN class="hljs-built_in"&gt;&lt;SPAN class="hljs-keyword"&gt;register&lt;/SPAN&gt;&lt;/SPAN&gt;(s2);

&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;ifdef&lt;/SPAN&gt; MULTIPLE_LIGHTS&lt;/SPAN&gt;
&lt;SPAN class="hljs-built_in"&gt;binding&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;6&lt;/SPAN&gt;) Texture2D BitPlane : &lt;SPAN class="hljs-built_in"&gt;&lt;SPAN class="hljs-keyword"&gt;register&lt;/SPAN&gt;&lt;/SPAN&gt;(t3);
&lt;SPAN class="hljs-built_in"&gt;binding&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;6&lt;/SPAN&gt;) SamplerState sBitPlane : &lt;SPAN class="hljs-built_in"&gt;&lt;SPAN class="hljs-keyword"&gt;register&lt;/SPAN&gt;&lt;/SPAN&gt;(s3);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt;&lt;/SPAN&gt;

&lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;Light&lt;/SPAN&gt; {&lt;/SPAN&gt;
	float4 posRange;
	float4 colorLightType;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;ifndef&lt;/SPAN&gt; SIMPLE_POINT_LIGHT&lt;/SPAN&gt;
	float4 directionFalloff;
	float4 lighTypeAttenuation;
	float4 ThetaPhi;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt;&lt;/SPAN&gt;
};

&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;ifdef&lt;/SPAN&gt; MULTIPLE_LIGHTS&lt;/SPAN&gt;

&lt;SPAN class="hljs-built_in"&gt;binding&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;7&lt;/SPAN&gt;) cbuffer b0: &lt;SPAN class="hljs-built_in"&gt;&lt;SPAN class="hljs-keyword"&gt;register&lt;/SPAN&gt;&lt;/SPAN&gt;(b0) {
	Light lights[NUM_LIGHTS];
};

&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;define&lt;/SPAN&gt; NEW_MULTI_LIGHTING&lt;/SPAN&gt;

&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;ifdef&lt;/SPAN&gt; NEW_MULTI_LIGHTING&lt;/SPAN&gt;

&lt;SPAN class="hljs-function"&gt;float4 &lt;SPAN class="hljs-title"&gt;CalculateLighting&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(float4 Color, float3 worldPos, float3 Normal, float3 viewDir, float4 lightIndex)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
	float3 ambient_color = &lt;SPAN class="hljs-built_in"&gt;float3&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0.0f&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.0f&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.0f&lt;/SPAN&gt;);
    float3 color = &lt;SPAN class="hljs-built_in"&gt;float3&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0.0f&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.0f&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.0f&lt;/SPAN&gt;);
    
    float3 n = &lt;SPAN class="hljs-built_in"&gt;normalize&lt;/SPAN&gt;(Normal);
    float3 v = &lt;SPAN class="hljs-built_in"&gt;normalize&lt;/SPAN&gt;(viewDir);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;ifndef&lt;/SPAN&gt; NO_LIGHT_BUFFER&lt;/SPAN&gt;
    &lt;SPAN class="hljs-keyword"&gt;for&lt;/SPAN&gt; (&lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; i = &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;; i &amp;lt; &lt;SPAN class="hljs-number"&gt;4&lt;/SPAN&gt;; ++i)
    {                   
		&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; lIndex = &lt;SPAN class="hljs-number"&gt;256.0f&lt;/SPAN&gt; * lightIndex[i];
		Light light = lights[&lt;SPAN class="hljs-built_in"&gt;&lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt;&lt;/SPAN&gt;(lIndex)]; 
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;else&lt;/SPAN&gt;&lt;/SPAN&gt;
    &lt;SPAN class="hljs-keyword"&gt;for&lt;/SPAN&gt; (&lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; i = &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;; i &amp;lt; &lt;SPAN class="hljs-number"&gt;255&lt;/SPAN&gt;; ++i)
    {        		
		Light light = lights[i]; 
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt;&lt;/SPAN&gt;
        float3 l = (light.posRange.xyz - worldPos) * light.posRange.w;
        &lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; atten = &lt;SPAN class="hljs-built_in"&gt;saturate&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;1.0f&lt;/SPAN&gt; - &lt;SPAN class="hljs-built_in"&gt;dot&lt;/SPAN&gt;(l, l));
        l = &lt;SPAN class="hljs-built_in"&gt;normalize&lt;/SPAN&gt;(l);
        float3 h = &lt;SPAN class="hljs-built_in"&gt;normalize&lt;/SPAN&gt;(l + v);
        
        &lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; nDotL = &lt;SPAN class="hljs-built_in"&gt;saturate&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;dot&lt;/SPAN&gt;(n, l));
        &lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; nDotH = &lt;SPAN class="hljs-built_in"&gt;saturate&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;dot&lt;/SPAN&gt;(n, h));
        &lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; power = (nDotL == &lt;SPAN class="hljs-number"&gt;0.0f&lt;/SPAN&gt;) ? &lt;SPAN class="hljs-number"&gt;0.0f&lt;/SPAN&gt; : &lt;SPAN class="hljs-built_in"&gt;pow&lt;/SPAN&gt;(nDotH, &lt;SPAN class="hljs-number"&gt;16.0f&lt;/SPAN&gt;);
        
        color += (light.colorLightType.xyz * nDotL * atten) + power * atten;
    }
	color += ambient_color;
	&lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; &lt;SPAN class="hljs-built_in"&gt;float4&lt;/SPAN&gt;(color.xyz, Color.a);
}

&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;else&lt;/SPAN&gt;&lt;/SPAN&gt;

&lt;SPAN class="hljs-function"&gt;float4 &lt;SPAN class="hljs-title"&gt;CalculateLighting&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(float4 color, float3 vVec, float3 Normal, float4 lightIndex)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
	float3 ambient_color = &lt;SPAN class="hljs-built_in"&gt;float3&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0.2f&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.2f&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.2f&lt;/SPAN&gt;);
	float3 lighting = &lt;SPAN class="hljs-built_in"&gt;float3&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0.0f&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.0f&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.0f&lt;/SPAN&gt;);
	&lt;SPAN class="hljs-keyword"&gt;for&lt;/SPAN&gt; (&lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; i = &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;; i &amp;lt; &lt;SPAN class="hljs-number"&gt;4&lt;/SPAN&gt;; ++i) {
		&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; lIndex = &lt;SPAN class="hljs-number"&gt;255.0f&lt;/SPAN&gt; * lightIndex[i];
		Light light = lights[&lt;SPAN class="hljs-built_in"&gt;&lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt;&lt;/SPAN&gt;(lIndex)]; 
		&lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (!light.posRange.w) {
	    	&lt;SPAN class="hljs-comment"&gt;//return float4(0.0f, 0.0f, 0.0f, 0.0f);&lt;/SPAN&gt;
			&lt;SPAN class="hljs-comment"&gt;//continue;&lt;/SPAN&gt;
		}
	    &lt;SPAN class="hljs-comment"&gt;// Get the vector from the light center to the surface&lt;/SPAN&gt;
		float3 lightVec = light.posRange.xyz - vVec;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;if&lt;/SPAN&gt; 1&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;if&lt;/SPAN&gt; 1&lt;/SPAN&gt;
 		&lt;SPAN class="hljs-comment"&gt;// Scale based on the light radius&lt;/SPAN&gt;
		float3 lVec = lightVec * light.posRange.a;
		&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; atten = &lt;SPAN class="hljs-number"&gt;1.0f&lt;/SPAN&gt; - &lt;SPAN class="hljs-built_in"&gt;saturate&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;dot&lt;/SPAN&gt;(lVec, lVec));
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;else&lt;/SPAN&gt;&lt;/SPAN&gt;
		&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; d = &lt;SPAN class="hljs-built_in"&gt;length&lt;/SPAN&gt;(lightVec) / light.posRange.a;
		&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; atten = &lt;SPAN class="hljs-number"&gt;1.0f&lt;/SPAN&gt; - &lt;SPAN class="hljs-built_in"&gt;saturate&lt;/SPAN&gt;(d);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;else&lt;/SPAN&gt;&lt;/SPAN&gt;
		&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; d = &lt;SPAN class="hljs-built_in"&gt;length&lt;/SPAN&gt;(lightVec) * light.posRange.a;
		&lt;SPAN class="hljs-keyword"&gt;const&lt;/SPAN&gt; float3 ConstantAtten = &lt;SPAN class="hljs-built_in"&gt;float3&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0.4f&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.01f&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.01f&lt;/SPAN&gt;);
		&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; atten = &lt;SPAN class="hljs-number"&gt;1.0f&lt;/SPAN&gt; / (ConstantAtten.x + ConstantAtten.y * d + ConstantAtten.z * d * d);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt;	&lt;/SPAN&gt;
		lightVec = &lt;SPAN class="hljs-built_in"&gt;normalize&lt;/SPAN&gt;(lightVec);
		float3 H = &lt;SPAN class="hljs-built_in"&gt;normalize&lt;/SPAN&gt;(lightVec + vVec);
		&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; diffuse = &lt;SPAN class="hljs-built_in"&gt;saturate&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;dot&lt;/SPAN&gt;(lightVec, Normal));
		&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; specular = &lt;SPAN class="hljs-built_in"&gt;pow&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;saturate&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;dot&lt;/SPAN&gt;(lightVec, H)), &lt;SPAN class="hljs-number"&gt;16.0&lt;/SPAN&gt;);
		lighting += atten * (diffuse * light.colorLightType.xyz * color.xyz + color.xyz * ambient_color + light.colorLightType.xyz * specular);
	}
	&lt;SPAN class="hljs-comment"&gt;//lighting = max(lighting, 0.0f);&lt;/SPAN&gt;
	&lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; &lt;SPAN class="hljs-built_in"&gt;float4&lt;/SPAN&gt;(lighting.xyz, color.a);
	&lt;SPAN class="hljs-comment"&gt;//return float4(color.xyz, color.a);&lt;/SPAN&gt;
}
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt; &lt;SPAN class="hljs-comment"&gt;// NEW_MULTI_LIGHTING &lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt; &lt;SPAN class="hljs-comment"&gt;// MULTIPLE_LIGHTS&lt;/SPAN&gt;&lt;/SPAN&gt;

&lt;SPAN class="hljs-function"&gt;float4 &lt;SPAN class="hljs-title"&gt;psMain&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(in PSOutput In)&lt;/SPAN&gt; : SV_Target {&lt;/SPAN&gt;
	
	float4 color = tex1.&lt;SPAN class="hljs-built_in"&gt;Sample&lt;/SPAN&gt;(samLinear1, In.texCoord);
	float4 color2 = tex2.&lt;SPAN class="hljs-built_in"&gt;Sample&lt;/SPAN&gt;(samLinear2, In.texCoord);
	color *= color2;
	float4 shadowCrd = In.shadowCrd;
	&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; shadowColor = &lt;SPAN class="hljs-number"&gt;0.5f&lt;/SPAN&gt;;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;ifdef&lt;/SPAN&gt; PCF&lt;/SPAN&gt;
	&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; sh = &lt;SPAN class="hljs-built_in"&gt;PCFFilter&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;4.0&lt;/SPAN&gt;, ShadowMap, shadowCrd, shadowColor);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;else&lt;/SPAN&gt;&lt;/SPAN&gt;
	shadowCrd.xyz /= shadowCrd.w;
	&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; shadow = ShadowMap.&lt;SPAN class="hljs-built_in"&gt;Sample&lt;/SPAN&gt;(sShadowMap, shadowCrd.xy).r;
	&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; sh = shadow &amp;lt; shadowCrd.z - &lt;SPAN class="hljs-number"&gt;0.001f&lt;/SPAN&gt; ? shadowColor : &lt;SPAN class="hljs-number"&gt;1.0f&lt;/SPAN&gt;;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt;&lt;/SPAN&gt;
	float3 normal = &lt;SPAN class="hljs-built_in"&gt;normalize&lt;/SPAN&gt;(In.Normal);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;ifdef&lt;/SPAN&gt; MULTIPLE_LIGHTS&lt;/SPAN&gt;
	float4 lightIndex = &lt;SPAN class="hljs-built_in"&gt;GetLightIndex&lt;/SPAN&gt;(BitPlane, In.lightProjSpaceLokup);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;ifdef&lt;/SPAN&gt; NEW_MULTI_LIGHTING&lt;/SPAN&gt;
	float3 viewDir = &lt;SPAN class="hljs-built_in"&gt;normalize&lt;/SPAN&gt;(In.viewDir);
	float4 Albedo = &lt;SPAN class="hljs-built_in"&gt;CalculateLighting&lt;/SPAN&gt;(color, In.vVec, normal, viewDir, lightIndex);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;else&lt;/SPAN&gt;&lt;/SPAN&gt;
	float4 Albedo = &lt;SPAN class="hljs-built_in"&gt;CalculateLighting&lt;/SPAN&gt;(color, In.vVec, normal, lightIndex);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt;	&lt;/SPAN&gt;
	float3 lightDir = &lt;SPAN class="hljs-built_in"&gt;normalize&lt;/SPAN&gt;(In.lightDir);
	&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; I = &lt;SPAN class="hljs-built_in"&gt;saturate&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;dot&lt;/SPAN&gt;(lightDir, normal));
	&lt;SPAN class="hljs-keyword"&gt;const&lt;/SPAN&gt; float3 ambient = &lt;SPAN class="hljs-built_in"&gt;float3&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0.2f&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.2f&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.2f&lt;/SPAN&gt;);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;ifdef&lt;/SPAN&gt; MULTIPLE_LIGHTS&lt;/SPAN&gt;
	color.xyz += Albedo.zyz;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt;&lt;/SPAN&gt;
	color.xyz += ambient;
	color.xyz *= I;
	color.xyz *= sh;
	&lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; color;
}
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;The Direct3D12 version of the same shaders shows correct result. It is working on AMD/nVidia without crashes.&lt;BR /&gt;Do we have Intel driver bug or DXC/glslang translation from HLSL to SPIR-V bug ?&lt;/P&gt;</description>
    <pubDate>Thu, 18 Nov 2021 08:48:52 GMT</pubDate>
    <dc:creator>Geets__Andrey</dc:creator>
    <dc:date>2021-11-18T08:48:52Z</dc:date>
    <item>
      <title>Vulkan Tessellation: vkCreateGraphicsPipelines crashes on Intel UHD 630</title>
      <link>https://community.intel.com/t5/Developing-Games-on-Intel/Vulkan-Tessellation-vkCreateGraphicsPipelines-crashes-on-Intel/m-p/1336924#M1819</link>
      <description>&lt;P&gt;Hi! Windows 10 X64 dirver 30.0.101.1069, 11.11.2021&lt;/P&gt;
&lt;P&gt;I attached full demo with source HLSL files and spir-v result:&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://www.dropbox.com/s/qytvexihn7r0sqx/VulkanDemoTerrainTessellation.7z?dl=0" target="_blank" rel="noopener nofollow ugc"&gt;VulkanDemoTerrainTesselation&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Shader from&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://www.dropbox.com/s/qytvexihn7r0sqx/VulkanDemoTerrainTessellation.7z?dl=0" target="_self" rel="nofollow ugc"&gt;VulkanDemoTerrainTesselation&lt;/A&gt;:&lt;/P&gt;
&lt;P&gt;vs.vert - Vertex shader&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="hljs lua"&gt;#define location(x) &lt;SPAN class="hljs-string"&gt;[[vk::location(x)]]&lt;/SPAN&gt;
struct Output {
	float4 pos : SV_POSITION;
	location(&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;) float2 texCoord : TEXCOORD0;
	location(&lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;) float3 Normal : NORMAL;
};

struct Input {
	location(&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;) float4 pos: SV_POSITION;
	location(&lt;SPAN class="hljs-number"&gt;8&lt;/SPAN&gt;) float2 uv	: TEXCOORD0;
	location(&lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;) float3 Normal	: NORMAL;
};

Output vsMain(&lt;SPAN class="hljs-keyword"&gt;in&lt;/SPAN&gt; Input &lt;SPAN class="hljs-built_in"&gt;input&lt;/SPAN&gt;) {
	Output &lt;SPAN class="hljs-built_in"&gt;output&lt;/SPAN&gt;;
	&lt;SPAN class="hljs-built_in"&gt;output&lt;/SPAN&gt;.pos = float4(&lt;SPAN class="hljs-built_in"&gt;input&lt;/SPAN&gt;.pos.xyz, &lt;SPAN class="hljs-number"&gt;1.0&lt;/SPAN&gt;f);
	&lt;SPAN class="hljs-built_in"&gt;output&lt;/SPAN&gt;.Normal = &lt;SPAN class="hljs-built_in"&gt;input&lt;/SPAN&gt;.Normal;	
	&lt;SPAN class="hljs-built_in"&gt;output&lt;/SPAN&gt;.texCoord = &lt;SPAN class="hljs-built_in"&gt;input&lt;/SPAN&gt;.uv;
	&lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; &lt;SPAN class="hljs-built_in"&gt;output&lt;/SPAN&gt;;
}
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;hs.tesc - Hull shader&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="hljs csharp"&gt;&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;define&lt;/SPAN&gt; location(x) [[vk::location(x)]]&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;define&lt;/SPAN&gt; binding(x) [[vk::binding(x)]]&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;define&lt;/SPAN&gt; MAX_TF 20.0f&lt;/SPAN&gt;
&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; ConstantsHSOutput {
		&lt;SPAN class="hljs-built_in"&gt;float&lt;/SPAN&gt; Edges[&lt;SPAN class="hljs-number"&gt;4&lt;/SPAN&gt;]	: SV_TessFactor;
		&lt;SPAN class="hljs-built_in"&gt;float&lt;/SPAN&gt; Inside[&lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;] : SV_InsideTessFactor;
	};
&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; Input{
		float4 pos : SV_POSITION;
		location(&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;) float2 uv : TEXCOORD0;
		location(&lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;) float3 Normal : NORMAL;
};
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;define&lt;/SPAN&gt; MAX_TF 20.0f&lt;/SPAN&gt;
binding(&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;) cbuffer b0: register(b0) {
	row_major float4x4 view;
	row_major float4x4 proj;
	float4 cameraPosition;
	&lt;SPAN class="hljs-built_in"&gt;float&lt;/SPAN&gt; LodDistance;
	&lt;SPAN class="hljs-built_in"&gt;float&lt;/SPAN&gt; tessellationFactor;
	&lt;SPAN class="hljs-built_in"&gt;float&lt;/SPAN&gt; tessellatedEdgeSize;
	float2 viewportDim;
	&lt;SPAN class="hljs-built_in"&gt;uint&lt;/SPAN&gt; numLods;
};
&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-built_in"&gt;float&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;distSq&lt;/SPAN&gt;(&lt;SPAN class="hljs-params"&gt;float3 p0, float3 p1&lt;/SPAN&gt;)&lt;/SPAN&gt; {
	float3 d = p0 - p1;
	&lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; dot(d, d);
}
&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-built_in"&gt;float&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;screenSpaceTessFactor&lt;/SPAN&gt;(&lt;SPAN class="hljs-params"&gt;float4 p0, float4 p1&lt;/SPAN&gt;)&lt;/SPAN&gt; {
	float4 midPoint = &lt;SPAN class="hljs-number"&gt;0.5f&lt;/SPAN&gt; * (p0 + p1);
	&lt;SPAN class="hljs-built_in"&gt;float&lt;/SPAN&gt; radius = distance(p0, p1) * &lt;SPAN class="hljs-number"&gt;0.5f&lt;/SPAN&gt;;
	float4 v0 = mul(midPoint, view);	float4 clip0 = mul(float4(v0.x - radius, 
v0.yzw), proj);
	float4 clip1 = mul(float4(v0.x + radius, v0.yzw), proj);
	clip0 /= clip0.w;
	clip1 /= clip1.w;
	clip0.xy *= viewportDim;
	clip1.xy *= viewportDim;
&lt;SPAN class="hljs-meta"&gt;#ifdef D3D12&lt;/SPAN&gt;
	&lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; max(distance(clip0, clip1) / tessellatedEdgeSize * tessellationFactor, &lt;SPAN class="hljs-number"&gt;1.0f&lt;/SPAN&gt;);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;else&lt;/SPAN&gt;&lt;/SPAN&gt;
	&lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; clamp(distance(clip0, clip1) / tessellatedEdgeSize * tessellationFactor, &lt;SPAN class="hljs-number"&gt;1.0f&lt;/SPAN&gt;, MAX_TF);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt;&lt;/SPAN&gt;
}
&lt;SPAN class="hljs-function"&gt;&lt;SPAN class="hljs-built_in"&gt;float&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;CalculateTessFactor&lt;/SPAN&gt;(&lt;SPAN class="hljs-params"&gt;float4 p0, float4 p1&lt;/SPAN&gt;)&lt;/SPAN&gt; {
&lt;SPAN class="hljs-meta"&gt;#ifdef USE_SS_TESS_FACTOR_CALC&lt;/SPAN&gt;
	&lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; screenSpaceTessFactor(p0, p1);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;else&lt;/SPAN&gt;&lt;/SPAN&gt;
	float3 center = (p0 + p1).xyz * &lt;SPAN class="hljs-number"&gt;0.5f&lt;/SPAN&gt;;
	&lt;SPAN class="hljs-built_in"&gt;float&lt;/SPAN&gt; factor = LodDistance / distSq(center, cameraPosition);
	&lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; clamp(factor, &lt;SPAN class="hljs-number"&gt;1.0f&lt;/SPAN&gt;, numLods);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt;&lt;/SPAN&gt;
}
&lt;SPAN class="hljs-function"&gt;ConstantsHSOutput &lt;SPAN class="hljs-title"&gt;ConstantsHS&lt;/SPAN&gt;(&lt;SPAN class="hljs-params"&gt;InputPatch&amp;lt;Input, &lt;SPAN class="hljs-number"&gt;4&lt;/SPAN&gt;&amp;gt; ip, &lt;SPAN class="hljs-built_in"&gt;uint&lt;/SPAN&gt; PatchID : SV_PrimitiveID&lt;/SPAN&gt;)&lt;/SPAN&gt; {
	ConstantsHSOutput hsOut;
	hsOut.Edges[&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;] = CalculateTessFactor(ip[&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;].pos, ip[&lt;SPAN class="hljs-number"&gt;3&lt;/SPAN&gt;].pos);
	hsOut.Edges[&lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;] = CalculateTessFactor(ip[&lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;].pos, ip[&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;].pos);
	hsOut.Edges[&lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;] = CalculateTessFactor(ip[&lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;].pos, ip[&lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;].pos);
	hsOut.Edges[&lt;SPAN class="hljs-number"&gt;3&lt;/SPAN&gt;] = CalculateTessFactor(ip[&lt;SPAN class="hljs-number"&gt;3&lt;/SPAN&gt;].pos, ip[&lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;].pos);
	hsOut.Inside[&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;] = lerp(hsOut.Edges[&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;], hsOut.Edges[&lt;SPAN class="hljs-number"&gt;3&lt;/SPAN&gt;], &lt;SPAN class="hljs-number"&gt;0.5f&lt;/SPAN&gt;);
	hsOut.Inside[&lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;] = lerp(hsOut.Edges[&lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;], hsOut.Edges[&lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;], &lt;SPAN class="hljs-number"&gt;0.5f&lt;/SPAN&gt;);
	&lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; hsOut;
}
[&lt;SPAN class="hljs-meta"&gt;domain(&lt;SPAN class="hljs-meta-string"&gt;"quad"&lt;/SPAN&gt;)&lt;/SPAN&gt;]
[&lt;SPAN class="hljs-meta"&gt;partitioning(&lt;SPAN class="hljs-meta-string"&gt;"integer"&lt;/SPAN&gt;)&lt;/SPAN&gt;]
[&lt;SPAN class="hljs-meta"&gt;outputtopology(&lt;SPAN class="hljs-meta-string"&gt;"triangle_cw"&lt;/SPAN&gt;)&lt;/SPAN&gt;]
[&lt;SPAN class="hljs-meta"&gt;outputcontrolpoints(4)&lt;/SPAN&gt;]
[&lt;SPAN class="hljs-meta"&gt;patchconstantfunc(&lt;SPAN class="hljs-meta-string"&gt;"ConstantsHS"&lt;/SPAN&gt;)&lt;/SPAN&gt;]
[&lt;SPAN class="hljs-meta"&gt;maxtessfactor(MAX_TF)&lt;/SPAN&gt;]
&lt;SPAN class="hljs-function"&gt;Input &lt;SPAN class="hljs-title"&gt;hMain&lt;/SPAN&gt;(&lt;SPAN class="hljs-params"&gt;InputPatch&amp;lt;Input, &lt;SPAN class="hljs-number"&gt;4&lt;/SPAN&gt;&amp;gt; ip, &lt;SPAN class="hljs-built_in"&gt;uint&lt;/SPAN&gt; i : SV_OutputControlPointID, &lt;SPAN class="hljs-built_in"&gt;uint&lt;/SPAN&gt; PatchID : SV_PrimitiveID&lt;/SPAN&gt;)&lt;/SPAN&gt; {
	Input output;
	output.pos = float4(ip[i].pos.xyz, &lt;SPAN class="hljs-number"&gt;1.0f&lt;/SPAN&gt;);
	output.uv = ip[i].uv;
	output.Normal = ip[i].Normal;
	&lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; output;
}
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;ds.tese - Domain shader&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="hljs cpp"&gt;&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;define&lt;/SPAN&gt; location(x) [[vk::location(x)]]&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;define&lt;/SPAN&gt; binding(x) [[vk::binding(x)]]&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;define&lt;/SPAN&gt; MULTIPLE_LIGHTS 1&lt;/SPAN&gt;

&lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;ConstantsHSOutput&lt;/SPAN&gt; {&lt;/SPAN&gt;
		&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; Edges[&lt;SPAN class="hljs-number"&gt;4&lt;/SPAN&gt;]	: SV_TessFactor;
		&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; Inside[&lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;] : SV_InsideTessFactor;
	};
&lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;Output&lt;/SPAN&gt;{&lt;/SPAN&gt;
		&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;) float4 pos : POSITION;
		&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;) float2 texCoord : TEXCOORD0;
		&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;) float3 Normal : NORMAL;
		&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;3&lt;/SPAN&gt;) float3 lightDir : TEXCOORD1;
		&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;4&lt;/SPAN&gt;) float4 shadowCrd : TEXCOORD2;
		&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;5&lt;/SPAN&gt;) float4 lightProjSpaceLokup : TEXCOORD3;
		&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;6&lt;/SPAN&gt;) float3 vVec : TEXCOORD4;
		&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;7&lt;/SPAN&gt;) float3 viewDir : TEXCOORD5;
};

&lt;SPAN class="hljs-built_in"&gt;binding&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;) cbuffer b0 : &lt;SPAN class="hljs-built_in"&gt;&lt;SPAN class="hljs-keyword"&gt;register&lt;/SPAN&gt;&lt;/SPAN&gt;(b0) {
	row_major float4x4 ModelViewProjection;
	row_major float4x4 proj;
	float4 cameraPosition;
	float4 LightDir;
	row_major float4x4 MatTexture;
	row_major float4x4 ViewMatrix;
	&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; scaleHeight;
	float2 uvScale;
};
&lt;SPAN class="hljs-built_in"&gt;binding&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;) Texture2D HeightMap : &lt;SPAN class="hljs-built_in"&gt;&lt;SPAN class="hljs-keyword"&gt;register&lt;/SPAN&gt;&lt;/SPAN&gt;(t0);
&lt;SPAN class="hljs-built_in"&gt;binding&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;) SamplerState Sampler : &lt;SPAN class="hljs-built_in"&gt;&lt;SPAN class="hljs-keyword"&gt;register&lt;/SPAN&gt;&lt;/SPAN&gt;(s0);
&lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;Input&lt;/SPAN&gt; {&lt;/SPAN&gt;
	&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;) float4 pos: SV_POSITION;
	&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;8&lt;/SPAN&gt;) float2 uv	: TEXCOORD0;
	&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;) float3 Normal	: NORMAL;
};
&lt;SPAN class="hljs-function"&gt;float4 &lt;SPAN class="hljs-title"&gt;CalcLightProjSpaceLookup&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(float4 projectSpace)&lt;/SPAN&gt; &lt;/SPAN&gt;{	projectSpace.xy = (projectSpace.xy + &lt;SPAN class="hljs-built_in"&gt;float2&lt;/SPAN&gt;(projectSpace.w, projectSpace.w)) * &lt;SPAN class="hljs-number"&gt;0.5&lt;/SPAN&gt;;	&lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; projectSpace;}

&lt;SPAN class="hljs-function"&gt;Output &lt;SPAN class="hljs-title"&gt;vsMain&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(in Input input)&lt;/SPAN&gt; &lt;/SPAN&gt;{
	Output output;
	float4 Pos = &lt;SPAN class="hljs-built_in"&gt;float4&lt;/SPAN&gt;(input.pos.xyz, &lt;SPAN class="hljs-number"&gt;1.0f&lt;/SPAN&gt;); 
	output.pos = &lt;SPAN class="hljs-built_in"&gt;mul&lt;/SPAN&gt;(Pos, ModelViewProjection);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;ifdef&lt;/SPAN&gt; MULTIPLE_LIGHTS&lt;/SPAN&gt;
	output.lightProjSpaceLokup = &lt;SPAN class="hljs-built_in"&gt;CalcLightProjSpaceLookup&lt;/SPAN&gt;(output.pos);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;ifdef&lt;/SPAN&gt; NO_LIGHT_VIEW_SPACE&lt;/SPAN&gt;
	output.vVec = pos.xyz;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;else&lt;/SPAN&gt;&lt;/SPAN&gt;
	output.vVec = &lt;SPAN class="hljs-built_in"&gt;mul&lt;/SPAN&gt;(Pos, ViewMatrix).xyz;
	output.viewDir = cameraPosition.xyz - Pos.xyz;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt;&lt;/SPAN&gt;
	output.shadowCrd = &lt;SPAN class="hljs-built_in"&gt;mul&lt;/SPAN&gt;(Pos, MatTexture);
	output.texCoord = input.uv;
	output.Normal = &lt;SPAN class="hljs-built_in"&gt;mul&lt;/SPAN&gt;(input.Normal, (float3x3)ViewMatrix);
	output.lightDir = -LightDir.xyz;
    &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; output;
}
[&lt;SPAN class="hljs-built_in"&gt;domain&lt;/SPAN&gt;(&lt;SPAN class="hljs-string"&gt;"quad"&lt;/SPAN&gt;)]
&lt;SPAN class="hljs-function"&gt;Output &lt;SPAN class="hljs-title"&gt;dMain&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(in ConstantsHSOutput input, float2 domain : SV_DomainLocation, &lt;SPAN class="hljs-keyword"&gt;const&lt;/SPAN&gt; OutputPatch&amp;lt;Input, &lt;SPAN class="hljs-number"&gt;4&lt;/SPAN&gt;&amp;gt; patch)&lt;/SPAN&gt; &lt;/SPAN&gt;{
	Output dsOutput;
	Input vsIn;
	vsIn.pos = &lt;SPAN class="hljs-built_in"&gt;lerp&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;lerp&lt;/SPAN&gt;(patch[&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;].pos, patch[&lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;].pos, domain.x), &lt;SPAN class="hljs-built_in"&gt;lerp&lt;/SPAN&gt;(patch[&lt;SPAN class="hljs-number"&gt;3&lt;/SPAN&gt;].pos, patch[&lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;].pos, domain.x), domain.y);
	float2 uv = vsIn.pos.xz * uvScale;
	vsIn.pos.y = HeightMap.&lt;SPAN class="hljs-built_in"&gt;SampleLevel&lt;/SPAN&gt;(Sampler, uv, &lt;SPAN class="hljs-number"&gt;0.0&lt;/SPAN&gt;).r * scaleHeight;
	vsIn.uv = &lt;SPAN class="hljs-built_in"&gt;lerp&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;lerp&lt;/SPAN&gt;(patch[&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;].uv, patch[&lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;].uv, domain.x), &lt;SPAN class="hljs-built_in"&gt;lerp&lt;/SPAN&gt;(patch[&lt;SPAN class="hljs-number"&gt;3&lt;/SPAN&gt;].uv, patch[&lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;].uv, domain.x), domain.y);
	vsIn.Normal = &lt;SPAN class="hljs-built_in"&gt;lerp&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;lerp&lt;/SPAN&gt;(patch[&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;].Normal, patch[&lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;].Normal, domain.x), &lt;SPAN class="hljs-built_in"&gt;lerp&lt;/SPAN&gt;(patch[&lt;SPAN class="hljs-number"&gt;3&lt;/SPAN&gt;].Normal, patch[&lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;].Normal, domain.x), domain.y);
	dsOutput = &lt;SPAN class="hljs-built_in"&gt;vsMain&lt;/SPAN&gt;(vsIn);
	&lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; dsOutput;
}
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;ps.frag - Pixel shader&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="hljs cpp"&gt;&lt;SPAN class="hljs-comment"&gt;//&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;define&lt;/SPAN&gt; location(x) layout(location = x)&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;define&lt;/SPAN&gt; binding(x) [[vk::binding(x)]]&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;define&lt;/SPAN&gt; SIMPLE_POINT_LIGHT&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#defne MULTIPLE_LIGHTS&lt;/SPAN&gt;

&lt;SPAN class="hljs-comment"&gt;//&lt;/SPAN&gt;
&lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;PSOutput&lt;/SPAN&gt; {&lt;/SPAN&gt;
	&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;) float4 pos : SV_POSITION;
	&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;1&lt;/SPAN&gt;) float2 texCoord : TEXCOORD0;
	&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;) float3 Normal : NORMAL;
	&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;3&lt;/SPAN&gt;) float3 lightDir : TEXCOORD1;
	&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;4&lt;/SPAN&gt;) float4 shadowCrd: TEXCOORD2;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;ifdef&lt;/SPAN&gt; MULTIPLE_LIGHTS&lt;/SPAN&gt;
	&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;5&lt;/SPAN&gt;) float4 lightProjSpaceLokup : TEXCOORD3;
	&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;6&lt;/SPAN&gt;) float3 vVec : TEXCOORD4;
	&lt;SPAN class="hljs-built_in"&gt;location&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;7&lt;/SPAN&gt;) float3 viewDir : TEXCOORD5;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt;&lt;/SPAN&gt;
};

&lt;SPAN class="hljs-built_in"&gt;binding&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;3&lt;/SPAN&gt;) Texture2D tex1 : &lt;SPAN class="hljs-built_in"&gt;&lt;SPAN class="hljs-keyword"&gt;register&lt;/SPAN&gt;&lt;/SPAN&gt;(t0);
&lt;SPAN class="hljs-built_in"&gt;binding&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;3&lt;/SPAN&gt;) SamplerState samLinear1 : &lt;SPAN class="hljs-built_in"&gt;&lt;SPAN class="hljs-keyword"&gt;register&lt;/SPAN&gt;&lt;/SPAN&gt;(s0);

&lt;SPAN class="hljs-built_in"&gt;binding&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;4&lt;/SPAN&gt;) Texture2D tex2 : &lt;SPAN class="hljs-built_in"&gt;&lt;SPAN class="hljs-keyword"&gt;register&lt;/SPAN&gt;&lt;/SPAN&gt;(t1);
&lt;SPAN class="hljs-built_in"&gt;binding&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;4&lt;/SPAN&gt;) SamplerState samLinear2 : &lt;SPAN class="hljs-built_in"&gt;&lt;SPAN class="hljs-keyword"&gt;register&lt;/SPAN&gt;&lt;/SPAN&gt;(s1);

&lt;SPAN class="hljs-built_in"&gt;binding&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;5&lt;/SPAN&gt;) Texture2D ShadowMap : &lt;SPAN class="hljs-built_in"&gt;&lt;SPAN class="hljs-keyword"&gt;register&lt;/SPAN&gt;&lt;/SPAN&gt;(t2);
&lt;SPAN class="hljs-built_in"&gt;binding&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;5&lt;/SPAN&gt;) SamplerState sShadowMap : &lt;SPAN class="hljs-built_in"&gt;&lt;SPAN class="hljs-keyword"&gt;register&lt;/SPAN&gt;&lt;/SPAN&gt;(s2);

&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;ifdef&lt;/SPAN&gt; MULTIPLE_LIGHTS&lt;/SPAN&gt;
&lt;SPAN class="hljs-built_in"&gt;binding&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;6&lt;/SPAN&gt;) Texture2D BitPlane : &lt;SPAN class="hljs-built_in"&gt;&lt;SPAN class="hljs-keyword"&gt;register&lt;/SPAN&gt;&lt;/SPAN&gt;(t3);
&lt;SPAN class="hljs-built_in"&gt;binding&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;6&lt;/SPAN&gt;) SamplerState sBitPlane : &lt;SPAN class="hljs-built_in"&gt;&lt;SPAN class="hljs-keyword"&gt;register&lt;/SPAN&gt;&lt;/SPAN&gt;(s3);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt;&lt;/SPAN&gt;

&lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;struct&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;Light&lt;/SPAN&gt; {&lt;/SPAN&gt;
	float4 posRange;
	float4 colorLightType;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;ifndef&lt;/SPAN&gt; SIMPLE_POINT_LIGHT&lt;/SPAN&gt;
	float4 directionFalloff;
	float4 lighTypeAttenuation;
	float4 ThetaPhi;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt;&lt;/SPAN&gt;
};

&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;ifdef&lt;/SPAN&gt; MULTIPLE_LIGHTS&lt;/SPAN&gt;

&lt;SPAN class="hljs-built_in"&gt;binding&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;7&lt;/SPAN&gt;) cbuffer b0: &lt;SPAN class="hljs-built_in"&gt;&lt;SPAN class="hljs-keyword"&gt;register&lt;/SPAN&gt;&lt;/SPAN&gt;(b0) {
	Light lights[NUM_LIGHTS];
};

&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;define&lt;/SPAN&gt; NEW_MULTI_LIGHTING&lt;/SPAN&gt;

&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;ifdef&lt;/SPAN&gt; NEW_MULTI_LIGHTING&lt;/SPAN&gt;

&lt;SPAN class="hljs-function"&gt;float4 &lt;SPAN class="hljs-title"&gt;CalculateLighting&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(float4 Color, float3 worldPos, float3 Normal, float3 viewDir, float4 lightIndex)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
	float3 ambient_color = &lt;SPAN class="hljs-built_in"&gt;float3&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0.0f&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.0f&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.0f&lt;/SPAN&gt;);
    float3 color = &lt;SPAN class="hljs-built_in"&gt;float3&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0.0f&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.0f&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.0f&lt;/SPAN&gt;);
    
    float3 n = &lt;SPAN class="hljs-built_in"&gt;normalize&lt;/SPAN&gt;(Normal);
    float3 v = &lt;SPAN class="hljs-built_in"&gt;normalize&lt;/SPAN&gt;(viewDir);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;ifndef&lt;/SPAN&gt; NO_LIGHT_BUFFER&lt;/SPAN&gt;
    &lt;SPAN class="hljs-keyword"&gt;for&lt;/SPAN&gt; (&lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; i = &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;; i &amp;lt; &lt;SPAN class="hljs-number"&gt;4&lt;/SPAN&gt;; ++i)
    {                   
		&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; lIndex = &lt;SPAN class="hljs-number"&gt;256.0f&lt;/SPAN&gt; * lightIndex[i];
		Light light = lights[&lt;SPAN class="hljs-built_in"&gt;&lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt;&lt;/SPAN&gt;(lIndex)]; 
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;else&lt;/SPAN&gt;&lt;/SPAN&gt;
    &lt;SPAN class="hljs-keyword"&gt;for&lt;/SPAN&gt; (&lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; i = &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;; i &amp;lt; &lt;SPAN class="hljs-number"&gt;255&lt;/SPAN&gt;; ++i)
    {        		
		Light light = lights[i]; 
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt;&lt;/SPAN&gt;
        float3 l = (light.posRange.xyz - worldPos) * light.posRange.w;
        &lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; atten = &lt;SPAN class="hljs-built_in"&gt;saturate&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;1.0f&lt;/SPAN&gt; - &lt;SPAN class="hljs-built_in"&gt;dot&lt;/SPAN&gt;(l, l));
        l = &lt;SPAN class="hljs-built_in"&gt;normalize&lt;/SPAN&gt;(l);
        float3 h = &lt;SPAN class="hljs-built_in"&gt;normalize&lt;/SPAN&gt;(l + v);
        
        &lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; nDotL = &lt;SPAN class="hljs-built_in"&gt;saturate&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;dot&lt;/SPAN&gt;(n, l));
        &lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; nDotH = &lt;SPAN class="hljs-built_in"&gt;saturate&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;dot&lt;/SPAN&gt;(n, h));
        &lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; power = (nDotL == &lt;SPAN class="hljs-number"&gt;0.0f&lt;/SPAN&gt;) ? &lt;SPAN class="hljs-number"&gt;0.0f&lt;/SPAN&gt; : &lt;SPAN class="hljs-built_in"&gt;pow&lt;/SPAN&gt;(nDotH, &lt;SPAN class="hljs-number"&gt;16.0f&lt;/SPAN&gt;);
        
        color += (light.colorLightType.xyz * nDotL * atten) + power * atten;
    }
	color += ambient_color;
	&lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; &lt;SPAN class="hljs-built_in"&gt;float4&lt;/SPAN&gt;(color.xyz, Color.a);
}

&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;else&lt;/SPAN&gt;&lt;/SPAN&gt;

&lt;SPAN class="hljs-function"&gt;float4 &lt;SPAN class="hljs-title"&gt;CalculateLighting&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(float4 color, float3 vVec, float3 Normal, float4 lightIndex)&lt;/SPAN&gt;
&lt;/SPAN&gt;{
	float3 ambient_color = &lt;SPAN class="hljs-built_in"&gt;float3&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0.2f&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.2f&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.2f&lt;/SPAN&gt;);
	float3 lighting = &lt;SPAN class="hljs-built_in"&gt;float3&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0.0f&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.0f&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.0f&lt;/SPAN&gt;);
	&lt;SPAN class="hljs-keyword"&gt;for&lt;/SPAN&gt; (&lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt; i = &lt;SPAN class="hljs-number"&gt;0&lt;/SPAN&gt;; i &amp;lt; &lt;SPAN class="hljs-number"&gt;4&lt;/SPAN&gt;; ++i) {
		&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; lIndex = &lt;SPAN class="hljs-number"&gt;255.0f&lt;/SPAN&gt; * lightIndex[i];
		Light light = lights[&lt;SPAN class="hljs-built_in"&gt;&lt;SPAN class="hljs-keyword"&gt;int&lt;/SPAN&gt;&lt;/SPAN&gt;(lIndex)]; 
		&lt;SPAN class="hljs-keyword"&gt;if&lt;/SPAN&gt; (!light.posRange.w) {
	    	&lt;SPAN class="hljs-comment"&gt;//return float4(0.0f, 0.0f, 0.0f, 0.0f);&lt;/SPAN&gt;
			&lt;SPAN class="hljs-comment"&gt;//continue;&lt;/SPAN&gt;
		}
	    &lt;SPAN class="hljs-comment"&gt;// Get the vector from the light center to the surface&lt;/SPAN&gt;
		float3 lightVec = light.posRange.xyz - vVec;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;if&lt;/SPAN&gt; 1&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;if&lt;/SPAN&gt; 1&lt;/SPAN&gt;
 		&lt;SPAN class="hljs-comment"&gt;// Scale based on the light radius&lt;/SPAN&gt;
		float3 lVec = lightVec * light.posRange.a;
		&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; atten = &lt;SPAN class="hljs-number"&gt;1.0f&lt;/SPAN&gt; - &lt;SPAN class="hljs-built_in"&gt;saturate&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;dot&lt;/SPAN&gt;(lVec, lVec));
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;else&lt;/SPAN&gt;&lt;/SPAN&gt;
		&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; d = &lt;SPAN class="hljs-built_in"&gt;length&lt;/SPAN&gt;(lightVec) / light.posRange.a;
		&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; atten = &lt;SPAN class="hljs-number"&gt;1.0f&lt;/SPAN&gt; - &lt;SPAN class="hljs-built_in"&gt;saturate&lt;/SPAN&gt;(d);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;else&lt;/SPAN&gt;&lt;/SPAN&gt;
		&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; d = &lt;SPAN class="hljs-built_in"&gt;length&lt;/SPAN&gt;(lightVec) * light.posRange.a;
		&lt;SPAN class="hljs-keyword"&gt;const&lt;/SPAN&gt; float3 ConstantAtten = &lt;SPAN class="hljs-built_in"&gt;float3&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0.4f&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.01f&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.01f&lt;/SPAN&gt;);
		&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; atten = &lt;SPAN class="hljs-number"&gt;1.0f&lt;/SPAN&gt; / (ConstantAtten.x + ConstantAtten.y * d + ConstantAtten.z * d * d);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt;	&lt;/SPAN&gt;
		lightVec = &lt;SPAN class="hljs-built_in"&gt;normalize&lt;/SPAN&gt;(lightVec);
		float3 H = &lt;SPAN class="hljs-built_in"&gt;normalize&lt;/SPAN&gt;(lightVec + vVec);
		&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; diffuse = &lt;SPAN class="hljs-built_in"&gt;saturate&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;dot&lt;/SPAN&gt;(lightVec, Normal));
		&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; specular = &lt;SPAN class="hljs-built_in"&gt;pow&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;saturate&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;dot&lt;/SPAN&gt;(lightVec, H)), &lt;SPAN class="hljs-number"&gt;16.0&lt;/SPAN&gt;);
		lighting += atten * (diffuse * light.colorLightType.xyz * color.xyz + color.xyz * ambient_color + light.colorLightType.xyz * specular);
	}
	&lt;SPAN class="hljs-comment"&gt;//lighting = max(lighting, 0.0f);&lt;/SPAN&gt;
	&lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; &lt;SPAN class="hljs-built_in"&gt;float4&lt;/SPAN&gt;(lighting.xyz, color.a);
	&lt;SPAN class="hljs-comment"&gt;//return float4(color.xyz, color.a);&lt;/SPAN&gt;
}
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt; &lt;SPAN class="hljs-comment"&gt;// NEW_MULTI_LIGHTING &lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt; &lt;SPAN class="hljs-comment"&gt;// MULTIPLE_LIGHTS&lt;/SPAN&gt;&lt;/SPAN&gt;

&lt;SPAN class="hljs-function"&gt;float4 &lt;SPAN class="hljs-title"&gt;psMain&lt;/SPAN&gt;&lt;SPAN class="hljs-params"&gt;(in PSOutput In)&lt;/SPAN&gt; : SV_Target {&lt;/SPAN&gt;
	
	float4 color = tex1.&lt;SPAN class="hljs-built_in"&gt;Sample&lt;/SPAN&gt;(samLinear1, In.texCoord);
	float4 color2 = tex2.&lt;SPAN class="hljs-built_in"&gt;Sample&lt;/SPAN&gt;(samLinear2, In.texCoord);
	color *= color2;
	float4 shadowCrd = In.shadowCrd;
	&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; shadowColor = &lt;SPAN class="hljs-number"&gt;0.5f&lt;/SPAN&gt;;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;ifdef&lt;/SPAN&gt; PCF&lt;/SPAN&gt;
	&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; sh = &lt;SPAN class="hljs-built_in"&gt;PCFFilter&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;4.0&lt;/SPAN&gt;, ShadowMap, shadowCrd, shadowColor);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;else&lt;/SPAN&gt;&lt;/SPAN&gt;
	shadowCrd.xyz /= shadowCrd.w;
	&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; shadow = ShadowMap.&lt;SPAN class="hljs-built_in"&gt;Sample&lt;/SPAN&gt;(sShadowMap, shadowCrd.xy).r;
	&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; sh = shadow &amp;lt; shadowCrd.z - &lt;SPAN class="hljs-number"&gt;0.001f&lt;/SPAN&gt; ? shadowColor : &lt;SPAN class="hljs-number"&gt;1.0f&lt;/SPAN&gt;;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt;&lt;/SPAN&gt;
	float3 normal = &lt;SPAN class="hljs-built_in"&gt;normalize&lt;/SPAN&gt;(In.Normal);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;ifdef&lt;/SPAN&gt; MULTIPLE_LIGHTS&lt;/SPAN&gt;
	float4 lightIndex = &lt;SPAN class="hljs-built_in"&gt;GetLightIndex&lt;/SPAN&gt;(BitPlane, In.lightProjSpaceLokup);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;ifdef&lt;/SPAN&gt; NEW_MULTI_LIGHTING&lt;/SPAN&gt;
	float3 viewDir = &lt;SPAN class="hljs-built_in"&gt;normalize&lt;/SPAN&gt;(In.viewDir);
	float4 Albedo = &lt;SPAN class="hljs-built_in"&gt;CalculateLighting&lt;/SPAN&gt;(color, In.vVec, normal, viewDir, lightIndex);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;else&lt;/SPAN&gt;&lt;/SPAN&gt;
	float4 Albedo = &lt;SPAN class="hljs-built_in"&gt;CalculateLighting&lt;/SPAN&gt;(color, In.vVec, normal, lightIndex);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt;	&lt;/SPAN&gt;
	float3 lightDir = &lt;SPAN class="hljs-built_in"&gt;normalize&lt;/SPAN&gt;(In.lightDir);
	&lt;SPAN class="hljs-keyword"&gt;float&lt;/SPAN&gt; I = &lt;SPAN class="hljs-built_in"&gt;saturate&lt;/SPAN&gt;(&lt;SPAN class="hljs-built_in"&gt;dot&lt;/SPAN&gt;(lightDir, normal));
	&lt;SPAN class="hljs-keyword"&gt;const&lt;/SPAN&gt; float3 ambient = &lt;SPAN class="hljs-built_in"&gt;float3&lt;/SPAN&gt;(&lt;SPAN class="hljs-number"&gt;0.2f&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.2f&lt;/SPAN&gt;, &lt;SPAN class="hljs-number"&gt;0.2f&lt;/SPAN&gt;);
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;ifdef&lt;/SPAN&gt; MULTIPLE_LIGHTS&lt;/SPAN&gt;
	color.xyz += Albedo.zyz;
&lt;SPAN class="hljs-meta"&gt;#&lt;SPAN class="hljs-meta-keyword"&gt;endif&lt;/SPAN&gt;&lt;/SPAN&gt;
	color.xyz += ambient;
	color.xyz *= I;
	color.xyz *= sh;
	&lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; color;
}
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;The Direct3D12 version of the same shaders shows correct result. It is working on AMD/nVidia without crashes.&lt;BR /&gt;Do we have Intel driver bug or DXC/glslang translation from HLSL to SPIR-V bug ?&lt;/P&gt;</description>
      <pubDate>Thu, 18 Nov 2021 08:48:52 GMT</pubDate>
      <guid>https://community.intel.com/t5/Developing-Games-on-Intel/Vulkan-Tessellation-vkCreateGraphicsPipelines-crashes-on-Intel/m-p/1336924#M1819</guid>
      <dc:creator>Geets__Andrey</dc:creator>
      <dc:date>2021-11-18T08:48:52Z</dc:date>
    </item>
    <item>
      <title>Re: Vulkan Tessellation: vkCreateGraphicsPipelines crashes on Intel UHD 630</title>
      <link>https://community.intel.com/t5/Developing-Games-on-Intel/Vulkan-Tessellation-vkCreateGraphicsPipelines-crashes-on-Intel/m-p/1345924#M1823</link>
      <description>&lt;P&gt;Problem was fixed.&lt;/P&gt;
&lt;P&gt;Need to send correct vertex attributes from Hull Shaders -&amp;gt; Domain Shaders -&amp;gt; Pixel Shaders -&amp;gt; Ugly OpenGL legacy!!!&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Anyway Intel Vulkan Driver must't be crashed&lt;/P&gt;</description>
      <pubDate>Wed, 22 Dec 2021 08:38:01 GMT</pubDate>
      <guid>https://community.intel.com/t5/Developing-Games-on-Intel/Vulkan-Tessellation-vkCreateGraphicsPipelines-crashes-on-Intel/m-p/1345924#M1823</guid>
      <dc:creator>Geets__Andrey</dc:creator>
      <dc:date>2021-12-22T08:38:01Z</dc:date>
    </item>
  </channel>
</rss>

