google / google/filament

GLTF Glass Materials Render Without Volume on Windows/OpenGL (v1.68.4)

Open
#9,630 8 comments 0 reactions 1 assignee Claimed by @pixelflinger View on GitHub
Dominant language
C++
Stars
20.5k
Forks
2.3k
Avg merge
2d 14h
Merged PRs (30d)
83

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:**

1. Apply graphics setting to AR's `View`, that renders GLTF model (attached below).
2. Render an AR model and feed to a texture using an image.mat material (attached below).
3. Use this texture as a parameter for another on-screen material.
4. Use [the Dragon Attenuation model](https://github.com/KhronosGroup/glTF-Sample-Models/tree/main/2.0/DragonAttenuation) for testing.
5. [The rendering pipeline uses multiple render targets in the same render loop](https://github.com/0xcode-lasagna/filament_renderer/blob/c9d0c9fb1256cd7b617ff01a19e71ef6d4b1f0d9/src/RendererApp.cpp#L457C5-L510C6).

**Expected Behavior:**

The glass material should appear volumetric, as it does in [the minimal boilerplate project](https://github.com/0xcode-lasagna/filament_renderer) (it uses the same settings, and the model renders correctly there.).

![Image](https://github.com/user-attachments/assets/507eff22-e841-4fc4-9459-37a1ddd8aee9)

**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.

![Image](https://github.com/user-attachments/assets/6d105b72-e362-40df-b1c1-6c8f1dd732f1)

**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!

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.