Use global variables with static names instead of annotations.

This commit is contained in:
Nick Blakely 2020-11-08 18:02:39 -08:00
parent 0c527fc9d2
commit 11625b367c
7 changed files with 117 additions and 81 deletions

View File

@ -118,9 +118,6 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
</FxCompile> </FxCompile>
</ItemGroup> </ItemGroup>
<ItemGroup>
<ClInclude Include="fxh\SystemVariables.fxh" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">
</ImportGroup> </ImportGroup>

View File

@ -10,9 +10,6 @@
<Filter Include="Include"> <Filter Include="Include">
<UniqueIdentifier>{026956f1-0f27-4b3d-80ab-f81eafce58f5}</UniqueIdentifier> <UniqueIdentifier>{026956f1-0f27-4b3d-80ab-f81eafce58f5}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Pixel">
<UniqueIdentifier>{0ead58ec-1210-4df1-88c8-dfd73f6fb054}</UniqueIdentifier>
</Filter>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="fxh\Constants.fxh"> <None Include="fxh\Constants.fxh">
@ -28,9 +25,4 @@
<FxCompile Include="reference\FixedFuncEMU.fx" /> <FxCompile Include="reference\FixedFuncEMU.fx" />
<FxCompile Include="reference\FFP_orig.fx" /> <FxCompile Include="reference\FFP_orig.fx" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<ClInclude Include="fxh\SystemVariables.fxh">
<Filter>Include</Filter>
</ClInclude>
</ItemGroup>
</Project> </Project>

View File

