几个问题.
首先
https://layaair.com/3.4/doc/IDE/Component/2D/2DRender/Mesh2DRender/readme.html
文档中的Shader是不能用. 应该是你们后来更改的方案 但是文档中的还是旧的. 所以只要用这个就报错.
需要更改为我下面这个新的写法
Shader3D Start
{
type:Shader3D,
name:baseRender2D,
enableInstancing:true,
supportReflectionProbe:true,
shaderType:D2_BaseRenderNode2D,
uniformMap:{
u_gradientDirection: {type: Vector2, default:[1,1]}, // 渐变方向
u_gradientStartColor: {type:Vector4, default:[1,1,1,1]}, // 渐变起始颜色
u_gradientEndColor: {type:Vector4, default:[1,1,1,1]} // 渐变结束颜色
},
attributeMap: {
a_position: ["Vector4", 0],
a_color: ["Vector4", 1],
a_uv: ["Vector2", 2],
},
defines: {
BASERENDER2D: { type: bool, default: true }
},
shaderPass:[
{
pipeline:Forward,
VS:baseRenderVS,
FS:baseRenderPS
}
]
}
Shader3D End
GLSL Start
#defineGLSL baseRenderVS
#define SHADER_NAME baseRender2D
#include "Sprite2DVertex.glsl";
void main() {
vertexInfo info;
getVertexInfo(info);
gl_Position = getPosition(info.pos);
v_texcoord = info.uv;
v_color = info.color;
#ifdef LIGHT_AND_SHADOW
lightAndShadow(info);
#endif
}
#endGLSL
#defineGLSL baseRenderPS
#define SHADER_NAME baseRender2D
#if defined(GL_FRAGMENT_PRECISION_HIGH)
precision highp float;
#else
precision mediump float;
#endif
#include "Sprite2DFrag.glsl";
void main()
{
clip();
vec4 textureColor = texture2D(u_baseRender2DTexture, v_texcoord);
// 计算渐变因子
float gradientFactor = dot(v_texcoord, normalize(u_gradientDirection)) * 0.5 + 0.5;
// 混合渐变颜色
vec4 gradientColor = mix(u_gradientStartColor, u_gradientEndColor, gradientFactor);
textureColor *= gradientColor;
#ifdef LIGHT_AND_SHADOW
lightAndShadow(textureColor);
#endif
textureColor = transspaceColor(textureColor);
setglColor(textureColor);
}
#endGLSL
GLSL End
Tilemap的Material似乎是不能用的.我让AI看了下Github上的源码. 应该是Tilemap的Tileset的Shader需要TS这边去注册. 直接挂Material是无效
import TileMapVS from "./TileMap.vs";
import TileMapFS from "./TileMap.fs";
import TileMapVertexGLSL from "./TileMapVertex.glsl"
import TileMapFragmentGLSL from "./TileMapFragment.glsl"
Shader3D.addInclude("TileMapVertex.glsl", TileMapVertexGLSL);
Shader3D.addInclude("TileMapFragment.glsl", TileMapFragmentGLSL);
let shader = Shader3D.add("TileMapLayer", false, false);
shader.shaderType = ShaderFeatureType.Effect;
let subShader = new SubShader(attributeMap, {}, {});
shader.addSubShader(subShader);
subShader.addShaderPass(TileMapVS, TileMapFS);
我试了纯红色块的Shader
Shader3D Start
{
type:Shader3D,
name:Mesh2DTestRed,
enableInstancing:true,
supportReflectionProbe:true,
shaderType:D2_BaseRenderNode2D,
uniformMap:{
},
attributeMap: {
a_position: ["Vector4", 0],
a_color: ["Vector4", 1],
a_uv: ["Vector2", 2],
},
defines: {
BASERENDER2D: { type: bool, default: true }
},
shaderPass:[
{
pipeline:Forward,
VS:baseRenderVS,
FS:baseRenderPS
}
]
}
Shader3D End
GLSL Start
#defineGLSL baseRenderVS
#define SHADER_NAME baseRenderVS
#include "Sprite2DVertex.glsl";
void main() {
vertexInfo info;
getVertexInfo(info);
v_texcoord = info.uv;
v_color = info.color;
#ifdef LIGHT2D_ENABLE
lightAndShadow(info);
#endif
gl_Position = getPosition(info.pos);
}
#endGLSL
#defineGLSL baseRenderPS
#define SHADER_NAME baseRenderPS
#if defined(GL_FRAGMENT_PRECISION_HIGH)
precision highp float;
#else
precision mediump float;
#endif
#include "Sprite2DFrag.glsl";
void main()
{
clip();
vec4 textureColor = vec4(1.0, 0.0, 0.0, 1.0);
textureColor = transspaceColor(textureColor);
setglColor(textureColor);
}
#endGLSL
GLSL End
这个在MeshRender2D的节点是可用的. 但是Tilemap给Tileset绑定则直接报错.
我直接右键新建一个纯新的 Shader ,然后纯新的Material

这个挂在Tile上则不报错 无任何反应 关了再开直接丢失.