pex-renderer
Version:
Physically Based Renderer for Pex
80 lines (68 loc) • 2.87 kB
JavaScript
module.exports = /* glsl */ `
// Source: Google/Filament/Overview/4.8.3.3 Roughness remapping and clamping, 07/2019
// Minimum roughness to avoid division by zerio when 1/a^2 and to limit specular aliasing
// This could be 0.045 when using single precision float fp32
// R = ?, G = roughness, B = metallic
uniform sampler2D uMetallicRoughnessMap;
uniform mat3 uMetallicRoughnessMapTexCoordTransform;
// TODO: sampling the same texture twice
void getMetallic(inout PBRData data) {
vec2 texCoord = getTextureCoordinates(data, METALLIC_ROUGHNESS_MAP_TEX_COORD_INDEX, uMetallicRoughnessMapTexCoordTransform);
vec2 texCoord = getTextureCoordinates(data, METALLIC_ROUGHNESS_MAP_TEX_COORD_INDEX);
vec4 texelColor = texture2D(uMetallicRoughnessMap, texCoord);
data.metallic = texelColor.b;
data.roughness = texelColor.g;
}
void getRoughness(inout PBRData data) {
// NOP, already read in getMetallic
}
uniform float uMetallic;
uniform float uRoughness;
uniform sampler2D uMetallicMap; //assumes linear, TODO: check gltf
uniform mat3 uMetallicMapTexCoordTransform;
void getMetallic(inout PBRData data) {
vec2 texCoord = getTextureCoordinates(data, METALLIC_MAP_TEX_COORD_INDEX, uMetallicMapTexCoordTransform);
vec2 texCoord = getTextureCoordinates(data, METALLIC_MAP_TEX_COORD_INDEX);
data.metallic = uMetallic * texture2D(uMetallicMap, texCoord).r;
}
void getMetallic(inout PBRData data) {
data.metallic = uMetallic;
}
uniform sampler2D uRoughnessMap; //assumes linear, TODO: check glTF
uniform mat3 uRoughnessMapTexCoordTransform;
void getRoughness(inout PBRData data) {
vec2 texCoord = getTextureCoordinates(data, ROUGHNESS_MAP_TEX_COORD_INDEX, uRoughnessMapTexCoordTransform);
vec2 texCoord = getTextureCoordinates(data, ROUGHNESS_MAP_TEX_COORD_INDEX);
data.roughness = uRoughness * texture2D(uRoughnessMap, getTextureCoordinates(data, ROUGHNESS_MAP_TEX_COORD_INDEX)).r + 0.01;
}
void getRoughness(inout PBRData data) {
data.roughness = uRoughness + 0.01;
}
`