@ -4,7 +4,21 @@
// Land bumpmapping and lighting shader. // Land bumpmapping and lighting shader.
//-------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------
#include "../fxh/SystemVariables.fxh" #include "../fxh/Constants.fxh"
#include "../fxh/Lighting.fxh"
shared texture g_Texture0;
shared texture g_Texture1;
shared float4x4 g_WorldViewProjection;
shared float4x4 g_World;
shared float4x4 g_TexGenMatrix0;
shared float4x4 g_TexGenMatrix1;
shared float4 g_PointLightDiffuse[MAX_LIGHTS];
shared float3 g_PointLightPosition[MAX_LIGHTS];
shared float g_PointLightRange[MAX_LIGHTS];
shared int g_PointLightCount;
//float4x4 g_texGenMatrix2 : TexGenTransform2; // Shore texgen //float4x4 g_texGenMatrix2 : TexGenTransform2; // Shore texgen
@ -16,7 +30,7 @@
sampler g_LandTextureSampler = sampler g_LandTextureSampler =
sampler_state sampler_state
{ {
Texture = <g_texture0>; Texture = <g_Texture0>;
MipFilter = LINEAR; MipFilter = LINEAR;
MinFilter = LINEAR; MinFilter = LINEAR;
MagFilter = LINEAR; MagFilter = LINEAR;
@ -25,7 +39,7 @@ sampler_state
sampler g_LandBumpTextureSampler = sampler g_LandBumpTextureSampler =
sampler_state sampler_state
{ {
Texture = <g_texture1>; Texture = <g_Texture1>;
MipFilter = LINEAR; MipFilter = LINEAR;
MinFilter = LINEAR; MinFilter = LINEAR;
MagFilter = LINEAR; MagFilter = LINEAR;
@ -89,8 +103,8 @@ VS_OUTPUT_BUMP LandBumpVS(
Output.WorldPos = mul(vPos, g_World); Output.WorldPos = mul(vPos, g_World);
// Set dynamically generated tex coords // Set dynamically generated tex coords
Output.LandBumpTextureUV = mul(vPos, g_texGenMatrix0); Output.LandBumpTextureUV = mul(vPos, g_TexGenMatrix0);
Output.LandTextureUV = mul(vPos, g_texGenMatrix1); Output.LandTextureUV = mul(vPos, g_TexGenMatrix1);
//Output.ShoreTextureUV = mul(vPos, g_texGenMatrix2); //Output.ShoreTextureUV = mul(vPos, g_texGenMatrix2);
// Transform the normal from object space to world space // Transform the normal from object space to world space
@ -108,7 +122,7 @@ float4 LandBumpPS(VS_OUTPUT_BUMP input) : COLOR0
normalMap = saturate((float4)dot((float3)normal, (float3)normalcol)).xyz; normalMap = saturate((float4)dot((float3)normal, (float3)normalcol)).xyz;
float3 finalColor = 2.0 * (normalMap * (tex2D(g_LandTextureSampler, input.LandTextureUV)) + input.LandBumpDiffuse); float3 finalColor = 2.0 * (normalMap * (tex2D(g_LandTextureSampler, input.LandTextureUV)) + input.LandBumpDiffuse);
for (int i = 0; i < g_numPointLights; i++) for (int i = 0; i < g_PointLightCount; i++)
{ {
// Get light direction for this fragment // Get light direction for this fragment
float3 lightDir = normalize(input.WorldPos - g_PointLightPosition[i]); // per pixel diffuse lighting float3 lightDir = normalize(input.WorldPos - g_PointLightPosition[i]); // per pixel diffuse lighting
@ -117,7 +131,7 @@ float4 LandBumpPS(VS_OUTPUT_BUMP input) : COLOR0
float diffuseLighting = saturate(dot(input.Normal, -lightDir)); float diffuseLighting = saturate(dot(input.Normal, -lightDir));
// Introduce fall-off of light intensity // Introduce fall-off of light intensity
diffuseLighting *= (g_PointLightRangeSquared[i] / dot(g_PointLightPosition[i] - input.WorldPos, g_PointLightPosition[i] - input.WorldPos)); diffuseLighting *= (g_PointLightRange[i] / dot(g_PointLightPosition[i] - input.WorldPos, g_PointLightPosition[i] - input.WorldPos));
float4 diffuseColor = diffuseLighting * g_PointLightDiffuse[i]; float4 diffuseColor = diffuseLighting * g_PointLightDiffuse[i];
@ -167,7 +181,7 @@ VS_OUTPUT LandscapeVS(
Output.WorldPos = mul(vPos, g_World); Output.WorldPos = mul(vPos, g_World);
// Set dynamically generated tex coords // Set dynamically generated tex coords
Output.TextureUV = mul(vPos, g_texGenMatrix0); Output.TextureUV = mul(vPos, g_TexGenMatrix0);
return Output; return Output;
} }
@ -176,7 +190,7 @@ float4 LandscapePS(VS_OUTPUT input) : COLOR0
{ {
float4 finalColor = 0; float4 finalColor = 0;
for (int i = 0; i < g_numPointLights; i++) for (int i = 0; i < g_PointLightCount; i++)
{ {
// Get light direction for this fragment // Get light direction for this fragment
float3 lightDir = normalize(input.WorldPos - g_PointLightPosition[i]); // per pixel diffuse lighting float3 lightDir = normalize(input.WorldPos - g_PointLightPosition[i]); // per pixel diffuse lighting
@ -185,7 +199,7 @@ float4 LandscapePS(VS_OUTPUT input) : COLOR0
float diffuseLighting = saturate(dot(input.Normal, -lightDir)); float diffuseLighting = saturate(dot(input.Normal, -lightDir));
// Introduce fall-off of light intensity // Introduce fall-off of light intensity
diffuseLighting *= (g_PointLightRangeSquared[i] / dot(g_PointLightPosition[i] - input.WorldPos, g_PointLightPosition[i] - input.WorldPos)); diffuseLighting *= (g_PointLightRange[i] / dot(g_PointLightPosition[i] - input.WorldPos, g_PointLightPosition[i] - input.WorldPos));
float4 diffuseColor = diffuseLighting * g_PointLightDiffuse[i]; float4 diffuseColor = diffuseLighting * g_PointLightDiffuse[i];

View File

@ -1,16 +1,35 @@
#include "../fxh/SystemVariables.fxh" #include "../fxh/Constants.fxh"
#include "../fxh/Lighting.fxh"
sampler g_ObjTextureSampler = shared texture g_Texture0 : Texture0;
shared float4 g_DirectionalLightAmbientSum;
shared float4 g_DirectionalLightDiffuse[MAX_DIRECTIONAL_LIGHTS];
shared float3 g_DirectionalLightDirection[MAX_DIRECTIONAL_LIGHTS];
shared float4 g_DirectionalLightSpecular[MAX_DIRECTIONAL_LIGHTS];
shared int g_DirectionalLightCount;
shared Material g_Material;
shared float4x4 g_WorldViewProjection;
shared float4x4 g_WorldView;
shared float4x4 g_World;
shared float4 g_TextureFactor;
shared TextureBlendStage g_BlendStages[MAX_BLEND_STAGES];
shared int g_BlendStageCount;
shared float3 g_CameraPosition;
sampler g_ObjTextureSampler : register(s0) =
sampler_state sampler_state
{ {
Texture = <g_texture0>; Texture = <g_Texture0>;
MipFilter = LINEAR; MipFilter = LINEAR;
MinFilter = LINEAR; MinFilter = LINEAR;
MagFilter = LINEAR; MagFilter = LINEAR;
}; };
// ======================================================= // =======================================================
// Textured per pixel lighting // Pixel and vertex lighting techniques
// //
float4 CalculateDiffuse(float3 N, float3 L, float4 diffuseColor) float4 CalculateDiffuse(float3 N, float3 L, float4 diffuseColor)
@ -59,18 +78,18 @@ Lighting ComputeLighting(float3 worldPos, float3 N)
{ {
Lighting finalLighting = (Lighting)0; Lighting finalLighting = (Lighting)0;
for (int i = 0; i < g_numDirectionalLights; i++) for (int i = 0; i < g_DirectionalLightCount; i++)
{ {
Lighting lighting = DoDirectionalLight(worldPos, N, i); Lighting lighting = DoDirectionalLight(worldPos, N, i);
finalLighting.Diffuse += lighting.Diffuse; finalLighting.Diffuse += lighting.Diffuse;
finalLighting.Specular += lighting.Specular; finalLighting.Specular += lighting.Specular;
} }
float4 ambient = g_Material.Ambient * g_DirectionalAmbientLightSum; float4 ambient = g_Material.Ambient * g_DirectionalLightAmbientSum;
float4 diffuse = g_Material.Diffuse * finalLighting.Diffuse; float4 diffuse = g_Material.Diffuse * finalLighting.Diffuse;
float4 specular = g_Material.Specular * finalLighting.Specular; float4 specular = g_Material.Specular * finalLighting.Specular;
finalLighting.Diffuse = saturate(ambient + diffuse); finalLighting.Diffuse = saturate(ambient + diffuse + g_Material.Emissive);
finalLighting.Specular = saturate(specular); finalLighting.Specular = saturate(specular);
return finalLighting; return finalLighting;
@ -104,7 +123,7 @@ float4 GetColorArg(int colorArg, float4 textureColor, float4 diffuseColor)
float4 result; float4 result;
if (colorArg == D3DTA_TEXTURE) result = textureColor; if (colorArg == D3DTA_TEXTURE) result = textureColor;
else if (colorArg == D3DTA_DIFFUSE) result = diffuseColor; else if (colorArg == D3DTA_DIFFUSE) result = diffuseColor;
else if (colorArg == D3DTA_TFACTOR) result = g_textureFactor; else if (colorArg == D3DTA_TFACTOR) result = g_TextureFactor;
else result = float4(1.f, 1.f, 1.f, 1.f); else result = float4(1.f, 1.f, 1.f, 1.f);
return result; return result;
@ -112,8 +131,8 @@ float4 GetColorArg(int colorArg, float4 textureColor, float4 diffuseColor)
float4 Modulate(int stageIndex, float4 textureColor, float4 diffuseColor, float factor) float4 Modulate(int stageIndex, float4 textureColor, float4 diffuseColor, float factor)
{ {
float4 left = GetColorArg(g_blendStages[stageIndex].colorArg1, textureColor, diffuseColor); float4 left = GetColorArg(g_BlendStages[stageIndex].colorArg1, textureColor, diffuseColor);
float4 right = GetColorArg(g_blendStages[stageIndex].colorArg2, textureColor, diffuseColor); float4 right = GetColorArg(g_BlendStages[stageIndex].colorArg2, textureColor, diffuseColor);
return (left * right) * factor; return (left * right) * factor;
} }
@ -121,9 +140,9 @@ float4 Modulate(int stageIndex, float4 textureColor, float4 diffuseColor, float
float4 ProcessStages(float4 textureColor, float4 diffuseColor) float4 ProcessStages(float4 textureColor, float4 diffuseColor)
{ {
float4 output = 0; float4 output = 0;
for (int i = 0; i < g_numBlendStages; i++) for (int i = 0; i < g_BlendStageCount; i++)
{ {
if (g_blendStages[i].colorOp == D3DTOP_MODULATE4X) if (g_BlendStages[i].colorOp == D3DTOP_MODULATE4X)
{ {
output += Modulate(i, textureColor, diffuseColor, 4.0f); output += Modulate(i, textureColor, diffuseColor, 4.0f);
} }
@ -139,7 +158,6 @@ float4 ProcessStages(float4 textureColor, float4 diffuseColor)
struct PixelLightingPSOutput struct PixelLightingPSOutput
{ {
float4 Diffuse : COLOR0; float4 Diffuse : COLOR0;
float4 Specular : COLOR1;
}; };
PixelLightingPSOutput PixelLightingPS(PixelLightingVSOutput input) PixelLightingPSOutput PixelLightingPS(PixelLightingVSOutput input)
@ -149,8 +167,7 @@ PixelLightingPSOutput PixelLightingPS(PixelLightingVSOutput input)
Lighting lighting = ComputeLighting(input.WorldPos, input.Normal); Lighting lighting = ComputeLighting(input.WorldPos, input.Normal);
PixelLightingPSOutput output; PixelLightingPSOutput output;
output.Diffuse = ProcessStages(color, lighting.Diffuse); output.Diffuse = ProcessStages(color, lighting.Diffuse) + lighting.Specular;
output.Specular = color * lighting.Specular;
return output; return output;
} }
@ -163,6 +180,53 @@ technique PixelLighting
} }
} }
struct VertexLightingVSOutput
{
float4 Pos : POSITION;
float4 Diffuse : COLOR0;
float4 Specular : COLOR1;
float2 Tex0 : TEXCOORD0;
float4 BumpColor : TEXCOORD1;
float Fog : FOG;
};
float fFogStart = 25.f;
float fFogEnd = 1525.f;
VertexLightingVSOutput VertexLightingVS(
float4 vPosition : POSITION0,
float3 vNormal : NORMAL0,
float4 color : COLOR0,
float2 tc : TEXCOORD0)
{
VertexLightingVSOutput output;
output.Pos = mul(vPosition, g_WorldViewProjection);
output.Tex0 = tc;
float4 worldPos = mul(vPosition, g_World);
float3 normal = mul(normalize(vNormal), (float3x3)g_World);
Lighting lighting = ComputeLighting(worldPos, normal);
output.Diffuse = lighting.Diffuse;
output.Specular = lighting.Specular;
output.BumpColor = color;
float3 P = mul(vPosition, g_WorldView);
float d = length(P);
output.Fog = saturate((fFogEnd - d) / (fFogEnd - fFogStart));
return output;
}
technique VertexLighting
{
pass P0
{
VertexShader = compile vs_3_0 VertexLightingVS();
}
}
// ======================================================= // =======================================================
// Color per vertex // Color per vertex
// //
@ -181,9 +245,6 @@ float4 ColorPerVertexPS(ColorPerVertexVSOutput input) : COLOR0
return color; return color;
} }
float fFogStart = 25.f;
float fFogEnd = 1525.f;
ColorPerVertexVSOutput ColorPerVertexVS( ColorPerVertexVSOutput ColorPerVertexVS(
float4 vPosition : POSITION0, float4 vPosition : POSITION0,
float2 tc : TEXCOORD0, float2 tc : TEXCOORD0,
@ -200,7 +261,7 @@ ColorPerVertexVSOutput ColorPerVertexVS(
float3 P = mul(vPosition, g_WorldView); //position in view space float3 P = mul(vPosition, g_WorldView); //position in view space
float d = length(P); float d = length(P);
output.Fog = 0.0; //saturate((fFogEnd - d) / (fFogEnd - fFogStart)); output.Fog = saturate((fFogEnd - d) / (fFogEnd - fFogStart));
return output; return output;
} }

View File

@ -4,8 +4,6 @@
// Ocean water reflection shader. // Ocean water reflection shader.
//-------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------
#include "../fxh/SystemVariables.fxh"
/* Original asm code: /* Original asm code:
ps_1_1 ps_1_1
tex t0 tex t0
@ -13,6 +11,9 @@
lrp r0, -v0.w, t0, t1 // lrp = linear interpolate lrp r0, -v0.w, t0, t1 // lrp = linear interpolate
*/ */
shared texture g_Texture0;
shared texture g_Texture1;
struct PS_INPUT struct PS_INPUT
{ {
float4 color : COLOR0; float4 color : COLOR0;
@ -84,8 +85,8 @@ technique t0
{ {
pass p0 pass p0
{ {
Texture[0] = <g_texture0>; // Seabed texture Texture[0] = <g_Texture0>; // Seabed texture
Texture[1] = <g_texture1>; // Environment texture Texture[1] = <g_Texture1>; // Environment texture
// All of these constants are set by the game engine before drawing the shader // All of these constants are set by the game engine before drawing the shader
// Each constant register (c# in the asm code) has 4 floating point values // Each constant register (c# in the asm code) has 4 floating point values

View File

@ -5,12 +5,16 @@
// the original fixed-function water rendering behavior. // the original fixed-function water rendering behavior.
//-------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------
#include "../fxh/SystemVariables.fxh" //#include "../fxh/SystemVariables.fxh"
shared texture g_Texture0;
shared float4x4 g_WorldViewProjection;
shared float4 g_TextureFactor;
sampler2D g_WaterTextureSampler = sampler2D g_WaterTextureSampler =
sampler_state sampler_state
{ {
Texture = <g_texture0>; Texture = <g_Texture0>;
}; };
struct VS_OUTPUT struct VS_OUTPUT
@ -42,8 +46,8 @@ VS_OUTPUT RenderSceneVS(float4 inPos : POSITION,
float4 RenderScenePS(VS_OUTPUT input) : COLOR0 float4 RenderScenePS(VS_OUTPUT input) : COLOR0
{ {
float4 texel = tex2D(g_WaterTextureSampler, input.TextureUV); float4 texel = tex2D(g_WaterTextureSampler, input.TextureUV);
float4 result = saturate(texel + (1 - texel) * g_textureFactor); // equivalent to saturate((texel + g_TextureFactor) - (texel * g_TextureFactor)); float4 result = saturate(texel + (1 - texel) * g_TextureFactor); // equivalent to saturate((texel + g_TextureFactor) - (texel * g_TextureFactor));
result.a = input.Color.a * g_textureFactor.a; result.a = input.Color.a * g_TextureFactor.a;
return result; return result;
} }

View File

@ -1,33 +0,0 @@
#include "Constants.fxh"
#include "Lighting.fxh"
// Lighting
shared float4 g_DirectionalAmbientLightSum : DirectionalLightAmbientSum;
shared float4 g_DirectionalLightDiffuse[MAX_DIRECTIONAL_LIGHTS] : DirectionalLightDiffuse;
shared float3 g_DirectionalLightDirection[MAX_DIRECTIONAL_LIGHTS] : DirectionalLightDirection;
shared float4 g_DirectionalLightSpecular[MAX_DIRECTIONAL_LIGHTS] : DirectionalLightSpecular;
shared int g_numDirectionalLights : DirectionalLightCount;
shared float4 g_PointLightDiffuse[MAX_LIGHTS] : PointLightDiffuse;
shared float3 g_PointLightPosition[MAX_LIGHTS] : PointLightPosition;
shared float g_PointLightRangeSquared[MAX_LIGHTS] : PointLightRange;
shared int g_numPointLights : PointLightCount;
shared Material g_Material : Material;
// Camera
shared float3 g_CameraPosition : CameraPosition;
// Transforms
shared float4x4 g_WorldViewProjection : WorldViewProjection;
shared float4x4 g_WorldView : WorldView;
shared float4x4 g_World : World;
// Texturing
shared texture g_texture0 : Texture0;
shared texture g_texture1 : Texture1;
shared texture g_texture2 : Texture2;
shared texture g_texture3 : Texture3;
shared float4x4 g_texGenMatrix0 : TexGenTransform0;
shared float4x4 g_texGenMatrix1 : TexGenTransform1;
shared float4 g_textureFactor : TextureFactor;
shared TextureBlendStage g_blendStages[MAX_BLEND_STAGES] : BlendStages;
shared int g_numBlendStages : BlendStageCount;