feat(shaders): add standard Phong shader with uniform contract (data only)
É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.
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
//! # 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");
|
||||
}
|
||||
Reference in New Issue
Block a user