`VERTEX SHADER ERROR: 0:222: 'world' : redefinition` errors appeared in my own shader MToonMaterial

details are at GitHub issue virtual-cast/babylon-mtoon-material#66.

This bugs may be caused by meshUboDeclaration or instancesDeclaration or something.

I’m waiting for any help.

I think you want to rename the files:

  • ubo-declaration => mtoonUboDeclaration
  • vertex-declaration => mtoonVertexDeclaration
  • fragment-declaration => mtoonFragmentDeclaration

When using #include<__decl__mtoonVertex>, the system is removing __decl__ and is replacing Vertex by UboDeclaration if the engine supports Ubo or by VertexDeclaration if not. Same kind of transformations for #include<__decl__mtoonFragment>.

The shaders are registered at constructor.

Isn’t that correct?

Yes it should work.

Are you sure you are using the updated instancesDeclaration.fx file? Can you console.log Effect.IncludesShadersStore["instancesDeclaration"] and make sure it’s the right one (and especially that you can see occurrences of WORLD_UBO).

result of console.log(Effect.IncludesShadersStore["instancesDeclaration"]);. babylon.js v5.0.0-alpha.25.

#ifdef INSTANCES
attribute vec4 world0;
attribute vec4 world1;
attribute vec4 world2;
attribute vec4 world3;
#if defined(THIN_INSTANCES) && !defined(WORLD_UBO)
uniform mat4 world;
#endif
#if defined(VELOCITY) || defined(PREPASS_VELOCITY)
attribute vec4 previousWorld0;
attribute vec4 previousWorld1;
attribute vec4 previousWorld2;
attribute vec4 previousWorld3;
#ifdef THIN_INSTANCES
uniform mat4 previousWorld;
#endif
#endif
#else
#if !defined(WORLD_UBO)
uniform mat4 world;
#endif
#if defined(VELOCITY) || defined(PREPASS_VELOCITY)
uniform mat4 previousWorld;
#endif
#endif

I wonder #if preprocessor should appear in compiled vertex code, but my error vertex code does not have any #if declaration, only #define have.

Perhaps preprocessor of #if or #ifdef processing timing problem?

proprocess #ifdef(this timing will only define MaterialDefine's #define) → generate uniform mat4 world → process #include and put #define WORLD_UBO but #ifdef already processed, so runtime vertex code has uniform mat4 world.

I tried to add WORLD_UBO = true to MToonMaterialDefines, it does not have error, but no mesh are rendered. And in WebGL1, VERTEX SHADER ERROR: 0:170: 'world' : undeclared identifier error appears.

(sorry for poor english)

There are two problems:

  • the .vert and .frag files should use LF as the line separator, not CRLF
  • you need to add Mesh in the list of uniform buffers (line 989 of mtoon-material.ts):
    • const uniformBuffers = ['Material', 'Scene', 'Mesh'];

After those changes it does work for me locally.

Brilliant! It works for me! Thank you so much!