sky-vs.chunk 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #include <surfaces/default-functions/common-vs>
  2. #include <surfaces/module-functions/common-vs>
  3. vec4 CalcSkyClipPos(vec3 viewDir)
  4. {
  5. vec4 clipPos;
  6. // Clip Space
  7. mat4 matViewRotOnly = mat4(mat3(cc_matView));
  8. vec4 pos = matViewRotOnly * vec4(viewDir, 1.0);
  9. // orthographic projection adaptation
  10. if (cc_matProj[3].w > 0.0) {
  11. mat4 matProj = cc_matProj;
  12. // default ortho height 10 approximate to default FOV 45
  13. // stretch x by 2 to remedy perspective effect
  14. // w = sin(45/2), h = 2 * w, _11 = 2 / w, _22 = 2 / h
  15. matProj[0].x = 5.2;
  16. matProj[1].y = 2.6;
  17. matProj[2].zw = vec2(-1.0);
  18. matProj[3].zw = vec2(0.0);
  19. // position is modified inside branches to work around a vk driver bug seen in
  20. // low-end Qualcomm devices (Adreno 512, Oppo R11, cocos-creator/3d-tasks#9236)
  21. clipPos = matProj * pos;
  22. }
  23. else {
  24. clipPos = cc_matProj * pos;
  25. }
  26. clipPos.z = 0.99999 * clipPos.w;
  27. return clipPos;
  28. }
  29. void main()
  30. {
  31. SurfacesStandardVertexIntermediate In;
  32. // Local Space
  33. CCSurfacesVertexInput(In);
  34. // cc_matWorld is undefined, so can not use mat4(mat3(cc_matWorld))
  35. In.worldPos = In.position.xyz;
  36. In.worldPos = SurfacesVertexModifyWorldPos(In);
  37. In.clipPos = CalcSkyClipPos(In.position.xyz);
  38. In.worldNormal.w = 1.0;
  39. In.worldNormal.xyz = normalize(In.position.xyz);
  40. // Other Data
  41. #if CC_USE_FOG != CC_FOG_NONE && !CC_USE_ACCURATE_FOG
  42. In.fogFactor = 0.0;
  43. #endif
  44. CCSurfacesVertexOutput(In);
  45. }