summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAurélien Brooke <aurelien@bahiasoft.fr>2023-12-29 12:11:34 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2024-01-13 17:17:28 +0000
commit9cc5257312ca181f719b3331928a26733c8e9b4a (patch)
treed2690470260b10d29202f791ea5b19ff03eb1dd7
parent2cf30109688fdfc420b85324ad417462a427fa9b (diff)
Fix ambient color contribution in Phong shader
The ambient color is not visible if the diffuse color is black. The ambientColor contribution is wrongly multiplied by diffuse.rgb instead of ambient.rgb. Fix the issue by adding ambientColor to the adsModel() function, and multiplying it by ambient.rgb. [ChangeLog][QPhongMaterial] Fix ambient color contribution Fixes: QTBUG-77665 Fixes: QTBUG-120241 Change-Id: I0a156eb61e0f57ff4c0d6755ff8fd750877bf33d Reviewed-by: Mike Krus <mike.krus@kdab.com> (cherry picked from commit 491e25e100f5eace863a6cab4b0fc5a508cae7bf) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/extras/shaders/es2/phong.inc.frag12
-rw-r--r--src/extras/shaders/es2/phong.inc.frag10012
-rw-r--r--src/extras/shaders/gl3/phong.inc.frag14
-rw-r--r--src/extras/shaders/rhi/phong.inc.frag14
4 files changed, 34 insertions, 18 deletions
diff --git a/src/extras/shaders/es2/phong.inc.frag b/src/extras/shaders/es2/phong.inc.frag
index a9d933e69..22fb5c2f6 100644
--- a/src/extras/shaders/es2/phong.inc.frag
+++ b/src/extras/shaders/es2/phong.inc.frag
@@ -4,8 +4,10 @@
#pragma include light.inc.frag
void adsModel(const in FP vec3 vpos, const in FP vec3 vnormal, const in FP vec3 vview, const in FP float shininess,
+ out FP vec3 ambientColor,
out FP vec3 diffuseColor, out FP vec3 specularColor)
{
+ ambientColor = vec3(0.0);
diffuseColor = vec3(0.0);
specularColor = vec3(0.0);
@@ -58,6 +60,7 @@ void adsModel(const in FP vec3 vpos, const in FP vec3 vnormal, const in FP vec3
specular = normFactor * pow( max( dot( r, vview ), 0.0 ), shininess );
}
+ ambientColor += att * light.intensity * 1.0 * light.color;
diffuseColor += att * light.intensity * diffuse * light.color;
specularColor += att * light.intensity * specular * light.color;
}
@@ -72,11 +75,12 @@ FP vec4 phongFunction(const in FP vec4 ambient,
const in FP vec3 worldNormal)
{
// Calculate the lighting model, keeping the specular component separate
- FP vec3 diffuseColor, specularColor;
- adsModel(worldPosition, worldNormal, worldView, shininess, diffuseColor, specularColor);
+ FP vec3 ambientColor, diffuseColor, specularColor;
+ adsModel(worldPosition, worldNormal, worldView, shininess, ambientColor, diffuseColor, specularColor);
- // Combine spec with ambient+diffuse for final fragment color
- FP vec3 color = (ambient.rgb + diffuseColor) * diffuse.rgb
+ // Combine ambient, diffuse and specular components for final fragment color
+ FP vec3 color = ambientColor * ambient.rgb
+ + diffuseColor * diffuse.rgb
+ specularColor * specular.rgb;
return vec4(color, diffuse.a);
diff --git a/src/extras/shaders/es2/phong.inc.frag100 b/src/extras/shaders/es2/phong.inc.frag100
index 7d395dd4b..7b651f904 100644
--- a/src/extras/shaders/es2/phong.inc.frag100
+++ b/src/extras/shaders/es2/phong.inc.frag100
@@ -4,8 +4,10 @@
#pragma include light.inc.frag
void adsModel(const in FP vec3 vpos, const in FP vec3 vnormal, const in FP vec3 vview, const in FP float shininess,
+ out FP vec3 ambientColor,
out FP vec3 diffuseColor, out FP vec3 specularColor)
{
+ ambientColor = vec3(0.0);
diffuseColor = vec3(0.0);
specularColor = vec3(0.0);
@@ -75,6 +77,7 @@ void adsModel(const in FP vec3 vpos, const in FP vec3 vnormal, const in FP vec3
specular = normFactor * pow( max( dot( r, vview ), 0.0 ), shininess );
}
+ ambientColor += att * lights[1].intensity * 1.0 * lights[1].color;
diffuseColor += att * lights[1].intensity * diffuse * lights[1].color;
specularColor += att * specular;
}
@@ -88,11 +91,12 @@ FP vec4 phongFunction(const in FP vec4 ambient,
const in FP vec3 worldNormal)
{
// Calculate the lighting model, keeping the specular component separate
- FP vec3 diffuseColor, specularColor;
- adsModel(worldPosition, worldNormal, worldView, shininess, diffuseColor, specularColor);
+ FP vec3 ambientColor, diffuseColor, specularColor;
+ adsModel(worldPosition, worldNormal, worldView, shininess, ambientColor, diffuseColor, specularColor);
- // Combine spec with ambient+diffuse for final fragment color
- FP vec3 color = (ambient.rgb + diffuseColor) * diffuse.rgb
+ // Combine ambient, diffuse and specular components for final fragment color
+ FP vec3 color = ambientColor * ambient.rgb
+ + diffuseColor * diffuse.rgb
+ specularColor * specular.rgb;
return vec4(color, diffuse.a);
diff --git a/src/extras/shaders/gl3/phong.inc.frag b/src/extras/shaders/gl3/phong.inc.frag
index f2d1edd68..0bcd1dd1f 100644
--- a/src/extras/shaders/gl3/phong.inc.frag
+++ b/src/extras/shaders/gl3/phong.inc.frag
@@ -7,9 +7,11 @@ void adsModel(const in vec3 worldPos,
const in vec3 worldNormal,
const in vec3 worldView,
const in float shininess,
+ out vec3 ambientColor,
out vec3 diffuseColor,
out vec3 specularColor)
{
+ ambientColor = vec3(0.0);
diffuseColor = vec3(0.0);
specularColor = vec3(0.0);
@@ -65,7 +67,8 @@ void adsModel(const in vec3 worldPos,
specular = normFactor * pow(max(dot(r, worldView), 0.0), shininess);
}
- // Accumulate the diffuse and specular contributions
+ // Accumulate the ambient, diffuse and specular contributions
+ ambientColor += att * lights[i].intensity * 1.0 * lights[i].color;
diffuseColor += att * lights[i].intensity * diffuse * lights[i].color;
specularColor += att * lights[i].intensity * specular * lights[i].color;
}
@@ -80,11 +83,12 @@ vec4 phongFunction(const in vec4 ambient,
const in vec3 worldNormal)
{
// Calculate the lighting model, keeping the specular component separate
- vec3 diffuseColor, specularColor;
- adsModel(worldPosition, worldNormal, worldView, shininess, diffuseColor, specularColor);
+ vec3 ambientColor, diffuseColor, specularColor;
+ adsModel(worldPosition, worldNormal, worldView, shininess, ambientColor, diffuseColor, specularColor);
- // Combine spec with ambient+diffuse for final fragment color
- vec3 color = (ambient.rgb + diffuseColor) * diffuse.rgb
+ // Combine ambient, diffuse and specular components for final fragment color
+ vec3 color = ambientColor * ambient.rgb
+ + diffuseColor * diffuse.rgb
+ specularColor * specular.rgb;
return vec4(color, diffuse.a);
diff --git a/src/extras/shaders/rhi/phong.inc.frag b/src/extras/shaders/rhi/phong.inc.frag
index f2d1edd68..0bcd1dd1f 100644
--- a/src/extras/shaders/rhi/phong.inc.frag
+++ b/src/extras/shaders/rhi/phong.inc.frag
@@ -7,9 +7,11 @@ void adsModel(const in vec3 worldPos,
const in vec3 worldNormal,
const in vec3 worldView,
const in float shininess,
+ out vec3 ambientColor,
out vec3 diffuseColor,
out vec3 specularColor)
{
+ ambientColor = vec3(0.0);
diffuseColor = vec3(0.0);
specularColor = vec3(0.0);
@@ -65,7 +67,8 @@ void adsModel(const in vec3 worldPos,
specular = normFactor * pow(max(dot(r, worldView), 0.0), shininess);
}
- // Accumulate the diffuse and specular contributions
+ // Accumulate the ambient, diffuse and specular contributions
+ ambientColor += att * lights[i].intensity * 1.0 * lights[i].color;
diffuseColor += att * lights[i].intensity * diffuse * lights[i].color;
specularColor += att * lights[i].intensity * specular * lights[i].color;
}
@@ -80,11 +83,12 @@ vec4 phongFunction(const in vec4 ambient,
const in vec3 worldNormal)
{
// Calculate the lighting model, keeping the specular component separate
- vec3 diffuseColor, specularColor;
- adsModel(worldPosition, worldNormal, worldView, shininess, diffuseColor, specularColor);
+ vec3 ambientColor, diffuseColor, specularColor;
+ adsModel(worldPosition, worldNormal, worldView, shininess, ambientColor, diffuseColor, specularColor);
- // Combine spec with ambient+diffuse for final fragment color
- vec3 color = (ambient.rgb + diffuseColor) * diffuse.rgb
+ // Combine ambient, diffuse and specular components for final fragment color
+ vec3 color = ambientColor * ambient.rgb
+ + diffuseColor * diffuse.rgb
+ specularColor * specular.rgb;
return vec4(color, diffuse.a);