WGSL fragment_depth 확장 프로그램
지오메트리 집약적인 렌더링 패스에서 초기 Z 최적화는 개발자에게 유용한 도구입니다. GPU가 비용이 많이 드는 프래그먼트 셰이더를 실행하기 전에 숨겨진 픽셀을 삭제하도록 하여 성능을 크게 향상합니다. 래스터화된 깊이가 깊이 테스트를 통과하지 못하면 셰이더에 다른 부작용이 없는 한 GPU는 프래그먼트 셰이더를 완전히 건너뜁니다.
하드웨어에서 이를 처리하는 방법을 자세히 알아보려면 MJP의 When Does Early-Z Have to be Disabled?(조기 Z를 사용 중지해야 하는 경우)를 참고하세요.
맞춤 깊이 조작은 유용하지만 프래그먼트 셰이더에서 조작하면 숨겨진 세금이 부과됩니다. 프래그먼트 셰이더 내에서 @builtin(frag_depth)에 쓰면 일반적으로 드라이버가 전체 그리기 호출에 대해 이러한 초기 Z 최적화를 사용 중지해야 합니다. 이는 드라이버 휴리스틱이 셰이더에서 계산된 출력 깊이가 래스터라이저에서 보간된 깊이와 일치한다고 보장할 수 없기 때문입니다.
이 성능 저하를 해결하기 위해 WGSL 확장 프로그램 fragment_depth을 사용하면 @builtin(frag_depth)에서 less 또는 greater 깊이 모드 이름을 지정하여 작성된 깊이가 보간된 깊이와 어떻게 비교되는지 명시적으로 나타낼 수 있으므로 GPU가 초기 Z 최적화를 안전하게 적용할 수 있습니다.
이 언어 확장 프로그램은 JavaScript에서 navigator.gpu.wgslLanguageFeatures를 사용하여 기능 감지할 수 있습니다. WGSL 셰이더 코드 상단에서 requires-directive를 사용하여 requires fragment_depth;와의 비호환성 가능성을 알리는 것이 좋습니다. 다음 예시와 배송 의도를 참고하세요.
if (!navigator.gpu.wgslLanguageFeatures.has("fragment_depth")) {
throw new Error(`WGSL fragment depth is not available`);
}
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const shaderModule = device.createShaderModule({ code: `
requires fragment_depth;
@fragment
fn main() -> @builtin(frag_depth, less) f32 {
// Explicitly states that the output fragment depth is less than early-Z depth,
// allowing the GPU to safely preserve early-Z optimizations.
return 0.0f;
}`,
});
텍스처 압축 정렬되지 않음
'texture-compression-unaligned' GPU 기능을 사용하면 블록 크기의 정수 배수가 아닌 크기 (예: BC, ETC2, ASTC 형식의 경우 4x4)로 압축된 텍스처를 만들 수 있습니다. 이전에는 WebGPU에서 텍스처 크기가 이러한 블록 경계와 정렬되도록 엄격하게 요구했습니다. 이 기능은 블록 정렬에 맞게 텍스처를 패딩하거나 확장할 필요가 없으므로 확장 왜곡을 도입하지 않고 원래 압축 충실도를 유지합니다. 출시 의도를 참고하세요.
다음 코드 스니펫은 어댑터가 정렬되지 않은 텍스처 압축을 지원하는지 확인하고 지원하는 경우 이를 사용하는 기기를 요청합니다.
const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("texture-compression-unaligned")) {
throw new Error("Texture compression unaligned support is not available");
}
// Explicitly request texture compression unaligned support.
const device = await adapter.requestDevice({
requiredFeatures: ["texture-compression-unaligned"],
});
이 기능, 사양, CTS 작업을 추진해 주신 spark.js의 외부 기여자 Ignacio Castaño님께 감사드립니다.
srgb-linear 및 display-p3-linear 색공간
'srgb-linear' 및 'display-p3-linear' 사전 정의된 색상 공간이 추가됨에 따라 WebGPU 캔버스 컨텍스트가 이제 확장 범위 선형 색상 공간으로 직접 렌더링하여 넓은 색 영역 디스플레이를 지원할 수 있습니다. 이러한 색상 공간은 픽셀 값과 물리적 휘도 간의 선형 관계를 유지합니다. 따라서 게임의 물리적 조명 렌더링은 물론 앤티앨리어싱, 보간, 데시메이션과 같은 공간 처리 작업에 이상적입니다. 출시 의도 및 입자 (HDR) 샘플 PR #574를 참고하세요.
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const canvas = document.querySelector("canvas");
const context = canvas.getContext("webgpu");
context.configure({
device,
format: "rgba16float",
colorSpace: "display-p3-linear",
});
snorm10-10-10-2 정점 형식 추가
'snorm10-10-10-2' 정점 형식은 부호 있는 정규화된 값 4개를 보유하는 패킹된 32비트 형식입니다. 10비트 구성요소 3개 (r, g, b)와 2비트 구성요소 1개 (a)가 있습니다. 이 형식을 사용하면 메모리 대역폭을 절약하면서 추가 2비트 스칼라 또는 정렬 플래그가 있는 3D 법선 벡터와 같은 속성을 효율적으로 저장할 수 있습니다. 사양 PR 6491을 참고하세요.
NVIDIA의 Linux에서 f16 지원
WGSL에서 16비트 부동 소수점 값 지원을 제공하는 선택적 'shader-f16' 기능이 이제 최신 NVIDIA GPU 드라이버용 Linux에서 지원됩니다. 문제 chromium:42251215를 참고하세요.
여명 업데이트
이제 WGPUAdapterPropertiesD3D 구조체를 사용하여 지정된 GPU 어댑터의 기본 DXGIAdapter LUID를 쿼리할 수 있습니다. 문제 chromium:562849566을 참고하세요.
여기에는 몇 가지 주요 사항이 포함되어 있습니다. 커밋 목록을 자세히 확인하세요.
WebGPU의 새로운 기능
WebGPU의 새로운 기능 시리즈에서 다룬 모든 내용의 목록입니다.
Chrome 155~156
- WGSL fragment_depth 확장 프로그램
- 텍스처 압축이 정렬되지 않음
- srgb-linear 및 display-p3-linear 색상 공간
- snorm10-10-10-2 정점 형식 추가
- NVIDIA의 Linux에서 f16 지원
- Dawn 업데이트
Chrome 153~154
Chrome 151~152
Chrome 149~150
Chrome 147~148
Chrome 146
Chrome 145
Chrome 144
- WGSL subgroup_id 확장 프로그램
- WGSL uniform_buffer_standard_layout 확장 프로그램
- Linux의 WebGPU
- writeBuffer 및 writeTexture 속도 향상
- Dawn 업데이트
Chrome 143
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()
- 점 및 선 기본 요소에는 깊이 바이어스가 없어야 함
- 하위 그룹에 대한 포괄적 스캔 기본 제공 함수
- 다중 그리기 간접 실험적 지원
- 셰이더 모듈 컴파일 옵션 strict math
- 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 업데이트