diff options
author | Jere Tuliniemi <jere.tuliniemi@qt.io> | 2018-04-19 15:35:26 +0300 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@qt.io> | 2018-04-20 09:30:49 +0000 |
commit | 26063241035dbc9a5677ff00788398f381e9a407 (patch) | |
tree | 9381774d365833700650f97c3ff3d8c57e9c0132 | |
parent | 5b616b9ff79e57f7d8e35660e3f5c7f729ddce74 (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.cpp | 9 | ||||
-rw-r--r-- | src/runtime/q3dsscenemanager_p.h | 1 | ||||
-rw-r--r-- | src/runtime/q3dsuippresentation.cpp | 13 | ||||
-rw-r--r-- | src/runtime/q3dsuippresentation_p.h | 4 | ||||
-rw-r--r-- | src/runtime/shadergenerator/q3dsdefaultvertexpipeline.cpp | 29 | ||||
-rw-r--r-- | tests/scenes/barrel/Barrel_roughness.uip | 60 | ||||
-rw-r--r-- | tests/scenes/barrel/maps/OpenfootageNET_Streetautumn-512.png | bin | 0 -> 393468 bytes | |||
-rw-r--r-- | tests/scenes/barrel/maps/roughness.png | bin | 0 -> 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 Binary files differnew file mode 100644 index 0000000..f0a6055 --- /dev/null +++ b/tests/scenes/barrel/maps/OpenfootageNET_Streetautumn-512.png diff --git a/tests/scenes/barrel/maps/roughness.png b/tests/scenes/barrel/maps/roughness.png Binary files differnew file mode 100644 index 0000000..d4ba53f --- /dev/null +++ b/tests/scenes/barrel/maps/roughness.png |