summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJere Tuliniemi <jere.tuliniemi@qt.io>2018-04-19 15:35:26 +0300
committerLaszlo Agocs <laszlo.agocs@qt.io>2018-04-20 09:30:49 +0000
commit26063241035dbc9a5677ff00788398f381e9a407 (patch)
tree9381774d365833700650f97c3ff3d8c57e9c0132
parent5b616b9ff79e57f7d8e35660e3f5c7f729ddce74 (diff)
Add roughness map to the standard material
Standard material shaders can now sample a roughness map for specular roughness. Task-number: QT3DS-1445 Change-Id: Ia39eba5c80edb0ee26f2b42b5694b60e9f45debf Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io>
-rw-r--r--src/runtime/q3dsscenemanager.cpp9
-rw-r--r--src/runtime/q3dsscenemanager_p.h1
-rw-r--r--src/runtime/q3dsuippresentation.cpp13
-rw-r--r--src/runtime/q3dsuippresentation_p.h4
-rw-r--r--src/runtime/shadergenerator/q3dsdefaultvertexpipeline.cpp29
-rw-r--r--tests/scenes/barrel/Barrel_roughness.uip60
-rw-r--r--tests/scenes/barrel/maps/OpenfootageNET_Streetautumn-512.pngbin0 -> 393468 bytes
-rw-r--r--tests/scenes/barrel/maps/roughness.pngbin0 -> 9257 bytes
8 files changed, 107 insertions, 9 deletions
diff --git a/src/runtime/q3dsscenemanager.cpp b/src/runtime/q3dsscenemanager.cpp
index 89c80a1..7f01c26 100644
--- a/src/runtime/q3dsscenemanager.cpp
+++ b/src/runtime/q3dsscenemanager.cpp
@@ -4666,6 +4666,12 @@ QVector<Qt3DRender::QParameter *> Q3DSSceneManager::prepareDefaultMaterial(Q3DSD
static_cast<Q3DSImageAttached *>(m->specularMap()->attached())->referencingDefaultMaterials.insert(m);
}
+ if (m->roughnessMap()) {
+ prepareTextureParameters(data->roughnessMapParams, QLatin1String("roughnessMap"), m->roughnessMap());
+ params.append(data->roughnessMapParams.parameters());
+ static_cast<Q3DSImageAttached *>(m->roughnessMap()->attached())->referencingDefaultMaterials.insert(m);
+ }
+
if (m->bumpMap()) {
prepareTextureParameters(data->bumpMapParams, QLatin1String("bumpMap"), m->bumpMap());
params.append(data->bumpMapParams.parameters());
@@ -4824,6 +4830,9 @@ void Q3DSSceneManager::updateDefaultMaterial(Q3DSDefaultMaterial *m, Q3DSReferen
if (m->specularMap())
updateTextureParameters(data->specularMapParams, m->specularMap());
+ if (m->roughnessMap())
+ updateTextureParameters(data->roughnessMapParams, m->roughnessMap());
+
if (m->bumpMap())
updateTextureParameters(data->bumpMapParams, m->bumpMap());
diff --git a/src/runtime/q3dsscenemanager_p.h b/src/runtime/q3dsscenemanager_p.h
index 44f8b67..2b33ebe 100644
--- a/src/runtime/q3dsscenemanager_p.h
+++ b/src/runtime/q3dsscenemanager_p.h
@@ -483,6 +483,7 @@ public:
Q3DSTextureParameters diffuseMap3Params;
Q3DSTextureParameters specularReflectionParams;
Q3DSTextureParameters specularMapParams;
+ Q3DSTextureParameters roughnessMapParams;
Q3DSTextureParameters bumpMapParams;
Q3DSTextureParameters normalMapParams;
Q3DSTextureParameters displacementMapParams;
diff --git a/src/runtime/q3dsuippresentation.cpp b/src/runtime/q3dsuippresentation.cpp
index 0682b31..a06cd9c 100644
--- a/src/runtime/q3dsuippresentation.cpp
+++ b/src/runtime/q3dsuippresentation.cpp
@@ -1765,6 +1765,9 @@ void Q3DSDefaultMaterial::setProps(const V &attrs, PropSetFlags flags)
parseProperty(attrs, flags, typeName, QStringLiteral("specularmodel"), &m_specularModel);
parseProperty(attrs, flags, typeName, QStringLiteral("specularroughness"), &m_specularRoughness);
+
+ parseImageProperty(attrs, flags, typeName, QStringLiteral("roughnessmap"), &m_roughnessMap_unresolved);
+
parseProperty(attrs, flags, typeName, QStringLiteral("fresnelPower"), &m_fresnelPower);
parseProperty(attrs, flags, typeName, QStringLiteral("ior"), &m_ior);
@@ -1818,6 +1821,7 @@ void Q3DSDefaultMaterial::resolveReferences(Q3DSUipPresentation &pres)
resolveRef(m_diffuseMap3_unresolved, Q3DSGraphObject::Image, &m_diffuseMap3, pres);
resolveRef(m_specularReflection_unresolved, Q3DSGraphObject::Image, &m_specularReflection, pres);
resolveRef(m_specularMap_unresolved, Q3DSGraphObject::Image, &m_specularMap, pres);
+ resolveRef(m_roughnessMap_unresolved, Q3DSGraphObject::Image, &m_roughnessMap, pres);
resolveRef(m_bumpMap_unresolved, Q3DSGraphObject::Image, &m_bumpMap, pres);
resolveRef(m_normalMap_unresolved, Q3DSGraphObject::Image, &m_normalMap, pres);
resolveRef(m_displacementMap_unresolved, Q3DSGraphObject::Image, &m_displacementMap, pres);
@@ -1849,7 +1853,7 @@ QStringList Q3DSDefaultMaterial::propertyNames() const
<< QLatin1String("diffusemap") << QLatin1String("diffusemap2") << QLatin1String("diffusemap3")
<< QLatin1String("specularreflection") << QLatin1String("speculartint") << QLatin1String("specularamount")
<< QLatin1String("specularmap") << QLatin1String("specularmodel")
- << QLatin1String("specularroughness") << QLatin1String("fresnelpower") << QLatin1String("ior") << QLatin1String("bumpmap")
+ << QLatin1String("specularroughness") << QLatin1String("roughnessmap") << QLatin1String("fresnelpower") << QLatin1String("ior") << QLatin1String("bumpmap")
<< QLatin1String("normalmap") << QLatin1String("bumpamount") << QLatin1String("displacementmap")
<< QLatin1String("displaceamount") << QLatin1String("opacity") << QLatin1String("opacitymap") << QLatin1String("emissivecolor")
<< QLatin1String("emissivepower") << QLatin1String("emissivemap") << QLatin1String("emissivemap2")
@@ -1864,7 +1868,7 @@ QVariantList Q3DSDefaultMaterial::propertyValues() const
QVariantList s = Q3DSGraphObject::propertyValues();
s << m_shaderLighting << m_blendMode << m_diffuse << m_diffuseMap_unresolved << m_diffuseMap2_unresolved << m_diffuseMap3_unresolved
<< m_specularReflection_unresolved << m_specularTint << m_specularAmount << m_specularMap_unresolved << m_specularModel
- << m_specularRoughness << m_fresnelPower << m_ior << m_bumpMap_unresolved << m_normalMap_unresolved << m_bumpAmount << m_displacementMap_unresolved
+ << m_specularRoughness << m_roughnessMap_unresolved << m_fresnelPower << m_ior << m_bumpMap_unresolved << m_normalMap_unresolved << m_bumpAmount << m_displacementMap_unresolved
<< m_displaceAmount << m_opacity << m_opacityMap_unresolved << m_emissiveColor << m_emissivePower << m_emissiveMap_unresolved << m_emissiveMap2_unresolved
<< m_translucencyMap_unresolved << m_translucentFalloff << m_diffuseLightWrap
<< m_lightmapIndirectMap_unresolved << m_lightmapRadiosityMap_unresolved << m_lightmapShadowMap_unresolved << m_lightProbe_unresolved;
@@ -1931,6 +1935,11 @@ Q3DSPropertyChange Q3DSDefaultMaterial::setSpecularRoughness(float v)
return createPropSetter(m_specularRoughness, v, "specularroughness");
}
+Q3DSPropertyChange Q3DSDefaultMaterial::setRoughnessMap(Q3DSImage *v)
+{
+ return createObjectRefSetter(MEMBER_PAIR(m_roughnessMap), v, "roughnessmap");
+}
+
Q3DSPropertyChange Q3DSDefaultMaterial::setFresnelPower(float v)
{
return createPropSetter(m_fresnelPower, v, "fresnelPower");
diff --git a/src/runtime/q3dsuippresentation_p.h b/src/runtime/q3dsuippresentation_p.h
index ae1a867..d490d9b 100644
--- a/src/runtime/q3dsuippresentation_p.h
+++ b/src/runtime/q3dsuippresentation_p.h
@@ -1572,6 +1572,7 @@ public:
Q3DSImage *specularMap() const { return m_specularMap; }
SpecularModel specularModel() const { return m_specularModel; }
float specularRoughness() const { return m_specularRoughness; }
+ Q3DSImage *roughnessMap() const { return m_roughnessMap; }
float fresnelPower() const { return m_fresnelPower; }
float ior() const { return m_ior; }
Q3DSImage *bumpMap() const { return m_bumpMap; }
@@ -1607,6 +1608,7 @@ public:
Q3DSPropertyChange setSpecularMap(Q3DSImage *v);
Q3DSPropertyChange setSpecularModel(SpecularModel v);
Q3DSPropertyChange setSpecularRoughness(float v);
+ Q3DSPropertyChange setRoughnessMap(Q3DSImage *v);
Q3DSPropertyChange setFresnelPower(float v);
Q3DSPropertyChange setIor(float v);
Q3DSPropertyChange setBumpMap(Q3DSImage *v);
@@ -1650,6 +1652,8 @@ private:
Q3DSImage *m_specularMap = nullptr;
SpecularModel m_specularModel = DefaultSpecularModel;
float m_specularRoughness = 0;
+ QString m_roughnessMap_unresolved;
+ Q3DSImage *m_roughnessMap = nullptr;
float m_fresnelPower = 0;
float m_ior = 0.2f;
QString m_bumpMap_unresolved;
diff --git a/src/runtime/shadergenerator/q3dsdefaultvertexpipeline.cpp b/src/runtime/shadergenerator/q3dsdefaultvertexpipeline.cpp
index 3615689..d860dcb 100644
--- a/src/runtime/shadergenerator/q3dsdefaultvertexpipeline.cpp
+++ b/src/runtime/shadergenerator/q3dsdefaultvertexpipeline.cpp
@@ -251,8 +251,8 @@ struct ShaderGenerator : public Q3DSDefaultMaterialShaderGenerator
"specularColor * kggxGlossyDefaultMtl( "
<< "world_normal, tangent, -" << lightDir.constData() << ".xyz, view_vector, "
<< lightSpecColor.constData()
- << ".rgb, vec3(material_specular.xyz), material_properties.y, "
- "material_properties.y ).rgb;"
+ << ".rgb, vec3(material_specular.xyz), roughnessAmount, "
+ "roughnessAmount).rgb;"
<< "\n";
} break;
case Q3DSDefaultMaterial::SpecularModel::KWard: {
@@ -262,8 +262,8 @@ struct ShaderGenerator : public Q3DSDefaultMaterialShaderGenerator
"specularColor * wardGlossyDefaultMtl( "
<< "world_normal, tangent, -" << lightDir.constData() << ".xyz, view_vector, "
<< lightSpecColor.constData()
- << ".rgb, vec3(material_specular.xyz), material_properties.y, "
- "material_properties.y ).rgb;"
+ << ".rgb, vec3(material_specular.xyz), roughnessAmount, "
+ "roughnessAmount ).rgb;"
<< "\n";
} break;
default:
@@ -271,7 +271,7 @@ struct ShaderGenerator : public Q3DSDefaultMaterialShaderGenerator
fragmentShader << "\tglobal_specular_light.rgb += lightAttenuation * specularAmount * "
"specularColor * specularBSDF( "
<< "world_normal, -" << lightDir.constData() << ".xyz, view_vector, "
- << lightSpecColor.constData() << ".rgb, 1.0, 2.56 / (material_properties.y + "
+ << lightSpecColor.constData() << ".rgb, 1.0, 2.56 / (roughnessAmount + "
"0.01), vec3(1.0), scatter_reflect ).rgb;"
<< "\n";
break;
@@ -312,7 +312,7 @@ struct ShaderGenerator : public Q3DSDefaultMaterialShaderGenerator
"specularColor * specularAmount * sampleAreaGlossyDefault( tanFrame, "
<< pos.constData() << ", " << normalizedDirection.constData() << ", " << lightPos.constData() << ".xyz, "
<< lightRt.constData() << ".w, " << lightUp.constData() << ".w, " << view.constData()
- << ", material_properties.y, material_properties.y ).rgb;" << "\n";
+ << ", roughnessAmount, roughnessAmount ).rgb;" << "\n";
}
void addTranslucencyIrradiance(Q3DSAbstractShaderStageGenerator &infragmentShader, Q3DSImage *image,
@@ -529,6 +529,7 @@ struct ShaderGenerator : public Q3DSDefaultMaterialShaderGenerator
// beware of the differences between specularAmount and specularReflection maps
Q3DSImage *specularAmountImage = m_CurrentMaterial->specularMap();
Q3DSImage *specularReflectionImage = m_CurrentMaterial->specularReflection();
+ Q3DSImage *roughnessImage = m_CurrentMaterial->roughnessMap();
Q3DSImage *normalImage = m_CurrentMaterial->normalMap();
Q3DSImage *translucencyImage = m_CurrentMaterial->translucencyMap();
// lightmaps
@@ -556,6 +557,7 @@ struct ShaderGenerator : public Q3DSDefaultMaterialShaderGenerator
const bool hasImage = m_CurrentMaterial->diffuseMap()
|| m_CurrentMaterial->specularReflection()
|| m_CurrentMaterial->specularMap()
+ || m_CurrentMaterial->roughnessMap()
|| m_CurrentMaterial->bumpMap()
|| m_CurrentMaterial->normalMap()
|| m_CurrentMaterial->displacementmap()
@@ -790,6 +792,19 @@ struct ShaderGenerator : public Q3DSDefaultMaterialShaderGenerator
if (fresnelEnabled)
fragmentHasSpecularAmount = maybeAddMaterialFresnel(fragmentShader, fragmentHasSpecularAmount);
+ fragmentShader << "\tfloat roughnessAmount = material_properties.y;" << "\n";
+ if (roughnessImage) {
+ generateImageUVCoordinates(QLatin1String("roughnessMap"), *roughnessImage);
+ const QByteArray imageSampler = m_ImageSampler.toUtf8();
+ const QByteArray imageFragCoords = m_ImageFragCoords.toUtf8();
+
+ fragmentShader << "\tfloat sampledRoughness = texture2D( "
+ << imageSampler.constData() << ", " << imageFragCoords.constData() << " ).x;" << "\n";
+ //The roughness sampled from roughness textures is Disney roughness
+ //which has to be squared to get the proper value
+ fragmentShader << "\troughnessAmount = roughnessAmount * sampledRoughness * sampledRoughness;" << "\n";
+ }
+
// Iterate through all lights. Note that this is suitable for
// default materials only, where all lights are provided in a
// single constant buffer (cbBufferLights). Custom materials need
@@ -999,7 +1014,7 @@ struct ShaderGenerator : public Q3DSDefaultMaterialShaderGenerator
fragmentShader << "\tglobal_specular_light.xyz += specularColor * specularAmount * "
"vec3(material_specular.xyz) * sampleGlossy( tanFrame, "
- "view_vector, material_properties.y ).xyz;"
+ "view_vector, roughnessAmount ).xyz;"
<< "\n";
}
}
diff --git a/tests/scenes/barrel/Barrel_roughness.uip b/tests/scenes/barrel/Barrel_roughness.uip
new file mode 100644
index 0000000..817f7f1
--- /dev/null
+++ b/tests/scenes/barrel/Barrel_roughness.uip
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<UIP version="3" >
+ <Project >
+ <ProjectSettings author="" company="" presentationWidth="800" presentationHeight="480" maintainAspect="False" >
+ <CustomColors count="16" >#ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff #ffffff</CustomColors>
+ </ProjectSettings>
+ <Graph >
+ <Scene id="Scene" >
+ <Layer id="Layer" >
+ <Camera id="Camera" />
+ <Light id="Light" />
+ <Model id="Barrel" >
+ <Material id="Material" >
+ <Image id="Material_normalmap" />
+ <Image id="Material_emissivemap" />
+ <Image id="Material_diffusemap" />
+ <Image id="Material_roughnessmap" />
+ <Image id="Material_specularmap" />
+ </Material>
+ </Model>
+ <Text id="Text" />
+ <Image id="Layer_lightprobe" />
+ </Layer>
+ </Scene>
+ </Graph>
+ <Logic >
+ <State name="Master Slide" component="#Scene" >
+ <Add ref="#Layer" lightprobe="#Layer_lightprobe" probebright="400" probefov="180" probehorizon="-1" />
+ <Add ref="#Camera" />
+ <Add ref="#Light" rotation="0 0 0" />
+ <Add ref="#Layer_lightprobe" mappingmode="Light Probe" sourcepath="maps/OpenfootageNET_Streetautumn-512.png" />
+ <State id="Scene-Slide1" name="Slide1" playmode="Looping" >
+ <Add ref="#Barrel" name="Barrel" position="0 -42 -483" rotation="90 0 0" scale="100 100 100" sourcepath=".\barrel\meshes\Barrel.mesh#1" >
+ <AnimationTrack property="opacity" type="EaseInOut" />
+ <AnimationTrack property="rotation.x" type="EaseInOut" >0 90 100 100 5 64 100 100 10 90 100 100</AnimationTrack>
+ <AnimationTrack property="rotation.y" type="EaseInOut" >0 0 100 100 5 -302 100 100 10 0 100 100</AnimationTrack>
+ <AnimationTrack property="rotation.z" type="EaseInOut" >0 0 100 100 5 0 100 100 10 0 100 100</AnimationTrack>
+ </Add>
+ <Add ref="#Material" bumpamount="0" diffuse="0 0 0" diffusemap="#Material_diffusemap" emissivemap="#Material_emissivemap" fresnelPower="25" normalmap="#Material_normalmap" roughnessmap="#Material_roughnessmap" specularamount="4" specularmap="#Material_specularmap" specularmodel="Default" specularroughness="1" >
+ <AnimationTrack property="bumpamount" type="EaseInOut" >0 0 100 100 5 1 100 100</AnimationTrack>
+ </Add>
+ <Add ref="#Material_normalmap" sourcepath=".\maps\barrel_barrel_Normal.png" />
+ <Add ref="#Material_emissivemap" sourcepath=".\maps\barrel_barrel_Emissive.png" />
+ <Add ref="#Material_diffusemap" sourcepath="maps/barrel_barrel_Diffuse.png" />
+ <Add ref="#Material_roughnessmap" sourcepath="maps/roughness.png" />
+ <Add ref="#Material_specularmap" sourcepath="maps/barrel_barrel_Specular.png" />
+ <Add ref="#Text" name="Text" font="Arimo-Regular" position="-486.418 297.128 50.5569" textcolor="0 1 0" textstring="Barrel!" tracking="0" >
+ <AnimationTrack property="opacity" type="EaseInOut" >0 100 100 100 5.009 43.75 100 100 10 100 100 100</AnimationTrack>
+ <AnimationTrack property="rotation.x" type="EaseInOut" >0 0 100 100 4.997 0 100 100 5.009 0 100 100 10 0 100 100</AnimationTrack>
+ <AnimationTrack property="rotation.y" type="EaseInOut" >0 0 100 100 4.997 0 100 100 5.009 0 100 100 10 360 100 100</AnimationTrack>
+ <AnimationTrack property="rotation.z" type="EaseInOut" >0 0 100 100 4.997 0 100 100 5.009 0 100 100 10 0 100 100</AnimationTrack>
+ <AnimationTrack property="textcolor.x" type="EaseInOut" >0 0 100 100 5.009 0.501961 100 100 10 0 100 100</AnimationTrack>
+ <AnimationTrack property="textcolor.y" type="EaseInOut" >0 1 100 100 5.009 0.235294 100 100 10 1 100 100</AnimationTrack>
+ <AnimationTrack property="textcolor.z" type="EaseInOut" >0 0 100 100 5.009 0.333333 100 100 10 0 100 100</AnimationTrack>
+ </Add>
+ </State>
+ </State>
+ </Logic>
+ </Project>
+</UIP>
diff --git a/tests/scenes/barrel/maps/OpenfootageNET_Streetautumn-512.png b/tests/scenes/barrel/maps/OpenfootageNET_Streetautumn-512.png
new file mode 100644
index 0000000..f0a6055
--- /dev/null
+++ b/tests/scenes/barrel/maps/OpenfootageNET_Streetautumn-512.png
Binary files differ
diff --git a/tests/scenes/barrel/maps/roughness.png b/tests/scenes/barrel/maps/roughness.png
new file mode 100644
index 0000000..d4ba53f
--- /dev/null
+++ b/tests/scenes/barrel/maps/roughness.png
Binary files differ