WGSL의 클립 거리
클립 거리를 사용하면 꼭짓점 단계의 출력에서 사용자 정의 절반 공간으로 기본 요소의 클립 볼륨을 제한할 수 있습니다. 클리핑 평면을 직접 정의하면 WebGPU 장면에서 표시되는 항목을 더 세부적으로 제어할 수 있습니다. 이 기법은 시각화에 대한 정밀한 제어가 중요한 CAD 소프트웨어와 같은 애플리케이션에 특히 유용합니다.
GPUAdapter에서 "clip-distances" 기능을 사용할 수 있는 경우 이 기능이 있는 GPUDevice를 요청하여 WGSL에서 클립 거리 지원을 받고 enable clip_distances;를 사용하여 WGSL 코드에서 이 확장 프로그램을 명시적으로 사용 설정합니다. 사용 설정하면 꼭짓점 셰이더에서 clip_distances 내장 배열을 사용할 수 있습니다. 이 배열은 사용자 정의 클립 평면까지의 거리를 보유합니다.
- 클립 거리가 0이면 꼭짓점이 평면에 있음을 의미합니다.
- 거리가 양수이면 꼭짓점이 클립 반공간 (유지하려는 쪽) 내에 있음을 의미합니다.
- 거리가 음수이면 꼭짓점이 클립 절반 공간 (삭제하려는 쪽) 밖에 있음을 의미합니다.
다음 스니펫, chromestatus 항목, 문제 358408571을 참고하세요.
const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("clip-distances")) {
throw new Error("Clip distances support is not available");
}
// Explicitly request clip distances support.
const device = await adapter.requestDevice({
requiredFeatures: ["clip-distances"],
});
const vertexShaderModule = device.createShaderModule({ code: `
enable clip_distances;
struct VertexOut {
@builtin(clip_distances) my_clip_distances : array<f32, 1>,
@builtin(position) my_position : vec4f,
}
@vertex fn main() -> VertexOut {
var output : VertexOut;
output.my_clip_distances[0] = 1;
output.my_position = vec4f(0, 0, 0, 1);
return output;
}
`,
});
// Send the appropriate commands to the GPU...
GPUCanvasContext getConfiguration()
구성 사전으로 GPUCanvasContext configure()를 호출하면 GPUCanvasContext getConfiguration() 메서드를 사용하여 캔버스 컨텍스트 구성을 확인할 수 있습니다. device, format, usage, viewFormats, colorSpace, toneMapping, alphaMode 회원이 포함됩니다. 이는 파티클 (HDR) 샘플에 표시된 것처럼 브라우저가 HDR 캔버스를 지원하는지 확인하는 등의 작업에 유용합니다. 다음 스니펫, chromestatus 항목, 문제 370109829를 참고하세요.
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const canvas = document.querySelector("canvas");
const context = canvas.getContext("webgpu");
// Configure the canvas for HDR.
context.configure({
device,
format: "rgba16float",
toneMapping: { mode: "extended" },
});
const configuration = context.getConfiguration();
if (configuration.toneMapping.mode === "extended") {
// The browser supports HDR canvas.
// Warning! The user still needs a HDR display to enjoy HDR content.
}
점 및 선 기본 요소에는 깊이 바이어스가 없어야 함
이전에 발표한 바와 같이 이제 WebGPU 사양에서는 렌더링 파이프라인의 토폴로지가 선 또는 점 유형인 경우 depthBias, depthBiasSlopeScale, depthBiasClamp을 0이 아닌 값으로 설정하면 유효성 검사 오류가 발생합니다. 문제 352567424를 참고하세요.
하위 그룹에 대한 포괄적 스캔 기본 제공 함수
하위 그룹 실험의 일환으로 문제 361330160에 다음 하위 그룹 기본 제공 함수가 추가되었습니다.
subgroupInclusiveAdd(value): 하위 그룹에서 모든 활성 호출value의 포괄적 스캔 합계를 반환합니다.subgroupInclusiveMul(value): 하위 그룹에서 활성 호출value의 포괄적 스캔 곱셈을 반환합니다.
multi-draw indirect 실험 지원
멀티 드로우 간접 GPU 기능을 사용하면 단일 GPU 명령어로 여러 드로우 호출을 실행할 수 있습니다. 이는 파티클 시스템, 인스턴싱, 대규모 장면과 같이 많은 수의 객체를 렌더링해야 하는 상황에서 특히 유용합니다. drawIndirect() 및 drawIndexedIndirect() GPURenderPassEncoder 메서드는 GPU 버퍼의 특정 영역에서 한 번에 하나의 그리기 호출만 실행할 수 있습니다.
이 실험적 기능이 표준화될 때까지 chrome://flags/#enable-unsafe-webgpu에서 '안전하지 않은 WebGPU 지원' 플래그를 사용 설정하여 Chrome에서 사용할 수 있도록 합니다.
GPUAdapter에서 사용할 수 있는 "chromium-experimental-multi-draw-indirect" 비표준 GPU 기능을 사용하여 이 기능이 있는 GPUDevice를 요청합니다. 그런 다음 GPUBufferUsage.INDIRECT 사용으로 GPUBuffer를 만들어 그리기 호출을 저장합니다. 나중에 새로운 multiDrawIndirect() 및 multiDrawIndexedIndirect() GPURenderPassEncoder 메서드에서 사용하여 렌더링 패스 내에서 그리기 호출을 실행할 수 있습니다. 다음 스니펫과 문제 356461286을 참고하세요.
const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("chromium-experimental-multi-draw-indirect")) {
throw new Error("Experimental multi-draw indirect support is not available");
}
// Explicitly request experimental multi-draw indirect support.
const device = await adapter.requestDevice({
requiredFeatures: ["chromium-experimental-multi-draw-indirect"],
});
// Draw call have vertexCount, instanceCount, firstVertex, and firstInstance parameters.
const drawData = new Uint32Array([
3, 1, 0, 0, // First draw call
3, 1, 3, 0, // Second draw call
]);
// Create a buffer to store the draw calls.
const drawBuffer = device.createBuffer({
size: drawData.byteLength,
usage: GPUBufferUsage.INDIRECT | GPUBufferUsage.COPY_DST,
});
device.queue.writeBuffer(drawBuffer, 0, drawData);
// Create a render pipeline, a vertex buffer, and a render pass encoder...
// Inside a render pass, issue the draw calls.
myPassEncoder.setPipeline(myPipeline);
myPassEncoder.setVertexBuffer(0, myVertexBuffer);
myPassEncoder.multiDrawIndirect(drawBuffer, /*offset=*/ 0, /*maxDrawCount=*/ 2);
myPassEncoder.end();
셰이더 모듈 컴파일 옵션 엄격한 수학
셰이더 모듈 컴파일 중에 엄격한 수학을 사용 설정하거나 사용 중지할 수 있도록 불리언 strictMath 개발자 옵션이 GPUShaderModuleDescriptor에 추가되었습니다. chrome://flags/#enable-webgpu-developer-features의 'WebGPU 개발자 기능' 플래그 뒤에 있으며 개발 중에만 사용하도록 설계된 기능입니다. 문제 42241455를 참고하세요.
이 옵션은 현재 Metal 및 Direct3D에서 지원됩니다. 엄격한 수학이 사용 중지되면 컴파일러는 다음을 통해 셰이더를 최적화할 수 있습니다.
- NaN 및 Infinity 값의 가능성을 무시합니다.
- -0을 +0으로 처리합니다.
- 나누기를 역수를 곱하는 더 빠른 곱셈으로 대체
- 결합 법칙과 분배 법칙에 따라 연산을 재정렬합니다.
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const code = `
// Examines the bit pattern of the floating-point number to
// determine if it represents a NaN according to the IEEE 754 standard.
fn isNan(x : f32) -> bool {
bool ones_exp = (bitcast<u32>(x) & 0x7f8) == 0x7f8;
bool non_zero_sig = (bitcast<u32>(x) & 0x7ffff) != 0;
return ones_exp && non_zero_sig;
}
// ...
`;
// Enable strict math during shader compilation.
const shaderModule = device.createShaderModule({ code, strictMath: true });
GPUAdapter requestAdapterInfo() 삭제
GPUAdapter info 속성을 사용하여 GPUAdapterInfo를 동기적으로 가져올 수 있으므로 GPUAdapter requestAdapterInfo() 비동기 메서드는 중복됩니다. 따라서 비표준 GPUAdapter requestAdapterInfo() 메서드가 삭제되었습니다. 삭제 의도를 참고하세요.
Dawn 업데이트
tint_benchmark 실행 파일은 WGSL에서 각 백엔드 언어로 셰이더를 변환하는 비용을 측정합니다. 자세한 내용은 새로운 문서를 참고하세요.
여기에서는 주요 사항 중 일부만 다룹니다. 전체 커밋 목록을 확인하세요.
WebGPU의 새로운 기능
WebGPU의 새로운 기능 시리즈에서 다룬 모든 내용의 목록입니다.
Chrome 142
Chrome 141
Chrome 140
- 기기 요청이 어댑터를 사용함
- 텍스처 뷰가 사용되는 경우 텍스처를 사용하는 약식 표현
- WGSL textureSampleLevel이 1D 텍스처 지원
- bgra8unorm 읽기 전용 스토리지 텍스처 사용 지원 중단
- GPUAdapter isFallbackAdapter 속성 삭제
- Dawn 업데이트
Chrome 139
Chrome 138
- 버퍼를 바인딩 리소스로 사용하는 약식 표현
- 생성 시 매핑된 버퍼의 크기 요구사항 변경
- 최신 GPU의 아키텍처 보고
- GPUAdapter isFallbackAdapter 속성 지원 중단
- Dawn 업데이트
Chrome 137
- externalTexture 바인딩에 텍스처 뷰 사용
- 오프셋과 크기를 지정하지 않고 버퍼를 복사함
- 원자에 대한 포인터를 사용하는 WGSL workgroupUniformLoad
- GPUAdapterInfo powerPreference 속성
- GPURequestAdapterOptions compatibilityMode 속성 삭제
- Dawn 업데이트
Chrome 136
Chrome 135
- null 바인드 그룹 레이아웃으로 파이프라인 레이아웃 만들기 허용
- 표시 영역이 렌더링 타겟 경계를 지나 확장되도록 허용
- Android에서 실험용 호환성 모드에 더 쉽게 액세스
- maxInterStageShaderComponents 한도 삭제
- Dawn 업데이트
Chrome 134
Chrome 133
- unorm8x4-bgra 및 1컴포넌트 정점 형식 추가
- 정의되지 않은 값으로 알 수 없는 한도를 요청하도록 허용
- WGSL 정렬 규칙 변경사항
- discard를 사용한 WGSL 성능 향상
- 외부 텍스처에 VideoFrame displaySize 사용
- copyExternalImageToTexture를 사용하여 기본이 아닌 방향의 이미지 처리
- 개발자 환경 개선
- featureLevel로 호환성 모드 사용 설정
- 실험용 하위 그룹 기능 정리
- maxInterStageShaderComponents 한도 지원 중단
- Dawn 업데이트
Chrome 132
- 텍스처 뷰 사용
- 32비트 부동 소수점 텍스처 혼합
- GPUDevice adapterInfo 속성
- 잘못된 형식으로 캔버스 컨텍스트를 구성하면 JavaScript 오류가 발생함
- 텍스처에 대한 필터링 샘플러 제한
- 확장된 하위 그룹 실험
- 개발자 환경 개선
- 16비트 정규화된 텍스처 형식에 대한 실험적 지원
- Dawn 업데이트
Chrome 131
- WGSL에서의 클립 거리
- GPUCanvasContext getConfiguration()
- 점 및 선 기본 요소에는 깊이 바이어스가 없어야 함
- 하위 그룹에 대한 포괄적 스캔 기본 제공 함수
- multi-draw indirect 실험적 지원
- 셰이더 모듈 컴파일 옵션 엄격한 수학
- GPUAdapter requestAdapterInfo() 삭제
- Dawn 업데이트
Chrome 130
Chrome 129
Chrome 128
- 하위 그룹 실험
- 선과 점의 깊이 바이어스 설정 지원 중단
- preventDefault인 경우 uncaptured error DevTools 경고 숨기기
- WGSL 보간 샘플링 first 및 either
- Dawn 업데이트
Chrome 127
Chrome 126
Chrome 125
Chrome 124
Chrome 123
- WGSL의 DP4a 내장 함수 지원
- WGSL의 무제한 포인터 파라미터
- WGSL의 컴포지트를 역참조하기 위한 문법 설탕
- 스텐실 및 깊이 측면의 읽기 전용 상태 분리
- Dawn 업데이트
Chrome 122
Chrome 121
- Android에서 WebGPU 지원
- Windows에서 셰이더 컴파일에 FXC 대신 DXC 사용
- 컴퓨팅 및 렌더링 패스에서 타임스탬프 쿼리
- 셰이더 모듈의 기본 진입점
- GPUExternalTexture 색상 공간으로 display-p3 지원
- 메모리 힙 정보
- Dawn 업데이트
Chrome 120
Chrome 119
Chrome 118
copyExternalImageToTexture()의 HTMLImageElement 및 ImageData 지원- 읽기-쓰기 및 읽기 전용 스토리지 텍스처 실험적 지원
- Dawn 업데이트
Chrome 117
- 정점 버퍼 설정 해제
- 바인드 그룹 설정 해제
- 기기가 손실된 경우 비동기 파이프라인 생성에서 오류 무시
- SPIR-V 셰이더 모듈 생성 업데이트
- 개발자 환경 개선
- 자동으로 생성된 레이아웃으로 파이프라인 캐싱
- Dawn 업데이트
Chrome 116
- WebCodecs 통합
- GPUAdapter
requestDevice()에서 반환된 손실된 기기 importExternalTexture()가 호출되는 경우 동영상 재생을 원활하게 유지- 사양 준수
- 개발자 환경 개선
- Dawn 업데이트