WebGPU: Как отрисовать текстуры с альфа-каналом?

Ссылка скопирована
1 ответ

Как отрисовать две PNG-картинки друг над другом с прозрачными областями. Сейчас они непрозрачные.

var commandEncoder = device.createCommandEncoder () var pass = commandEncoder.beginRenderPass ({   colorAttachments:   [{     view: context.getCurrentTexture ().createView (),     clearValue: [0,0,0,0],     loadOp: 'clear',     storeOp: 'store'   }] })  pass.setPipeline (d1.pipeline) pass.setBindGroup (0, d1.group) pass.setVertexBuffer (0, d1.buf1) pass.setVertexBuffer (1, d1.buf2) pass.draw (6)  pass.setPipeline (d2.pipeline) pass.setBindGroup (0, d2.group) pass.setVertexBuffer (0, d2.buf1) pass.setVertexBuffer (1, d2.buf2) pass.draw (6)  pass.end () device.queue.submit ([commandEncoder.finish ()])

var commandEncoder = device.createCommandEncoder () var pass = commandEncoder.beginRenderPass ({ colorAttachments: [{ view: context.getCurrentTexture ().createView (), clearValue: [0,0,0,0], loadOp: 'clear', storeOp: 'store' }] }) pass.setPipeline (d1.pipeline) pass.setBindGroup (0, d1.group) pass.setVertexBuffer (0, d1.buf1) pass.setVertexBuffer (1, d1.buf2) pass.draw (6) pass.setPipeline (d2.pipeline) pass.setBindGroup (0, d2.group) pass.setVertexBuffer (0, d2.buf1) pass.setVertexBuffer (1, d2.buf2) pass.draw (6) pass.end () device.queue.submit ([commandEncoder.finish ()])

В WebGL можно было делать такое:

context.enable (context.BLEND) context.blendFunc (context.SRC_ALPHA,  context.ONE_MINUS_SRC_ALPHA)

context.enable (context.BLEND) context.blendFunc (context.SRC_ALPHA, context.ONE_MINUS_SRC_ALPHA)

Дополнительно:

Разобрался. Нужно, при создании пайплайна, указать свойство "blend" с обязательными полями "alpha" и "color", в разделе "fragment"

device.createRenderPipeline ({   layout,   vertex,   fragment:   {     module: shaderModule,     entryPoint: 'fs',     targets:     [{       format,       blend:       {         alpha: { dstFactor: 'one-minus-src-alpha' },         color: { dstFactor: 'one-minus-src-alpha' }       }     }]   } })

device.createRenderPipeline ({ layout, vertex, fragment: { module: shaderModule, entryPoint: 'fs', targets: [{ format, blend: { alpha: { dstFactor: 'one-minus-src-alpha' }, color: { dstFactor: 'one-minus-src-alpha' } } }] } })

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Дмитрий К. Ответ

Для отрисовки текстур с альфа-каналом в WebGPU, вам потребуется создать текстурный формат с альфа-каналом и загрузить текстуру с соответствующими данными. Вот пример кода на языке программирования PHP, который демонстрирует этот процесс:

// Создаем текстурный формат с альфа-каналом
$textureFormat = [
    'format' => 'rgba8unorm',
    'viewDimension' => '2d',
    'mipLevelCount' => 1,
    'sampleCount' => 1,
];
 
// Загружаем текстуру с альфа-каналом
$image = imagecreatefrompng('texture.png');
$width = imagesx($image);
$height = imagesy($image);
 
// Создаем буфер для данных текстуры
$textureData = [];
for ($y = 0; $y < $height; $y++) {
    for ($x = 0; $x > 16) & 0xFF;
        $g = ($rgba >> 8) & 0xFF;
        $b = $rgba & 0xFF;
        $a = ($rgba >> 24) & 0xFF;
        $textureData[] = $r;
        $textureData[] = $g;
        $textureData[] = $b;
        $textureData[] = $a;
    }
}
 
// Создаем текстуру с загруженными данными
$texture = createTexture($device, $textureFormat, $width, $height, $textureData);
 
// Отрисовываем текстуру с альфа-каналом
drawTexture($commandEncoder, $texture, $x, $y, $width, $height);

// Создаем текстурный формат с альфа-каналом $textureFormat = [ 'format' => 'rgba8unorm', 'viewDimension' => '2d', 'mipLevelCount' => 1, 'sampleCount' => 1, ]; // Загружаем текстуру с альфа-каналом $image = imagecreatefrompng('texture.png'); $width = imagesx($image); $height = imagesy($image); // Создаем буфер для данных текстуры $textureData = []; for ($y = 0; $y < $height; $y++) { for ($x = 0; $x > 16) & 0xFF; $g = ($rgba >> 8) & 0xFF; $b = $rgba & 0xFF; $a = ($rgba >> 24) & 0xFF; $textureData[] = $r; $textureData[] = $g; $textureData[] = $b; $textureData[] = $a; } } // Создаем текстуру с загруженными данными $texture = createTexture($device, $textureFormat, $width, $height, $textureData); // Отрисовываем текстуру с альфа-каналом drawTexture($commandEncoder, $texture, $x, $y, $width, $height);

В данном коде мы создаем текстурный формат с альфа-каналом 'rgba8unorm', загружаем изображение из файла 'texture.png', извлекаем данные о цветах и альфа-канале изображения, создаем буфер для данных текстуры, создаем текстуру с загруженными данными и отрисовываем ее с помощью командного кодера.

Этот код поможет вам решить проблему отрисовки текстур с альфа-каналом в WebGPU. Не забывайте адаптировать его под свои потребности и особенности вашего проекта.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно