Renaming msdfSampler to linearSampler; adding loadShaderModule utility method; busting the rain render out of its render bundle (which won't be useful long-term).

This commit is contained in:
Rezmason
2021-11-03 20:01:59 -07:00
parent 8f09fade43
commit f8959cd7d9
4 changed files with 20 additions and 22 deletions

View File

@@ -4,8 +4,8 @@ WebGPU
Render targets Render targets
Resize accordingly Resize accordingly
Blur: compute or render? Blur: compute or render?
What is workgroupBarrier in compute shaders?
The other passes should be a breeze The other passes should be a breeze
Just add them to the render bundle
Make sure you got CORS right in the texture fetch Make sure you got CORS right in the texture fetch
Update links in issues Update links in issues

View File

@@ -1,5 +1,6 @@
import std140 from "./std140.js"; import std140 from "./std140.js";
import { getCanvasSize, loadTexture, makeUniformBuffer } from "./utils.js"; import { getCanvasSize, loadTexture, loadShaderModule, makeUniformBuffer } from "./utils.js";
const { mat4, vec3 } = glMatrix; const { mat4, vec3 } = glMatrix;
const rippleTypes = { const rippleTypes = {
@@ -30,8 +31,7 @@ export default async (canvas, config) => {
canvasContext.configure(canvasConfig); canvasContext.configure(canvasConfig);
const msdfTexturePromise = loadTexture(device, config.glyphTexURL); const assets = [loadTexture(device, config.glyphTexURL), loadShaderModule(device, "shaders/wgsl/rainPass.wgsl")];
const rainShaderPromise = fetch("shaders/wgsl/rainPass.wgsl").then((response) => response.text());
// The volumetric mode multiplies the number of columns // The volumetric mode multiplies the number of columns
// to reach the desired density, and then overlaps them // to reach the desired density, and then overlaps them
@@ -121,14 +121,12 @@ export default async (canvas, config) => {
}; };
updateCameraBuffer(); updateCameraBuffer();
const msdfSampler = device.createSampler({ const linearSampler = device.createSampler({
magFilter: "linear", magFilter: "linear",
minFilter: "linear", minFilter: "linear",
}); });
const [msdfTexture, rainShader] = await Promise.all([msdfTexturePromise, rainShaderPromise]); const [msdfTexture, rainShaderModule] = await Promise.all(assets);
const rainShaderModule = device.createShaderModule({ code: rainShader });
const rainComputePipeline = device.createComputePipeline({ const rainComputePipeline = device.createComputePipeline({
compute: { compute: {
@@ -175,7 +173,7 @@ export default async (canvas, config) => {
const renderBindGroup = device.createBindGroup({ const renderBindGroup = device.createBindGroup({
layout: rainRenderPipeline.getBindGroupLayout(0), layout: rainRenderPipeline.getBindGroupLayout(0),
entries: [configBuffer, timeBuffer, sceneBuffer, msdfSampler, msdfTexture.createView(), cellsBuffer] entries: [configBuffer, timeBuffer, sceneBuffer, linearSampler, msdfTexture.createView(), cellsBuffer]
.map((resource) => (resource instanceof GPUBuffer ? { buffer: resource } : resource)) .map((resource) => (resource instanceof GPUBuffer ? { buffer: resource } : resource))
.map((resource, binding) => ({ .map((resource, binding) => ({
binding, binding,
@@ -183,15 +181,6 @@ export default async (canvas, config) => {
})), })),
}); });
const bundleEncoder = device.createRenderBundleEncoder({
colorFormats: [presentationFormat],
});
bundleEncoder.setPipeline(rainRenderPipeline);
bundleEncoder.setBindGroup(0, renderBindGroup);
bundleEncoder.draw(numVerticesPerQuad * numQuads, 1, 0, 0);
const renderBundles = [bundleEncoder.finish()];
const renderPassConfig = { const renderPassConfig = {
colorAttachments: [ colorAttachments: [
{ {
@@ -228,8 +217,11 @@ export default async (canvas, config) => {
renderPassConfig.colorAttachments[0].view = canvasContext.getCurrentTexture().createView(); renderPassConfig.colorAttachments[0].view = canvasContext.getCurrentTexture().createView();
const renderPass = encoder.beginRenderPass(renderPassConfig); const renderPass = encoder.beginRenderPass(renderPassConfig);
renderPass.executeBundles(renderBundles); renderPass.setPipeline(rainRenderPipeline);
renderPass.setBindGroup(0, renderBindGroup);
renderPass.draw(numVerticesPerQuad * numQuads, 1, 0, 0);
renderPass.endPass(); renderPass.endPass();
const commandBuffer = encoder.finish(); const commandBuffer = encoder.finish();
device.queue.submit([commandBuffer]); device.queue.submit([commandBuffer]);

View File

@@ -27,6 +27,12 @@ const loadTexture = async (device, url) => {
return texture; return texture;
}; };
const loadShaderModule = async (device, url) => {
const response = await fetch(url);
const code = await response.text();
return device.createShaderModule({ code });
};
const makeUniformBuffer = (device, structLayout, values = null) => { const makeUniformBuffer = (device, structLayout, values = null) => {
const buffer = device.createBuffer({ const buffer = device.createBuffer({
size: structLayout.size, size: structLayout.size,
@@ -40,4 +46,4 @@ const makeUniformBuffer = (device, structLayout, values = null) => {
return buffer; return buffer;
}; };
export { getCanvasSize, loadTexture, makeUniformBuffer }; export { getCanvasSize, loadTexture, loadShaderModule, makeUniformBuffer };

View File

@@ -60,7 +60,7 @@
// Render bindings // Render bindings
[[group(0), binding(2)]] var<uniform> scene : Scene; [[group(0), binding(2)]] var<uniform> scene : Scene;
[[group(0), binding(3)]] var msdfSampler : sampler; [[group(0), binding(3)]] var linearSampler : sampler;
[[group(0), binding(4)]] var msdfTexture : texture_2d<f32>; [[group(0), binding(4)]] var msdfTexture : texture_2d<f32>;
[[group(0), binding(5)]] var<storage, read> cells_RO : CellData; [[group(0), binding(5)]] var<storage, read> cells_RO : CellData;
@@ -416,7 +416,7 @@ fn getSymbolUV(glyphCycle : f32) -> vec2<f32> {
var msdfUV = (glyphUV + symbolUV) / f32(config.glyphTextureColumns); var msdfUV = (glyphUV + symbolUV) / f32(config.glyphTextureColumns);
// MSDF : calculate brightness of fragment based on distance to shape // MSDF : calculate brightness of fragment based on distance to shape
var dist = textureSample(msdfTexture, msdfSampler, msdfUV).rgb; var dist = textureSample(msdfTexture, linearSampler, msdfUV).rgb;
var sigDist = median3(dist) - 0.5; var sigDist = median3(dist) - 0.5;
var alpha = clamp(sigDist / fwidth(sigDist) + 0.5, 0.0, 1.0); var alpha = clamp(sigDist / fwidth(sigDist) + 0.5, 0.0, 1.0);