Fix distant PBR rendering artifacts
Amp-Thread-ID: https://ampcode.com/threads/T-01a01ff8-b91f-724f-8952-f07c6b5042fd Co-authored-by: Heaust Azure <heaust.azure@gmail.com>
This commit is contained in:
@@ -23,6 +23,7 @@ export type GraphSampler = {
|
|||||||
mipmapFilter?: "nearest" | "linear";
|
mipmapFilter?: "nearest" | "linear";
|
||||||
addressModeU?: "clamp-to-edge" | "repeat" | "mirror-repeat";
|
addressModeU?: "clamp-to-edge" | "repeat" | "mirror-repeat";
|
||||||
addressModeV?: "clamp-to-edge" | "repeat" | "mirror-repeat";
|
addressModeV?: "clamp-to-edge" | "repeat" | "mirror-repeat";
|
||||||
|
anisotropyClamp?: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type GraphBinding = {
|
export type GraphBinding = {
|
||||||
|
|||||||
@@ -226,7 +226,7 @@ fn fragment(input: VertexOutput) -> @location(0) vec4<f32> {
|
|||||||
let metallic = clamp(properties.x * ${materialTexture ? "packedMaterial.b" : "1.0"}, 0.0, 1.0);
|
let metallic = clamp(properties.x * ${materialTexture ? "packedMaterial.b" : "1.0"}, 0.0, 1.0);
|
||||||
let roughness = clamp(properties.y * ${materialTexture ? "packedMaterial.g" : "1.0"}, 0.04, 1.0);
|
let roughness = clamp(properties.y * ${materialTexture ? "packedMaterial.g" : "1.0"}, 0.04, 1.0);
|
||||||
var normal = normalize(input.normal);
|
var normal = normalize(input.normal);
|
||||||
${normalTexture ? "let tangent = normalize(input.tangent.xyz); let bitangent = normalize(cross(normal, tangent)) * input.tangent.w; let mapped = textureSample(normalTexture, materialSampler, input.uv).xyz * 2.0 - 1.0; normal = normalize(mat3x3<f32>(tangent, bitangent, normal) * vec3(mapped.xy * extra.y, mapped.z));" : ""}
|
${normalTexture ? "let tangent = normalize(input.tangent.xyz - normal * dot(input.tangent.xyz, normal)); let bitangent = cross(normal, tangent) * input.tangent.w; let mapped = textureSample(normalTexture, materialSampler, input.uv).xyz * 2.0 - 1.0; normal = normalize(mat3x3<f32>(tangent, bitangent, normal) * vec3(mapped.xy * extra.y, mapped.z));" : ""}
|
||||||
let view = normalize(cameraMatrices[4].xyz - input.world);
|
let view = normalize(cameraMatrices[4].xyz - input.world);
|
||||||
let lightDirection = normalize(vec3<f32>(0.4, 0.7, 0.6));
|
let lightDirection = normalize(vec3<f32>(0.4, 0.7, 0.6));
|
||||||
let halfVector = normalize(lightDirection + view);
|
let halfVector = normalize(lightDirection + view);
|
||||||
@@ -300,7 +300,7 @@ function presentShader(toneMap: string) {
|
|||||||
@group(0) @binding(1) var sourceSampler: sampler;
|
@group(0) @binding(1) var sourceSampler: sampler;
|
||||||
@fragment fn fragment(input: VertexOutput) -> @location(0) vec4<f32> {
|
@fragment fn fragment(input: VertexOutput) -> @location(0) vec4<f32> {
|
||||||
let value = textureSample(source, sourceSampler, input.uv);
|
let value = textureSample(source, sourceSampler, input.uv);
|
||||||
let color = value.rgb;
|
let color = max(value.rgb, vec3(0.0));
|
||||||
return vec4(${tone}, value.a);
|
return vec4(${tone}, value.a);
|
||||||
}`;
|
}`;
|
||||||
}
|
}
|
||||||
@@ -834,6 +834,7 @@ export class Scene {
|
|||||||
mipmapFilter: "linear",
|
mipmapFilter: "linear",
|
||||||
addressModeU: "repeat",
|
addressModeU: "repeat",
|
||||||
addressModeV: "repeat",
|
addressModeV: "repeat",
|
||||||
|
anisotropyClamp: 16,
|
||||||
});
|
});
|
||||||
for (const { number: _, source: __, ...texture } of this.#textures.values())
|
for (const { number: _, source: __, ...texture } of this.#textures.values())
|
||||||
addTexture(texture);
|
addTexture(texture);
|
||||||
|
|||||||
@@ -305,8 +305,8 @@ const camera = new ArcRotateCamera(scene, {
|
|||||||
alpha: Math.PI / 2,
|
alpha: Math.PI / 2,
|
||||||
beta: Math.PI / 3,
|
beta: Math.PI / 3,
|
||||||
radius: 30,
|
radius: 30,
|
||||||
near: 0.1,
|
near: 1,
|
||||||
far: 100,
|
far: 1000,
|
||||||
aspect: canvas.width / canvas.height,
|
aspect: canvas.width / canvas.height,
|
||||||
controls: { element: canvas, pointer: true },
|
controls: { element: canvas, pointer: true },
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user