summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorJMC47 <JMC4789@gmail.com>2021-09-09 17:58:35 -0400
committerGitHub <noreply@github.com>2021-09-09 17:58:35 -0400
commit05f86b9f5b6e7f65aaefcc29e348cc2628bed34f (patch)
tree080af508310c59107fa30a94d5d0348dd0215750 /Source/Core
parentb4787cdbd353595b8080c93d816490610ec37573 (diff)
parentc3dec343918ff44e90886daf71a6bf0c49033de1 (diff)
Merge pull request #10012 from Pokechu22/thps4-green-sky
UberShaderVertex: Fix Tony Hawk Pro Skater 4
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/VideoCommon/UberShaderVertex.cpp55
-rw-r--r--Source/Core/VideoCommon/VertexShaderGen.cpp45
2 files changed, 50 insertions, 50 deletions
diff --git a/Source/Core/VideoCommon/UberShaderVertex.cpp b/Source/Core/VideoCommon/UberShaderVertex.cpp
index 70b434b786..90871a45eb 100644
--- a/Source/Core/VideoCommon/UberShaderVertex.cpp
+++ b/Source/Core/VideoCommon/UberShaderVertex.cpp
@@ -215,20 +215,36 @@ ShaderCode GenVertexShader(APIType api_type, const ShaderHostConfig& host_config
if (num_texgen > 0)
GenVertexShaderTexGens(api_type, num_texgen, out);
+ out.Write("// The number of colors available to TEV is determined by numColorChans.\n"
+ "// We have to provide the fields to match the interface, so set to zero\n"
+ "// if it's not enabled.\n");
+
+ const char* color_prefix;
+ if (per_pixel_lighting)
+ {
+ out.Write("\n// Since per-pixel lighting is enabled, the vertex colors are passed through\n"
+ "// unmodified so we can evaluate the lighting in the pixel shader.\n");
+ color_prefix = "vertex_color_";
+ }
+ else
+ {
+ color_prefix = "rawcolor";
+ }
+
out.Write("if (xfmem_numColorChans == 0u) {{\n"
- " if ((components & {}u) != 0u)\n"
- " o.colors_0 = rawcolor0;\n"
+ " if ((components & {}u) != 0u) // VB_HAS_COL0\n"
+ " o.colors_0 = {}0;\n"
" else\n"
- " o.colors_1 = float4(1.0, 1.0, 1.0, 1.0);\n"
+ " o.colors_0 = float4(1.0, 1.0, 1.0, 1.0);\n"
"}}\n",
- VB_HAS_COL0);
- out.Write("if (xfmem_numColorChans < 2u) {{\n"
- " if ((components & {}u) != 0u)\n"
- " o.colors_0 = rawcolor1;\n"
+ VB_HAS_COL0, color_prefix);
+ out.Write("if (xfmem_numColorChans <= 1u) {{\n"
+ " if ((components & {}u) != 0u) // VB_HAS_COL1\n"
+ " o.colors_1 = {}1;\n"
" else\n"
- " o.colors_1 = float4(1.0, 1.0, 1.0, 1.0);\n"
+ " o.colors_1 = o.colors_0;\n"
"}}\n",
- VB_HAS_COL1);
+ VB_HAS_COL1, color_prefix);
if (!host_config.fast_depth_calc)
{
@@ -239,26 +255,7 @@ ShaderCode GenVertexShader(APIType api_type, const ShaderHostConfig& host_config
if (per_pixel_lighting)
{
out.Write("o.Normal = _norm0;\n"
- "o.WorldPos = pos.xyz;\n"
- "// Pass through the vertex colors unmodified so we can evaluate the lighting\n"
- "// in the same manner.\n");
- out.Write("if ((components & {}u) != 0u) // VB_HAS_COL0\n"
- " o.colors_0 = vertex_color_0;\n",
- VB_HAS_COL0);
- out.Write("if ((components & {}u) != 0u) // VB_HAS_COL1\n"
- " o.colors_1 = vertex_color_1;\n",
- VB_HAS_COL1);
- }
- else
- {
- out.Write("// The number of colors available to TEV is determined by numColorChans.\n"
- "// We have to provide the fields to match the interface, so set to zero\n"
- "// if it's not enabled.\n"
- "if (xfmem_numColorChans == 0u)\n"
- " o.colors_0 = float4(0.0, 0.0, 0.0, 0.0);\n"
- "if (xfmem_numColorChans <= 1u)\n"
- " o.colors_1 = float4(0.0, 0.0, 0.0, 0.0);\n"
- "\n");
+ "o.WorldPos = pos.xyz;\n");
}
// If we can disable the incorrect depth clipping planes using depth clamping, then we can do
diff --git a/Source/Core/VideoCommon/VertexShaderGen.cpp b/Source/Core/VideoCommon/VertexShaderGen.cpp
index 25fb5a06c5..5795597ff7 100644
--- a/Source/Core/VideoCommon/VertexShaderGen.cpp
+++ b/Source/Core/VideoCommon/VertexShaderGen.cpp
@@ -443,19 +443,38 @@ ShaderCode GenerateVertexShaderCode(APIType api_type, const ShaderHostConfig& ho
out.Write("}}\n");
}
+ // The number of colors available to TEV is determined by numColorChans.
+ // We have to provide the fields to match the interface, so set to zero if it's not enabled.
+
+ // When per-pixel lighting is enabled, the vertex colors are passed through unmodified so we can
+ // evaluate the lighting in the same manner in the pixel shader.
if (uid_data->numColorChans == 0)
{
if ((uid_data->components & VB_HAS_COL0) != 0)
- out.Write("o.colors_0 = rawcolor0;\n");
+ {
+ if (per_pixel_lighting)
+ out.Write("o.colors_0 = vertex_color_0;\n");
+ else
+ out.Write("o.colors_0 = rawcolor0;\n");
+ }
else
- out.Write("o.colors_0 = float4(1.0, 1.0, 1.0, 1.0);\n");
+ {
+ out.Write("o.colors_0 = float4(0.0, 0.0, 0.0, 0.0);\n");
+ }
}
- if (uid_data->numColorChans < 2)
+ if (uid_data->numColorChans <= 1)
{
if ((uid_data->components & VB_HAS_COL1) != 0)
- out.Write("o.colors_1 = rawcolor1;\n");
+ {
+ if (per_pixel_lighting)
+ out.Write("o.colors_1 = vertex_color_1;\n");
+ else
+ out.Write("o.colors_1 = rawcolor1;\n");
+ }
else
- out.Write("o.colors_1 = o.colors_0;\n");
+ {
+ out.Write("o.colors_1 = float4(0.0, 0.0, 0.0, 0.0);\n");
+ }
}
// clipPos/w needs to be done in pixel shader, not here
@@ -466,22 +485,6 @@ ShaderCode GenerateVertexShaderCode(APIType api_type, const ShaderHostConfig& ho
{
out.Write("o.Normal = _norm0;\n"
"o.WorldPos = pos.xyz;\n");
-
- // Pass through the vertex colors unmodified so we can evaluate the lighting in the same manner.
- if ((uid_data->components & VB_HAS_COL0) != 0)
- out.Write("o.colors_0 = vertex_color_0;\n");
-
- if ((uid_data->components & VB_HAS_COL1) != 0)
- out.Write("o.colors_1 = vertex_color_1;\n");
- }
- else
- {
- // The number of colors available to TEV is determined by numColorChans.
- // We have to provide the fields to match the interface, so set to zero if it's not enabled.
- if (uid_data->numColorChans == 0)
- out.Write("o.colors_0 = float4(0.0, 0.0, 0.0, 0.0);\n");
- if (uid_data->numColorChans <= 1)
- out.Write("o.colors_1 = float4(0.0, 0.0, 0.0, 0.0);\n");
}
// If we can disable the incorrect depth clipping planes using depth clamping, then we can do