summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAurélien Brooke <aurelien@bahiasoft.fr>2023-12-29 12:11:34 +0100
committerAurélien Brooke <aurelien@bahiasoft.fr>2024-01-13 15:36:39 +0000
commit491e25e100f5eace863a6cab4b0fc5a508cae7bf (patch)
treea58ffba907bfc3c80331dade245a7e3f9c7fdbbf /src
parentf7a3d25006ff2c7c966aacdcdd7214a2ea6221d8 (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 Pick-to: 6.7 Change-Id: I0a156eb61e0f57ff4c0d6755ff8fd750877bf33d Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'src')
-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);