Explorar o código

fix(cockpit): use GLSL3 fragment input in scene-grade shader (#36)

调色后处理 GRADE_FRAGMENT_SHADER 仍用 GLSL1 的 varying 声明
v_textureCoordinates,而 Cesium 1.145 在 WebGL2 下对所有 shader 前置
#version 300 es(GLSL ES 3.00 已删除 varying 关键字)→ 编译失败即
整帧 Rendering has stopped,地图黑屏。同文件雾 shader 早在 8db64fc
已迁 in vec2,调色 shader 漏迁(引入提交 e2529b5)。

修复:仅将该片元输入改为 in vec2 v_textureCoordinates;——不关效果、
不改数学/uniform/配置,与 Cesium 自带 ViewportQuadVS(out vec2)及其
片元(in vec2)接口一致。

回归锁定:t49 闸门原断言「varying 是正确写法」恰把本缺陷当规格,改为
对 GRADE/FOG 两个实际 stage 断言 GLSL3 输入并拒绝 varying/texture2D/
gl_FragColor(先红后绿)。

验证:t49 7/7、t38 全过;全 cockpit 源码零 GLSL1 残留;真机 real 页面
连续渲染无 shader 错误(调色级按 config 显式启用,编译必经)。缺陷仅在
未推送的本地链上(origin/master 无调色处理级),故本修复随本分支后续
推送一并上线。
Kazerin hai 1 semana
pai
achega
850c6c675c

+ 11 - 3
.scratch/cockpit-shell-panel-layout/verify/t49-scene-grade.mjs

@@ -97,9 +97,17 @@ const { builtinConfig, normalizeConfig } = await import('../../../src/modules/co
     assert.ok(shader.includes('0.2126, 0.7152, 0.0722'), '同一套 Rec.709 亮度权重')
     assert.ok(shader.includes('out_FragColor'), '用 Cesium 当前的 out_FragColor 出口')
     assert.ok(shader.includes('gradeTintStrength * (1.0 - luma)'), '阴影权重公式与 domain 一致')
-    // varying 而不是 in:与雾 shader(真机验证过的模板)保持一致;写 in 是并行会话的
-    // 未提交实验,GLSL 翻译行为未经验证, shader 编译失败 = 整帧失败 = 三维场景消失。
-    assert.ok(shader.includes('varying vec2 v_textureCoordinates;'), 'shader 用雾同款 varying 模板')
+    // Installed Cesium ViewportQuadVS outputs v_textureCoordinates under GLSL 300 es.
+    // The browser compile log proves `varying` is invalid; assert both actual stage sources.
+    for (const name of ['GRADE_FRAGMENT_SHADER', 'FOG_FRAGMENT_SHADER']) {
+        const source = engine.match(new RegExp('const ' + name + ' = `([\\s\\S]*?)`'))?.[1]
+        assert.ok(source, `${name} must exist`)
+        // 截断哨兵:正则假定模板内无反引号;若日后出现,source 会被静默截断。
+        // 模板以 void main 收尾,断言它同时挡「提取失败」与「提取被截断」两种失配。
+        assert.ok(source.includes('void main'), `${name} extraction intact (ends at void main, not truncated by a stray backtick)`)
+        assert.ok(source.includes('in vec2 v_textureCoordinates;'), `${name} uses GLSL3 fragment input`)
+        assert.ok(!/\bvarying\b|\btexture2D\b|\bgl_FragColor\b/.test(source), `${name} rejects GLSL1 syntax`)
+    }
     console.log('PASS C1 引擎处理级:函数 uniform、enabled 随计划、shader 与 domain 同序同式')
 }
 

+ 1 - 1
src/modules/cockpit/services/cesiumEngine.js

@@ -726,7 +726,7 @@ uniform float gradeBrightness;
 uniform float gradeContrast;
 uniform vec3 gradeTint;
 uniform float gradeTintStrength;
-varying vec2 v_textureCoordinates;
+in vec2 v_textureCoordinates;
 void main(void)
 {
     vec4 base = texture(colorTexture, v_textureCoordinates);