Теперь я хочу иметь возможность добавлять и удалять огни во время выполнения, но не могу понять, как. Алгоритм, который я сейчас пытаюсь, предназначен для каждого типа света (точка, направление, пятно), принять прожекторы, например: < /p>
Свяжите текстуру_depth_2d_array < /code> в виде глубины Texture с Spotlights Shadow Pass.
Код: Выделить всё
const depthTextureSpot = this._device.createTexture({
dimension: '2d',
size: [512, 512, scene.spotLights.length || 1],
format: 'depth32float',
usage:
GPUTextureUsage.TEXTURE_BINDING |
GPUTextureUsage.COPY_DST |
GPUTextureUsage.RENDER_ATTACHMENT,
})
const depthTextureSpotView = depthTextureSpot.createView({
dimension: '2d-array',
})
const spotLightShadowPass = commandEncoder.beginRenderPass({
colorAttachments: [],
depthStencilAttachment: {
view: depthTextureSpotView,
depthClearValue: 1.0,
depthLoadOp: 'clear',
depthStoreOp: 'store',
},
})
< /code>
Рассчитайте значения глубины из POV каждого света и сохраняют их в соответствующей «текстуре» в Texture_depth_2d_array < /code>, поэтому у меня есть теневые карты для всех светов этого типа (этот код не работает). < /li>
< /ol>
@vertex
fn vertex_main(vert: VertexInput) -> @builtin(position) vec4f {
for (var i = 0u; i < arrayLength(&pointLightsBuffer.lights); i++) {
let light_view_projection_matrix =
pointLightsBuffer.lights[i].light_projection_matrix * pointLightsBuffer.lights[i].light_view_matrix;
return light_view_projection_matrix * node_params.transform * float4(vert.position, 1.0);
};
return float4(vert.position, 1.0);
};
< /code>
Пропустить полученную Texture_depth_2d_array < /code> для визуализации и прочтения значений глубины, чтобы вычислять конечный цвет. Texture_depth_2d_array
Все учебные пособия и бумаги, которые я читал до сих пор, справляется с предопределенным количеством света и имеет отдельный проход для каждого индивидуального света. Если это так, то как преодолеть препятствия, описанные выше? И если это не так (что, скорее всего), что является стандартным подходом к рендерингу n огней с теневыми картами в Webgpu?
Подробнее здесь: https://stackoverflow.com/questions/796 ... u-renderer