26a3cda6f6
Étape 2 du plan 3D+Phong : nouveau shader unifié, non encore branché à un pipeline (Étape 3 : infra uniforms). - shaders/standard_shader.wgsl : contrat vertex complet (position/normal/uv/color, 56 octets, corrige la défaut latente du basic) ; 2 bind groups formative frame (view/proj/cam_pos/light_dir/light_color/options) + object (model) ; éclairage hemisphérique ambient + diffuse directionnel; mode unlit (options.x) pour que la 2D plate soit un cas partticulier de la 3D. - utils/conf.rs : constantes STANDARD_SHADER_PATH + STANDARD_SHADER (include_str!). - tests/wgsl_validate.rs : validation hors-ligne naga (via wgpu::naga, aucune nouvelle dépendance) tant que le shader n'est pas compilé par un pipeline. - shaders/README.md : documente le contrat standard et le statut du basic. - Erreur WGSL corrigée en validation: cast mat4x4->mat3x3 non supporte, remplacé par construction explicite de la sous-matrice 3x3. - Validation: cargo test (naga OK), check workspace+examples 0 warning, doc OK, fmt OK.
31 lines
1.4 KiB
Rust
31 lines
1.4 KiB
Rust
//! # Validation WGSL (naga)
|
||
//!
|
||
//! Le shader `standard_shader.wgsl` n'est pas encore chargé par un `RenderPipeline` (voir Étapes 3–5) :
|
||
//! cette validation hors-ligne via `wgpu::naga` est donc la **seule** garantie de sa validité tant qu'il
|
||
//! n'est pas branché. Elle protège contre les régressions futures (ré-édition du shader, changement de
|
||
//! layout) sans nécessiter de contexte GPU.
|
||
//!
|
||
//! Aucune nouvelle dépendance n'est introduite : `wgpu` ré-exporte `naga`, déjà dépendance de `wsg-lib`.
|
||
|
||
use wgpu::naga;
|
||
|
||
/// Parse et valide complètement le shader embarqué `standard_shader.wgsl` via naga.
|
||
/// Un échec ici signifie que le shader serait rejeté par `Device::create_shader_module` à l'Étape 3.
|
||
#[test]
|
||
fn standard_shader_is_valid_wgsl() {
|
||
let src = include_str!("../src/shaders/standard_shader.wgsl");
|
||
let module = naga::front::wgsl::parse_str(src)
|
||
.unwrap_or_else(|e| panic!("standard_shader.wgsl : erreur de parsing : {e:?}"));
|
||
|
||
let mut validator = naga::valid::Validator::new(
|
||
naga::valid::ValidationFlags::all(),
|
||
naga::valid::Capabilities::all(),
|
||
);
|
||
validator
|
||
.validate(&module)
|
||
.unwrap_or_else(|e| panic!("standard_shader.wgsl : échec de validation : {e:?}"));
|
||
|
||
// Contrat : exactement les deux entrées vs_main / fs_main attendues.
|
||
assert!(module.entry_points.len() >= 2, "vs_main + fs_main attendus");
|
||
}
|