pex-renderer icon indicating copy to clipboard operation
pex-renderer copied to clipboard

Transmission blur is resolution and camera distance dependent

Open vorg opened this issue 4 months ago • 2 comments

Cant this be something with how mipmap level is calculated?

See digits getting blurry faster than one would expect from mipmap blur

Image

And when very far away / small on screen

Image

Same scene at canvas resolution 1024 vs 4096

Image

vorg avatar Aug 14 '25 08:08 vorg

Can you provide ior, thickness, attenuation, transmission, dispersion values?

Test example code:
import {
  renderEngine as createRenderEngine,
  world as createWorld,
  entity as createEntity,
  components,
} from "../index.js";

import createContext from "pex-context";
import { cube, plane, cylinder } from "primitive-geometry";
import { getEnvMap, getTexture, getURL } from "./utils.js";
import { quat } from "pex-math";

const pixelRatio = 1; // devicePixelRatio
const ctx = createContext({ pixelRatio });
const renderEngine = createRenderEngine({ ctx, debug: true });

const world = createWorld();

const cameraEntity = createEntity({
  transform: components.transform({ position: [0, 0, 100] }),
  camera: components.camera(),
  orbiter: components.orbiter(),
});
world.add(cameraEntity);

const skyEntity = createEntity({
  skybox: components.skybox({
    sunPosition: [1, 0.5, 1],
    backgroundBlur: 1,
    envMap: await getEnvMap(ctx, "assets/envmaps/garage/garage.hdr"),
  }),
  reflectionProbe: components.reflectionProbe(),
});
world.add(skyEntity);

const backgroundGeometry = createEntity({
  transform: components.transform({ position: [0, 0, -3] }),
  geometry: components.geometry(plane({ sx: 50 })),
  material: components.material({
    baseColorTexture: await getTexture(
      ctx,
      getURL(`assets/textures/uv/uv.png`),
    ),
  }),
  vertexHelper: components.vertexHelper({ size: 0.2 }),
  boundingBoxHelper: components.boundingBoxHelper(),
});
world.add(backgroundGeometry);

const geometryEntity = createEntity({
  transform: components.transform({
    rotation: quat.fromAxisAngle(quat.create(), [1, 0, 0], Math.PI / 2),
  }),
  geometry: components.geometry(cylinder({ height: 3.8, radius: 15 })),
  material: components.material({
    // baseColor: [0.8, 0.6, 0.6, 1],
    transmission: 1,
    metallic: 0,
    roughness: 0.3,
    // thickness: 1.0,
    // attenuationDistance: 0.8,
    // attenuationColor: [0.5, 0.5, 0.5],
    // cullFace: false,
  }),
  vertexHelper: components.vertexHelper({ size: 1 }),
});
world.add(geometryEntity);

ctx.frame(() => {
  renderEngine.update(world.entities);
  renderEngine.render(world.entities, cameraEntity);
});

dmnsgn avatar Aug 14 '25 15:08 dmnsgn

Speaking of mipmaps, it's hardware dependent: https://pema.dev/2025/05/09/mipmaps-too-much-detail/

dmnsgn avatar Sep 09 '25 14:09 dmnsgn