6d91e591-4ce0-465c-809f-610ec95019c6.json 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. {
  2. "__type__": "cc.EffectAsset",
  3. "_name": "builtin-unlit",
  4. "_objFlags": 0,
  5. "_native": "",
  6. "properties": null,
  7. "techniques": [
  8. {
  9. "name": "opaque",
  10. "passes": [
  11. {
  12. "blendState": {
  13. "targets": [
  14. {
  15. "blend": true
  16. }
  17. ]
  18. },
  19. "rasterizerState": {
  20. "cullMode": 0
  21. },
  22. "depthStencilState": {
  23. "depthTest": true,
  24. "depthWrite": true
  25. },
  26. "properties": {
  27. "diffuseTexture": {
  28. "value": "white",
  29. "type": 29
  30. },
  31. "diffuseColor": {
  32. "value": [
  33. 1,
  34. 1,
  35. 1,
  36. 1
  37. ],
  38. "editor": {
  39. "type": "color"
  40. },
  41. "type": 16
  42. },
  43. "alphaThreshold": {
  44. "value": [
  45. 0.5
  46. ],
  47. "type": 13
  48. },
  49. "mainTiling": {
  50. "value": [
  51. 1,
  52. 1
  53. ],
  54. "type": 14
  55. },
  56. "mainOffset": {
  57. "value": [
  58. 0,
  59. 0
  60. ],
  61. "type": 14
  62. }
  63. },
  64. "program": "builtin-unlit|unlit-vs|unlit-fs"
  65. }
  66. ]
  67. },
  68. {
  69. "name": "transparent",
  70. "passes": [
  71. {
  72. "stage": "transparent",
  73. "blendState": {
  74. "targets": [
  75. {
  76. "blend": true
  77. }
  78. ]
  79. },
  80. "rasterizerState": {
  81. "cullMode": 0
  82. },
  83. "depthStencilState": {
  84. "depthTest": true,
  85. "depthWrite": true
  86. },
  87. "properties": {
  88. "diffuseTexture": {
  89. "value": "white",
  90. "type": 29
  91. },
  92. "diffuseColor": {
  93. "value": [
  94. 1,
  95. 1,
  96. 1,
  97. 1
  98. ],
  99. "editor": {
  100. "type": "color"
  101. },
  102. "type": 16
  103. },
  104. "alphaThreshold": {
  105. "value": [
  106. 0.5
  107. ],
  108. "type": 13
  109. },
  110. "mainTiling": {
  111. "value": [
  112. 1,
  113. 1
  114. ],
  115. "type": 14
  116. },
  117. "mainOffset": {
  118. "value": [
  119. 0,
  120. 0
  121. ],
  122. "type": 14
  123. }
  124. },
  125. "program": "builtin-unlit|unlit-vs|unlit-fs"
  126. }
  127. ]
  128. }
  129. ],
  130. "shaders": [
  131. {
  132. "hash": 922858114,
  133. "glsl3": {
  134. "vert": "\nprecision highp float;\nuniform CCLocal {\n mat4 cc_matWorld;\n mat4 cc_matWorldIT;\n};\nuniform CCGlobal {\n mat4 cc_matView;\n mat4 cc_matViewInv;\n mat4 cc_matProj;\n mat4 cc_matProjInv;\n mat4 cc_matViewProj;\n mat4 cc_matViewProjInv;\n vec4 cc_cameraPos;\n vec4 cc_time;\n mediump vec4 cc_screenSize;\n mediump vec4 cc_screenScale;\n};\n#if CC_USE_SKINNING\n in vec4 a_weights;\n in vec4 a_joints;\n #if CC_USE_JOINTS_TEXTRUE\n uniform SKINNING {\n vec2 jointsTextureSize;\n };\n uniform sampler2D jointsTexture;\n #if CC_JOINTS_TEXTURE_FLOAT32\n mat4 getBoneMatrix(const in float i) {\n float width = jointsTextureSize.x;\n float height = jointsTextureSize.y;\n float j = i * 4.0;\n float x = mod(j, width);\n float y = floor(j / width);\n float dx = 1.0 / width;\n float dy = 1.0 / height;\n y = dy * (y + 0.5);\n vec4 v1 = texture(jointsTexture, vec2(dx * (x + 0.5), y));\n vec4 v2 = texture(jointsTexture, vec2(dx * (x + 1.5), y));\n vec4 v3 = texture(jointsTexture, vec2(dx * (x + 2.5), y));\n vec4 v4 = texture(jointsTexture, vec2(dx * (x + 3.5), y));\n return mat4(v1, v2, v3, v4);\n }\n #else\n float decode32(vec4 rgba) {\n float Sign = 1.0 - step(128.0, rgba[0]) * 2.0;\n float Exponent = 2.0 * mod(rgba[0], 128.0) + step(128.0, rgba[1]) - 127.0;\n float Mantissa = mod(rgba[1], 128.0) * 65536.0 + rgba[2] * 256.0 + rgba[3] + 8388608.0;\n return Sign * exp2(Exponent - 23.0) * Mantissa;\n }\n vec4 decodevec4 (vec4 x, vec4 y, vec4 z, vec4 w) {\n return vec4(\n decode32(x.wzyx * 255.0),\n decode32(y.wzyx * 255.0),\n decode32(z.wzyx * 255.0),\n decode32(w.wzyx * 255.0)\n );\n }\n vec4 decodevec4 (float dx, float x, float y) {\n return decodevec4(\n texture(jointsTexture, vec2(dx * (x + 0.5), y)),\n texture(jointsTexture, vec2(dx * (x + 1.5), y)),\n texture(jointsTexture, vec2(dx * (x + 2.5), y)),\n texture(jointsTexture, vec2(dx * (x + 3.5), y))\n );\n }\n mat4 getBoneMatrix(const in float i) {\n float width = jointsTextureSize.x;\n float height = jointsTextureSize.y;\n float j = i * 16.0;\n float x = mod(j, width);\n float y = floor(j / width);\n float dx = 1.0 / width;\n float dy = 1.0 / height;\n y = dy * (y + 0.5);\n vec4 v1 = decodevec4(dx, x, y);\n vec4 v2 = decodevec4(dx, x+4.0, y);\n vec4 v3 = decodevec4(dx, x+8.0, y);\n vec4 v4 = decodevec4(dx, x+12.0, y);\n return mat4(v1, v2, v3, v4);\n }\n #endif\n #else\n uniform JOINT_MATRIX {\n mat4 jointMatrices[50];\n };\n mat4 getBoneMatrix(const in float i) {\n return jointMatrices[int(i)];\n }\n #endif\n mat4 skinMatrix() {\n return\n getBoneMatrix(a_joints.x) * a_weights.x +\n getBoneMatrix(a_joints.y) * a_weights.y +\n getBoneMatrix(a_joints.z) * a_weights.z +\n getBoneMatrix(a_joints.w) * a_weights.w\n ;\n }\n#endif\nstruct StandardVertInput {\n vec2 uv;\n vec4 position;\n vec3 normal;\n vec4 tangent;\n vec4 color;\n};\nin vec3 a_position;\n#if CC_USE_ATTRIBUTE_UV0\nin vec2 a_uv0;\n#endif\n#if CC_USE_ATTRIBUTE_COLOR\nin vec4 a_color;\n#endif\n#if CC_USE_ATTRIBUTE_NORMAL\nin vec3 a_normal;\n#endif\n#if CC_USE_ATTRIBUTE_TANGENT\nin vec4 a_tangent;\n#endif\nvoid CCAttribute (out StandardVertInput In) {\n In.position = vec4(a_position, 1.0);\n #if CC_USE_ATTRIBUTE_UV0\n In.uv = a_uv0;\n #else\n In.uv = vec2(0.0);\n #endif\n #if CC_USE_ATTRIBUTE_COLOR\n In.color = a_color;\n #else\n In.color = vec4(1.0);\n #endif\n #if CC_USE_ATTRIBUTE_NORMAL\n In.normal = a_normal;\n #else\n In.normal = vec3(0.0, 1.0, 0.0);\n #endif\n #if CC_USE_ATTRIBUTE_TANGENT\n In.tangent = a_tangent;\n #else\n In.tangent = vec4(1.0, 0.0, 0.0, 0.0);\n #endif\n}\nvoid CCVertInput(out StandardVertInput In) {\n CCAttribute(In);\n #if CC_USE_SKINNING\n mat4 m = skinMatrix();\n In.position = m * In.position;\n #if CC_USE_ATTRIBUTE_NORMAL\n In.normal = (m * vec4(In.normal, 0)).xyz;\n #endif\n #if CC_USE_ATTRIBUTE_TANGENT\n In.tangent = m * In.tangent;\n #endif\n #endif\n}\nuniform MAIN_TILING {\n vec2 mainTiling;\n vec2 mainOffset;\n};\n#if CC_USE_ATTRIBUTE_UV0 && USE_DIFFUSE_TEXTURE\n out mediump vec2 v_uv0;\n#endif\n#if CC_USE_ATTRIBUTE_COLOR\n out lowp vec4 v_color;\n#endif\nvoid main () {\n StandardVertInput In;\n CCVertInput(In);\n #if CC_USE_ATTRIBUTE_COLOR\n v_color = In.color;\n #endif\n #if CC_USE_ATTRIBUTE_UV0 && USE_DIFFUSE_TEXTURE\n v_uv0 = In.uv * mainTiling + mainOffset;\n #endif\n gl_Position = cc_matViewProj * cc_matWorld * In.position;\n}",
  135. "frag": "\nprecision highp float;\n#if USE_ALPHA_TEST\n uniform ALPHA_TEST {\n float alphaThreshold;\n };\n#endif\nvoid ALPHA_TEST (in vec4 color) {\n #if USE_ALPHA_TEST\n if (color.a < alphaThreshold) discard;\n #endif\n}\nvoid ALPHA_TEST (in float alpha) {\n #if USE_ALPHA_TEST\n if (alpha < alphaThreshold) discard;\n #endif\n}\nvec4 CCFragOutput (vec4 color) {\n #if OUTPUT_TO_GAMMA\n color.rgb = sqrt(color.rgb);\n #endif\n\treturn color;\n}\nuniform UNLIT {\n lowp vec4 diffuseColor;\n};\n#if USE_DIFFUSE_TEXTURE\n uniform sampler2D diffuseTexture;\n#endif\n#if CC_USE_ATTRIBUTE_COLOR\n in lowp vec4 v_color;\n#endif\n#if CC_USE_ATTRIBUTE_UV0 && USE_DIFFUSE_TEXTURE\n in mediump vec2 v_uv0;\n#endif\nvoid main () {\n vec4 color = diffuseColor;\n #if CC_USE_ATTRIBUTE_UV0 && USE_DIFFUSE_TEXTURE\n vec4 diffuseTexture_tmp = texture(diffuseTexture, v_uv0);\n #if CC_USE_ALPHA_ATLAS_diffuseTexture\n diffuseTexture_tmp.a *= texture(diffuseTexture, v_uv0 + vec2(0, 0.5)).r;\n #endif\n #if INPUT_IS_GAMMA\n color.rgb *= (diffuseTexture_tmp.rgb * diffuseTexture_tmp.rgb);\n color.a *= diffuseTexture_tmp.a;\n #else\n color *= diffuseTexture_tmp;\n #endif\n #endif\n #if CC_USE_ATTRIBUTE_COLOR\n color *= v_color;\n #endif\n ALPHA_TEST(color);\n gl_FragColor = CCFragOutput(color);\n}"
  136. },
  137. "glsl1": {
  138. "vert": "\nprecision highp float;\nuniform mat4 cc_matWorld;\nuniform mat4 cc_matViewProj;\n#if CC_USE_SKINNING\n attribute vec4 a_weights;\n attribute vec4 a_joints;\n #if CC_USE_JOINTS_TEXTRUE\n uniform vec2 jointsTextureSize;\n uniform sampler2D jointsTexture;\n #if CC_JOINTS_TEXTURE_FLOAT32\n mat4 getBoneMatrix(const in float i) {\n float width = jointsTextureSize.x;\n float height = jointsTextureSize.y;\n float j = i * 4.0;\n float x = mod(j, width);\n float y = floor(j / width);\n float dx = 1.0 / width;\n float dy = 1.0 / height;\n y = dy * (y + 0.5);\n vec4 v1 = texture2D(jointsTexture, vec2(dx * (x + 0.5), y));\n vec4 v2 = texture2D(jointsTexture, vec2(dx * (x + 1.5), y));\n vec4 v3 = texture2D(jointsTexture, vec2(dx * (x + 2.5), y));\n vec4 v4 = texture2D(jointsTexture, vec2(dx * (x + 3.5), y));\n return mat4(v1, v2, v3, v4);\n }\n #else\n float decode32(vec4 rgba) {\n float Sign = 1.0 - step(128.0, rgba[0]) * 2.0;\n float Exponent = 2.0 * mod(rgba[0], 128.0) + step(128.0, rgba[1]) - 127.0;\n float Mantissa = mod(rgba[1], 128.0) * 65536.0 + rgba[2] * 256.0 + rgba[3] + 8388608.0;\n return Sign * exp2(Exponent - 23.0) * Mantissa;\n }\n vec4 decodevec4 (vec4 x, vec4 y, vec4 z, vec4 w) {\n return vec4(\n decode32(x.wzyx * 255.0),\n decode32(y.wzyx * 255.0),\n decode32(z.wzyx * 255.0),\n decode32(w.wzyx * 255.0)\n );\n }\n vec4 decodevec4 (float dx, float x, float y) {\n return decodevec4(\n texture2D(jointsTexture, vec2(dx * (x + 0.5), y)),\n texture2D(jointsTexture, vec2(dx * (x + 1.5), y)),\n texture2D(jointsTexture, vec2(dx * (x + 2.5), y)),\n texture2D(jointsTexture, vec2(dx * (x + 3.5), y))\n );\n }\n mat4 getBoneMatrix(const in float i) {\n float width = jointsTextureSize.x;\n float height = jointsTextureSize.y;\n float j = i * 16.0;\n float x = mod(j, width);\n float y = floor(j / width);\n float dx = 1.0 / width;\n float dy = 1.0 / height;\n y = dy * (y + 0.5);\n vec4 v1 = decodevec4(dx, x, y);\n vec4 v2 = decodevec4(dx, x+4.0, y);\n vec4 v3 = decodevec4(dx, x+8.0, y);\n vec4 v4 = decodevec4(dx, x+12.0, y);\n return mat4(v1, v2, v3, v4);\n }\n #endif\n #else\n uniform mat4 jointMatrices[50];\n mat4 getBoneMatrix(const in float i) {\n return jointMatrices[int(i)];\n }\n #endif\n mat4 skinMatrix() {\n return\n getBoneMatrix(a_joints.x) * a_weights.x +\n getBoneMatrix(a_joints.y) * a_weights.y +\n getBoneMatrix(a_joints.z) * a_weights.z +\n getBoneMatrix(a_joints.w) * a_weights.w\n ;\n }\n#endif\nstruct StandardVertInput {\n vec2 uv;\n vec4 position;\n vec3 normal;\n vec4 tangent;\n vec4 color;\n};\nattribute vec3 a_position;\n#if CC_USE_ATTRIBUTE_UV0\nattribute vec2 a_uv0;\n#endif\n#if CC_USE_ATTRIBUTE_COLOR\nattribute vec4 a_color;\n#endif\n#if CC_USE_ATTRIBUTE_NORMAL\nattribute vec3 a_normal;\n#endif\n#if CC_USE_ATTRIBUTE_TANGENT\nattribute vec4 a_tangent;\n#endif\nvoid CCAttribute (out StandardVertInput In) {\n In.position = vec4(a_position, 1.0);\n #if CC_USE_ATTRIBUTE_UV0\n In.uv = a_uv0;\n #else\n In.uv = vec2(0.0);\n #endif\n #if CC_USE_ATTRIBUTE_COLOR\n In.color = a_color;\n #else\n In.color = vec4(1.0);\n #endif\n #if CC_USE_ATTRIBUTE_NORMAL\n In.normal = a_normal;\n #else\n In.normal = vec3(0.0, 1.0, 0.0);\n #endif\n #if CC_USE_ATTRIBUTE_TANGENT\n In.tangent = a_tangent;\n #else\n In.tangent = vec4(1.0, 0.0, 0.0, 0.0);\n #endif\n}\nvoid CCVertInput(out StandardVertInput In) {\n CCAttribute(In);\n #if CC_USE_SKINNING\n mat4 m = skinMatrix();\n In.position = m * In.position;\n #if CC_USE_ATTRIBUTE_NORMAL\n In.normal = (m * vec4(In.normal, 0)).xyz;\n #endif\n #if CC_USE_ATTRIBUTE_TANGENT\n In.tangent = m * In.tangent;\n #endif\n #endif\n}\nuniform vec2 mainTiling;\nuniform vec2 mainOffset;\n#if CC_USE_ATTRIBUTE_UV0 && USE_DIFFUSE_TEXTURE\n varying mediump vec2 v_uv0;\n#endif\n#if CC_USE_ATTRIBUTE_COLOR\n varying lowp vec4 v_color;\n#endif\nvoid main () {\n StandardVertInput In;\n CCVertInput(In);\n #if CC_USE_ATTRIBUTE_COLOR\n v_color = In.color;\n #endif\n #if CC_USE_ATTRIBUTE_UV0 && USE_DIFFUSE_TEXTURE\n v_uv0 = In.uv * mainTiling + mainOffset;\n #endif\n gl_Position = cc_matViewProj * cc_matWorld * In.position;\n}",
  139. "frag": "\nprecision highp float;\n#if USE_ALPHA_TEST\n uniform float alphaThreshold;\n#endif\nvoid ALPHA_TEST (in vec4 color) {\n #if USE_ALPHA_TEST\n if (color.a < alphaThreshold) discard;\n #endif\n}\nvoid ALPHA_TEST (in float alpha) {\n #if USE_ALPHA_TEST\n if (alpha < alphaThreshold) discard;\n #endif\n}\nvec4 CCFragOutput (vec4 color) {\n #if OUTPUT_TO_GAMMA\n color.rgb = sqrt(color.rgb);\n #endif\n\treturn color;\n}\nuniform lowp vec4 diffuseColor;\n#if USE_DIFFUSE_TEXTURE\n uniform sampler2D diffuseTexture;\n#endif\n#if CC_USE_ATTRIBUTE_COLOR\n varying lowp vec4 v_color;\n#endif\n#if CC_USE_ATTRIBUTE_UV0 && USE_DIFFUSE_TEXTURE\n varying mediump vec2 v_uv0;\n#endif\nvoid main () {\n vec4 color = diffuseColor;\n #if CC_USE_ATTRIBUTE_UV0 && USE_DIFFUSE_TEXTURE\n vec4 diffuseTexture_tmp = texture2D(diffuseTexture, v_uv0);\n #if CC_USE_ALPHA_ATLAS_diffuseTexture\n diffuseTexture_tmp.a *= texture2D(diffuseTexture, v_uv0 + vec2(0, 0.5)).r;\n #endif\n #if INPUT_IS_GAMMA\n color.rgb *= (diffuseTexture_tmp.rgb * diffuseTexture_tmp.rgb);\n color.a *= diffuseTexture_tmp.a;\n #else\n color *= diffuseTexture_tmp;\n #endif\n #endif\n #if CC_USE_ATTRIBUTE_COLOR\n color *= v_color;\n #endif\n ALPHA_TEST(color);\n gl_FragColor = CCFragOutput(color);\n}"
  140. },
  141. "builtins": {
  142. "globals": {
  143. "blocks": [
  144. {
  145. "name": "CCGlobal",
  146. "defines": []
  147. }
  148. ],
  149. "samplers": []
  150. },
  151. "locals": {
  152. "blocks": [
  153. {
  154. "name": "CCLocal",
  155. "defines": []
  156. }
  157. ],
  158. "samplers": []
  159. }
  160. },
  161. "defines": [
  162. {
  163. "name": "CC_USE_SKINNING",
  164. "type": "boolean",
  165. "defines": []
  166. },
  167. {
  168. "name": "CC_USE_JOINTS_TEXTRUE",
  169. "type": "boolean",
  170. "defines": [
  171. "CC_USE_SKINNING"
  172. ]
  173. },
  174. {
  175. "name": "CC_JOINTS_TEXTURE_FLOAT32",
  176. "type": "boolean",
  177. "defines": [
  178. "CC_USE_SKINNING",
  179. "CC_USE_JOINTS_TEXTRUE"
  180. ]
  181. },
  182. {
  183. "name": "CC_USE_ATTRIBUTE_UV0",
  184. "type": "boolean",
  185. "defines": []
  186. },
  187. {
  188. "name": "CC_USE_ATTRIBUTE_COLOR",
  189. "type": "boolean",
  190. "defines": []
  191. },
  192. {
  193. "name": "CC_USE_ATTRIBUTE_NORMAL",
  194. "type": "boolean",
  195. "defines": []
  196. },
  197. {
  198. "name": "CC_USE_ATTRIBUTE_TANGENT",
  199. "type": "boolean",
  200. "defines": []
  201. },
  202. {
  203. "name": "USE_DIFFUSE_TEXTURE",
  204. "type": "boolean",
  205. "defines": []
  206. },
  207. {
  208. "name": "USE_ALPHA_TEST",
  209. "type": "boolean",
  210. "defines": []
  211. },
  212. {
  213. "name": "OUTPUT_TO_GAMMA",
  214. "type": "boolean",
  215. "defines": []
  216. },
  217. {
  218. "name": "CC_USE_ALPHA_ATLAS_diffuseTexture",
  219. "type": "boolean",
  220. "defines": [
  221. "CC_USE_ATTRIBUTE_UV0",
  222. "USE_DIFFUSE_TEXTURE"
  223. ]
  224. },
  225. {
  226. "name": "INPUT_IS_GAMMA",
  227. "type": "boolean",
  228. "defines": [
  229. "CC_USE_ATTRIBUTE_UV0",
  230. "USE_DIFFUSE_TEXTURE"
  231. ]
  232. }
  233. ],
  234. "blocks": [
  235. {
  236. "name": "SKINNING",
  237. "members": [
  238. {
  239. "name": "jointsTextureSize",
  240. "type": 14,
  241. "count": 1
  242. }
  243. ],
  244. "defines": [
  245. "CC_USE_SKINNING",
  246. "CC_USE_JOINTS_TEXTRUE"
  247. ],
  248. "binding": 0
  249. },
  250. {
  251. "name": "JOINT_MATRIX",
  252. "members": [
  253. {
  254. "name": "jointMatrices",
  255. "type": 26,
  256. "count": 50
  257. }
  258. ],
  259. "defines": [
  260. "CC_USE_SKINNING"
  261. ],
  262. "binding": 1
  263. },
  264. {
  265. "name": "MAIN_TILING",
  266. "members": [
  267. {
  268. "name": "mainTiling",
  269. "type": 14,
  270. "count": 1
  271. },
  272. {
  273. "name": "mainOffset",
  274. "type": 14,
  275. "count": 1
  276. }
  277. ],
  278. "defines": [],
  279. "binding": 2
  280. },
  281. {
  282. "name": "ALPHA_TEST",
  283. "members": [
  284. {
  285. "name": "alphaThreshold",
  286. "type": 13,
  287. "count": 1
  288. }
  289. ],
  290. "defines": [
  291. "USE_ALPHA_TEST"
  292. ],
  293. "binding": 3
  294. },
  295. {
  296. "name": "UNLIT",
  297. "members": [
  298. {
  299. "name": "diffuseColor",
  300. "type": 16,
  301. "count": 1
  302. }
  303. ],
  304. "defines": [],
  305. "binding": 4
  306. }
  307. ],
  308. "samplers": [
  309. {
  310. "name": "jointsTexture",
  311. "type": 29,
  312. "count": 1,
  313. "defines": [
  314. "CC_USE_SKINNING",
  315. "CC_USE_JOINTS_TEXTRUE"
  316. ],
  317. "binding": 30
  318. },
  319. {
  320. "name": "diffuseTexture",
  321. "type": 29,
  322. "count": 1,
  323. "defines": [
  324. "USE_DIFFUSE_TEXTURE"
  325. ],
  326. "binding": 31
  327. }
  328. ],
  329. "record": null,
  330. "name": "builtin-unlit|unlit-vs|unlit-fs"
  331. }
  332. ]
  333. }