galacean / engine

A typescript interactive engine, support 2D, 3D, animation, physics, built on WebGL and glTF.
https://galacean.antgroup.com/
MIT License
4.05k stars 289 forks source link

some shaderLab bug #2011

Closed zhuxudong closed 3 days ago

zhuxudong commented 4 months ago

Describe the bug

zhuxudong commented 4 months ago
Sway007 commented 4 months ago
  • missing some qualifier in function parameter,such as 'inout':
float test(const in a, inout b, out c){}

qualifiers such as in/out/inout should be in front of parameter type, be like: float test(in float a, inout float b, out vec2 c){}

zhuxudong commented 4 months ago

i write a simple demo, see issue below:

/**
 * @title ShaderLab Test
 * @category Material
 */

import { Camera, Logger, Material, MeshRenderer, PrimitiveMesh, Shader, WebGLEngine } from "@galacean/engine";
import { ShaderLab } from "@galacean/engine-shader-lab";
Logger.enable();
const shaderLab = new ShaderLab();

const FurShaderSource = `Shader "Fur" {
  SubShader "Default" {
    // @issue: renderState outside
    // BlendState blendState {
    //   Enabled = true;
    //   SourceColorBlendFactor = BlendFactor.SourceAlpha;
    //   DestinationColorBlendFactor = BlendFactor.OneMinusSourceAlpha;
    //   SourceAlphaBlendFactor = BlendFactor.One;
    //   DestinationAlphaBlendFactor = BlendFactor.OneMinusSourceAlpha;
    // }

    // BlendState = blendState;
    // RenderQueueType = RenderQueueType.Transparent;

    mat4 renderer_MVPMat;
    mat4 renderer_ModelMat;
    mat4 renderer_NormalMat;
    vec3 camera_Position;

    sampler2D _MainTex;
        sampler2D _LayerTex;
        sampler2D _NoiseTex;

    vec3 _Gravity;
    float _GravityIntensity;
    float _EdgeFade;
    float _Cutoff;
    float _CutoffEnd;
    float _FurLength;

    struct a2v {
      vec4 POSITION;
    }

    // float issue_qualifier(inout float a){
    //   return 1.0;
    // }

    v2f issue_v2f(a2v v){
      v2f o;
      gl_Position = renderer_MVPMat * v.POSITION;
      return o;
    }

    Pass "0" {
      v2f vert(a2v v) {
        // v2f o;

        // gl_Position = renderer_MVPMat * v.POSITION;

        // @issue:qualifier
        // issue_qualifier(1.0);

        // @issue: v2f outside
        return issue_v2f(v);

        // return o;
      }

      void frag(v2f i) {
        gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
      }

      VertexShader = vert;
      FragmentShader = frag;
    }

  }
}`;

Logger.enable();
WebGLEngine.create({ canvas: "canvas", shaderLab }).then((engine) => {
  engine.canvas.resizeByClientSize();

  // test Shader
  const shader = Shader.create(FurShaderSource);

  const scene = engine.sceneManager.activeScene;
  const rootEntity = scene.createRootEntity();

  // camera
  const cameraEntity = rootEntity.createChild("cameraNode");
  cameraEntity.transform.setPosition(0, 0, 5);
  cameraEntity.addComponent(Camera);

  const triangle = rootEntity.createChild("plane");
  const renderer = triangle.addComponent(MeshRenderer);
  renderer.mesh = PrimitiveMesh.createSphere(engine, 2, 64);
  const material = new Material(engine, shader);
  renderer.setMaterial(material);

  engine.run();
});
zhuxudong commented 4 months ago

multi pass shader refs to: https://github.com/chenyong2github/ExtendStandard/blob/master/Assets/Shaders/Unlit_Fur.shader

zhuxudong commented 4 months ago

add playground multi-pass test case: https://github.com/galacean/galacean.github.io/pull/969

Sway007 commented 4 months ago
  • [x] can't write uniform outside Multi pass

fixed by #2018

zhuxudong commented 3 days ago

fixed in 1.3