- Notifications
You must be signed in to change notification settings - Fork 2.1k
Description
Description:
I'm experiencing an issue where GLTF models with glass materials appear to render without any volume-they look flat or like dull plastic-when using Filament 1.68.4 on Windows with OpenGL as the backend.
Platform:
Windows
OpenGL backend
Filament version: 1.68.4
Repro Steps:
- Apply graphics setting to AR's
View, that renders GLTF model (attached below). - Render an AR model and feed to a texture using an image.mat material (attached below).
- Use this texture as a parameter for another on-screen material.
- Use the Dragon Attenuation model for testing.
- The rendering pipeline uses multiple render targets in the same render loop.
Expected Behavior:
The glass material should appear volumetric, as it does in the minimal boilerplate project (it uses the same settings, and the model renders correctly there.).
Actual Behavior:
The glass material looks flat, similar to dull plastic.
This effect can also be reproduced by setting hasVolume, hasVolumeThicknessTexture, and hasDispersion to false in the filament::gltfio::MaterialKey config.
setScreenSpaceRefractionEnabled is enabled for the view.
The same behavior occurs with both Ubershader and JIT material providers.
Additional Info:
GraphicsSettings
struct GraphicsSettings { // standalone View settings filament::AntiAliasing antiAliasing = filament::AntiAliasing::FXAA; filament::Dithering dithering = filament::Dithering::TEMPORAL; filament::ShadowType shadowType = filament::ShadowType::PCF; bool postProcessingEnabled = true; // View Options (sorted) filament::AmbientOcclusionOptions ssao = { .enabled = true }; filament::ScreenSpaceReflectionsOptions screenSpaceReflections = { .enabled = true }; filament::BloomOptions bloom = { .strength = 1.0f, .enabled = true, .lensFlare = true, .ghostThreshold = 2.f, .haloThreshold = 2.f, }; filament::DepthOfFieldOptions dof = { .enabled = true, .nativeResolution = true }; filament::DynamicResolutionOptions dsr = { .minScale = { 1.f, 1.f }, .maxScale = { 2.0f, 2.0f }, .sharpness = 0.9f, .enabled = false, .quality = filament::QualityLevel::LOW }; filament::FogOptions fog; // # if !defined(__EMSCRIPTEN__) && !defined(__EMSCRIPTEN_PTHREADS__) filament::MultiSampleAntiAliasingOptions msaa = { .enabled = true, .sampleCount = 4 }; // # else // filament::MultiSampleAntiAliasingOptions msaa = { .enabled = false }; // # endif filament::RenderQuality renderQuality; filament::TemporalAntiAliasingOptions taa = { .enabled = true }; filament::VignetteOptions vignette = { .enabled = false }; filament::VsmShadowOptions vsmShadowOptions = { .anisotropy = 0 }; filament::GuardBandOptions guardBand; filament::BlendMode blendMode = filament::BlendMode::TRANSLUCENT; filament::View* Apply(filament::View* view) const; }; // Actual graphics settings for AR model rendering { .postProcessingEnabled = true, .ssao = { .enabled = false }, .screenSpaceReflections = { .enabled = false }, .bloom = { .dirtStrength = 1.0f, .strength = 1.0f, .blendMode = filament::BloomOptions::BlendMode::INTERPOLATE, .threshold = true, .enabled = true, .lensFlare = false, .chromaticAberration = 0.03f, .ghostThreshold = 0.000000002f, .haloThreshold = 0.000000002f, }, .dof = { .enabled = false, .nativeResolution = true }, .dsr = { .minScale = { 1.f, 1.f }, .maxScale = { 2.0f, 2.0f }, .sharpness = 0.9f, .enabled = false, .quality = filament::QualityLevel::LOW }, .fog = {}, .msaa = { .enabled = true, .sampleCount = 4 }, .renderQuality = {}, .taa = { .enabled = false }, .vignette = { .enabled = false }, .vsmShadowOptions = { .anisotropy = 0 }, .guardBand = {} }, image.mat
material { name : image, parameters : [ { type : ${FEED_SAMPLER}, name : image } ], requires : [ uv0 ], flipUV : true, depthWrite : false, colorWrite : true, shadingModel : unlit, variantFilter : [ directionalLighting, dynamicLighting, shadowReceiver, skinning, fog, vsm ], culling: none, depthCulling : false } fragment { #if USE_SAMPLER_EXTERNAL vec3 sRGB_to_linear(highp vec3 color) { return vec3( color.r <= 0.04045 ? color.r / 12.92 : pow((color.r + 0.055) / 1.055, 2.4), color.g <= 0.04045 ? color.g / 12.92 : pow((color.g + 0.055) / 1.055, 2.4), color.b <= 0.04045 ? color.b / 12.92 : pow((color.b + 0.055) / 1.055, 2.4) ); //return vec3(pow(color.r, 2.2), pow(color.g, 2.2), pow(color.b, 2.2)); //return color; } #endif vec3 imageColor(highp vec2 uv) { uv = vec2(uv.s, 1.0 - uv.t); // We need to convert extneral texture to linear space // (in case of internal texture - we do it with hardware automatically based RGB8_A8 format) #if USE_SAMPLER_EXTERNAL return sRGB_to_linear(texture(materialParams_image, uv).rgb); #else return texture(materialParams_image, uv).rgb; #endif } void material(inout MaterialInputs material) { prepareMaterial(material); highp vec2 imageUV = getUV0(); if (imageUV.x > 0.0 && imageUV.y > 0.0 && imageUV.x < 1.0 && imageUV.y < 1.0 ) { material.baseColor.rgb = imageColor(imageUV); material.baseColor.a = 1.0; }else{ material.baseColor = vec4(0.0, 0.0, 0.0, 1.0); } } } I'm happy to provide code snippets or further details if needed.
Question:
Is there something I'm missing in the pipeline or material configuration that could cause this? Any hints or suggestions would be greatly appreciated!

