From 0a5c068cb623ed3199458c2bb6c618a4848ee12f Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Thu, 23 May 2019 12:56:26 -0700 Subject: [PATCH] Switch specular AA to Tokuyoshi and Kaplanyan (#1218) This replaces the previous "curvature to roughness" method. Both are related and rely on the screen space variance of geometric normals but this new solution offers more control (the screen space variance and the clamping threshold can be controlled). --- .../src/main/cpp/MaterialBuilder.cpp | 19 +- .../filament/filamat/MaterialBuilder.java | 24 ++- .../src/main/cpp/Material.cpp | 16 ++ .../src/main/cpp/MaterialInstance.cpp | 16 ++ .../com/google/android/filament/Material.java | 10 + .../android/filament/MaterialInstance.java | 15 +- docs/Materials.html | 59 +++--- docs/Materials.md.html | 78 ++++--- .../screenshot_curvature_to_roughness.jpg | Bin 155537 -> 0 bytes filament/include/filament/Material.h | 9 + filament/include/filament/MaterialInstance.h | 17 +- filament/src/Material.cpp | 18 ++ filament/src/MaterialInstance.cpp | 50 +++-- filament/src/MaterialParser.cpp | 12 ++ filament/src/MaterialParser.h | 3 + filament/src/details/Material.h | 11 +- filament/src/details/MaterialInstance.h | 13 +- .../include/filament/MaterialChunkType.h | 5 +- .../filamat/include/filamat/MaterialBuilder.h | 28 ++- libs/filamat/src/MaterialBuilder.cpp | 37 ++-- libs/filamat/src/shaders/CodeGenerator.cpp | 6 +- libs/filamat/src/shaders/MaterialInfo.h | 3 +- libs/filamat/src/shaders/ShaderGenerator.cpp | 4 +- samples/material_sandbox.cpp | 5 + samples/material_sandbox.h | 6 + samples/materials/sandboxCloth.mat | 1 + samples/materials/sandboxLit.mat | 3 +- samples/materials/sandboxLitFade.mat | 1 + samples/materials/sandboxLitTransparent.mat | 1 + samples/materials/sandboxSpecGloss.mat | 3 +- samples/materials/sandboxSubsurface.mat | 1 + samples/sample_normal_map.cpp | 5 +- shaders/CMakeLists.txt | 4 +- shaders/src/common_lighting.fs | 58 ------ shaders/src/common_material.fs | 195 ++++-------------- shaders/src/common_shading.fs | 12 ++ shaders/src/getters.fs | 52 ++++- shaders/src/inputs.fs | 3 - shaders/src/inputs.vs | 3 - shaders/src/main.fs | 2 +- shaders/src/main.vs | 7 +- shaders/src/material_inputs.fs | 114 ++++++++++ ...{common_material.vs => material_inputs.vs} | 0 shaders/src/shading_lit.fs | 48 +++-- shaders/src/shading_parameters.fs | 11 +- tools/matc/src/matc/ParametersProcessor.cpp | 62 +++--- tools/matinfo/src/main.cpp | 11 +- 47 files changed, 649 insertions(+), 412 deletions(-) delete mode 100644 docs/images/screenshot_curvature_to_roughness.jpg create mode 100644 shaders/src/common_shading.fs create mode 100644 shaders/src/material_inputs.fs rename shaders/src/{common_material.vs => material_inputs.vs} (100%) diff --git a/android/filamat-android/src/main/cpp/MaterialBuilder.cpp b/android/filamat-android/src/main/cpp/MaterialBuilder.cpp index 6069b39eeb..48b83ecfdf 100644 --- a/android/filamat-android/src/main/cpp/MaterialBuilder.cpp +++ b/android/filamat-android/src/main/cpp/MaterialBuilder.cpp @@ -226,17 +226,24 @@ Java_com_google_android_filament_filamat_MaterialBuilder_nMaterialBuilderShadowM } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_filamat_MaterialBuilder_nMaterialBuilderCurvatureToRoughness( - JNIEnv*, jclass, jlong nativeBuilder, jboolean curvatureToRoughness) { +Java_com_google_android_filament_filamat_MaterialBuilder_nMaterialBuilderSpecularAntiAliasing( + JNIEnv*, jclass, jlong nativeBuilder, jboolean specularAntiAliasing) { auto builder = (MaterialBuilder*) nativeBuilder; - builder->curvatureToRoughness(curvatureToRoughness); + builder->specularAntiAliasing(specularAntiAliasing); } extern "C" JNIEXPORT void JNICALL -Java_com_google_android_filament_filamat_MaterialBuilder_nMaterialBuilderLimitOverInterpolation( - JNIEnv*, jclass, jlong nativeBuilder, jboolean limitOverInterpolation) { +Java_com_google_android_filament_filamat_MaterialBuilder_nMaterialBuilderSpecularAntiAliasingVariance( + JNIEnv*, jclass, jlong nativeBuilder, jfloat variance) { auto builder = (MaterialBuilder*) nativeBuilder; - builder->limitOverInterpolation(limitOverInterpolation); + builder->specularAntiAliasingVariance(variance); +} + +extern "C" JNIEXPORT void JNICALL +Java_com_google_android_filament_filamat_MaterialBuilder_nMaterialBuilderSpecularAntiAliasingThreshold( + JNIEnv*, jclass, jlong nativeBuilder, jfloat threshold) { + auto builder = (MaterialBuilder*) nativeBuilder; + builder->specularAntiAliasingThreshold(threshold); } extern "C" JNIEXPORT void JNICALL diff --git a/android/filamat-android/src/main/java/com/google/android/filament/filamat/MaterialBuilder.java b/android/filamat-android/src/main/java/com/google/android/filament/filamat/MaterialBuilder.java index 81689afeeb..532f2d8ee9 100644 --- a/android/filamat-android/src/main/java/com/google/android/filament/filamat/MaterialBuilder.java +++ b/android/filamat-android/src/main/java/com/google/android/filament/filamat/MaterialBuilder.java @@ -290,14 +290,20 @@ public class MaterialBuilder { } @NonNull - public MaterialBuilder curvatureToRoughness(boolean curvatureToRoughness) { - nMaterialBuilderCurvatureToRoughness(mNativeObject, curvatureToRoughness); + public MaterialBuilder specularAntiAliasing(boolean specularAntiAliasing) { + nMaterialBuilderSpecularAntiAliasing(mNativeObject, specularAntiAliasing); return this; } @NonNull - public MaterialBuilder limitOverInterpolation(boolean limitOverInterpolation) { - nMaterialBuilderLimitOverInterpolation(mNativeObject, limitOverInterpolation); + public MaterialBuilder specularAntiAliasingVariance(float variance) { + nMaterialBuilderSpecularAntiAliasingVariance(mNativeObject, variance); + return this; + } + + @NonNull + public MaterialBuilder specularAntiAliasingThreshold(float threshold) { + nMaterialBuilderSpecularAntiAliasingThreshold(mNativeObject, threshold); return this; } @@ -420,10 +426,12 @@ public class MaterialBuilder { private static native void nMaterialBuilderShadowMultiplier(long mNativeObject, boolean shadowMultiplier); - private static native void nMaterialBuilderCurvatureToRoughness(long mNativeObject, - boolean curvatureToRoughness); - private static native void nMaterialBuilderLimitOverInterpolation(long mNativeObject, - boolean limitOverInterpolation); + private static native void nMaterialBuilderSpecularAntiAliasing(long mNativeObject, + boolean specularAntiAliasing); + private static native void nMaterialBuilderSpecularAntiAliasingVariance(long mNativeObject, + float variance); + private static native void nMaterialBuilderSpecularAntiAliasingThreshold(long mNativeObject, + float threshold); private static native void nMaterialBuilderClearCoatIorChange(long mNativeObject, boolean clearCoatIorChange); private static native void nMaterialBuilderFlipUV(long nativeBuilder, boolean flipUV); diff --git a/android/filament-android/src/main/cpp/Material.cpp b/android/filament-android/src/main/cpp/Material.cpp index 9dc83f52d7..366c3e9f78 100644 --- a/android/filament-android/src/main/cpp/Material.cpp +++ b/android/filament-android/src/main/cpp/Material.cpp @@ -140,6 +140,22 @@ Java_com_google_android_filament_Material_nGetMaskThreshold(JNIEnv*, jclass, return material->getMaskThreshold(); } +extern "C" +JNIEXPORT jfloat JNICALL +Java_com_google_android_filament_Material_nGetSpecularAntiAliasingVariance(JNIEnv*, jclass, + jlong nativeMaterial) { + Material* material = (Material*) nativeMaterial; + return material->getSpecularAntiAliasingVariance(); +} + +extern "C" +JNIEXPORT jfloat JNICALL +Java_com_google_android_filament_Material_nGetSpecularAntiAliasingThreshold(JNIEnv*, jclass, + jlong nativeMaterial) { + Material* material = (Material*) nativeMaterial; + return material->getSpecularAntiAliasingThreshold(); +} + extern "C" JNIEXPORT jint JNICALL Java_com_google_android_filament_Material_nGetParameterCount(JNIEnv*, jclass, diff --git a/android/filament-android/src/main/cpp/MaterialInstance.cpp b/android/filament-android/src/main/cpp/MaterialInstance.cpp index 785ba08f02..0223ca1a5a 100644 --- a/android/filament-android/src/main/cpp/MaterialInstance.cpp +++ b/android/filament-android/src/main/cpp/MaterialInstance.cpp @@ -226,6 +226,22 @@ Java_com_google_android_filament_MaterialInstance_nSetMaskThreshold(JNIEnv*, instance->setMaskThreshold(threshold); } +extern "C" +JNIEXPORT void JNICALL +Java_com_google_android_filament_MaterialInstance_nSetSpecularAntiAliasingVariance(JNIEnv*, + jclass, jlong nativeMaterialInstance, jfloat variance) { + MaterialInstance* instance = (MaterialInstance*) nativeMaterialInstance; + instance->setSpecularAntiAliasingVariance(variance); +} + +extern "C" +JNIEXPORT void JNICALL +Java_com_google_android_filament_MaterialInstance_nSetSpecularAntiAliasingThreshold(JNIEnv*, + jclass, jlong nativeMaterialInstance, jfloat threshold) { + MaterialInstance* instance = (MaterialInstance*) nativeMaterialInstance; + instance->setSpecularAntiAliasingThreshold(threshold); +} + extern "C" JNIEXPORT void JNICALL Java_com_google_android_filament_MaterialInstance_nSetDoubleSided(JNIEnv*, diff --git a/android/filament-android/src/main/java/com/google/android/filament/Material.java b/android/filament-android/src/main/java/com/google/android/filament/Material.java index c982897ab5..67b58205c8 100644 --- a/android/filament-android/src/main/java/com/google/android/filament/Material.java +++ b/android/filament-android/src/main/java/com/google/android/filament/Material.java @@ -215,6 +215,14 @@ public class Material { return nGetMaskThreshold(getNativeObject()); } + public float getSpecularAntiAliasingVariance() { + return nGetSpecularAntiAliasingVariance(getNativeObject()); + } + + public float getSpecularAntiAliasingThreshold() { + return nGetSpecularAntiAliasingThreshold(getNativeObject()); + } + public Set getRequiredAttributes() { if (mRequiredAttributes == null) { int bitSet = nGetRequiredAttributes(getNativeObject()); @@ -356,6 +364,8 @@ public class Material { private static native boolean nIsDepthCullingEnabled(long nativeMaterial); private static native boolean nIsDoubleSided(long nativeMaterial); private static native float nGetMaskThreshold(long nativeMaterial); + private static native float nGetSpecularAntiAliasingVariance(long nativeMaterial); + private static native float nGetSpecularAntiAliasingThreshold(long nativeMaterial); private static native int nGetParameterCount(long nativeMaterial); private static native void nGetParameters(long nativeMaterial, diff --git a/android/filament-android/src/main/java/com/google/android/filament/MaterialInstance.java b/android/filament-android/src/main/java/com/google/android/filament/MaterialInstance.java index 1460f47bb3..3b9db03151 100644 --- a/android/filament-android/src/main/java/com/google/android/filament/MaterialInstance.java +++ b/android/filament-android/src/main/java/com/google/android/filament/MaterialInstance.java @@ -155,6 +155,14 @@ public class MaterialInstance { nSetMaskThreshold(getNativeObject(), threshold); } + public void setSpecularAntiAliasingVariance(float variance) { + nSetSpecularAntiAliasingVariance(getNativeObject(), variance); + } + + public void setSpecularAntiAliasingThreshold(float threshold) { + nSetSpecularAntiAliasingThreshold(getNativeObject(), threshold); + } + public void setDoubleSided(boolean doubleSided) { nSetDoubleSided(getNativeObject(), doubleSided); } @@ -218,9 +226,14 @@ public class MaterialInstance { private static native void nUnsetScissor(long nativeMaterialInstance); private static native void nSetPolygonOffset(long nativeMaterialInstance, - float scale, float constant); + float scale, float constant); private static native void nSetMaskThreshold(long nativeMaterialInstance, float threshold); + private static native void nSetSpecularAntiAliasingVariance(long nativeMaterialInstance, + float variance); + private static native void nSetSpecularAntiAliasingThreshold(long nativeMaterialInstance, + float threshold); + private static native void nSetDoubleSided(long nativeMaterialInstance, boolean doubleSided); } diff --git a/docs/Materials.html b/docs/Materials.html index ca927400bd..3b2ecf7c20 100644 --- a/docs/Materials.html +++ b/docs/Materials.html @@ -86,8 +86,9 @@ counter-increment: h6;margin-right:10px}