Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix ShaderLab compatible with no varying variable #1859

Merged
merged 13 commits into from
Nov 6, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 8 additions & 14 deletions packages/shader-lab/src/Ast2GLSLUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,20 +24,14 @@ export class Ast2GLSLUtils {

// parse varying variables
const varyingStructAstNode = context.findGlobal(vertFnAst.content.returnType.content.text)?.ast as StructAstNode;
if (!varyingStructAstNode) {
context.diagnostics.push({
severity: DiagnosticSeverity.Error,
message: "no varying struct definition",
token: vertFnAst.content.returnType.position
});
return "";
if (varyingStructAstNode) {
context.varyingStructInfo.structAstNode = varyingStructAstNode;
context.varyingStructInfo.reference = varyingStructAstNode.content.variables.map((v) => ({
referenced: false,
property: v,
text: `varying ${v.content.type.serialize(context)} ${v.content.variableNode.serialize(context)}`
}));
}
context.varyingStructInfo.structAstNode = varyingStructAstNode;
context.varyingStructInfo.reference = varyingStructAstNode.content.variables.map((v) => ({
referenced: false,
property: v,
text: `varying ${v.content.type.serialize(context)} ${v.content.variableNode.serialize(context)}`
}));

// parsing attribute variables
vertFnAst.content.args.forEach((arg) => {
Expand Down Expand Up @@ -101,7 +95,7 @@ export class Ast2GLSLUtils {
}
context.setMainFnAst(fragFnAst);

context.varyingStructInfo.objectName = fragFnAst.content.args[0].content.name;
context.varyingStructInfo.objectName = fragFnAst.content.args?.[0].content.name;
const fragmentFnStr = fragFnAst.serialize(context);

// There may be global variable references in conditional macro statement, so it needs to be serialized first.
Expand Down
13 changes: 13 additions & 0 deletions packages/shader-lab/src/ast-node/AstNode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,18 @@ export class FnAstNode extends AstNode<IFnAstContent> {
}
const body = this.content.body.serialize(context);

if (
(this.content.returnType.content.text === "void" && this.content.returnStatement) ||
(this.content.returnType.content.text !== "void" && !this.content.returnStatement)
) {
context.diagnostics.push({
severity: DiagnosticSeverity.Error,
message: "Mismatched return type",
token: this.position
});
throw "Mismatched return type";
}

context.functionAstStack.pop();
return `${returnType} ${fnName} (${args}) {\n${body}\n}`;
}
Expand Down Expand Up @@ -493,6 +505,7 @@ export class FnArrayVariableAstNode extends AstNode<IFnArrayVariableAstContent>

export class FnReturnStatementAstNode extends AstNode<IFnReturnStatementAstContent> {
override _doSerialization(context: RuntimeContext): string {
context.currentFunctionInfo.fnAst.content.returnStatement = this;
if (context.currentFunctionInfo.fnAst === context.currentMainFnAst) {
return "";
}
Expand Down
4 changes: 3 additions & 1 deletion packages/shader-lab/src/ast-node/AstNodeContent.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@ import {
FnVariableDeclareUnitAstNode,
FnMacroUndefineAstNode,
FnMacroConditionAstNode,
RenderQueueValueAstNode
RenderQueueValueAstNode,
FnReturnStatementAstNode
} from "./AstNode";

export interface IShaderAstContent {
Expand Down Expand Up @@ -111,6 +112,7 @@ export interface IFnAstContent {
name: string;
args: FnArgAstNode[];
body: AstNode;
returnStatement?: FnReturnStatementAstNode;
}

export interface IFnBodyAstContent {
Expand Down
5 changes: 5 additions & 0 deletions tests/src/shader-lab/ShaderLab.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -200,4 +200,9 @@ describe("ShaderLab", () => {
const demoShader = fs.readFileSync(path.join(__dirname, "shaders/triangle.shader")).toString();
glslValidate(demoShader, shaderLab);
});

it("No frag shader args", () => {
const demoShader = fs.readFileSync(path.join(__dirname, "shaders/noFragArgs.shader")).toString();
glslValidate(demoShader, shaderLab);
});
});
30 changes: 30 additions & 0 deletions tests/src/shader-lab/shaders/noFragArgs.shader
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
Shader "Test-Default" {
Tags { ReplaceTag = "transparent" }
SubShader "Default" {
Pass "test" {
Tags { ReplaceTag = "opaque" }
mat4 renderer_MVPMat;

struct a2v {
vec4 POSITION;
}

// struct v2f {
// vec2 uv;
// }

VertexShader = vert;
FragmentShader = frag;

void vert(a2v v) {
gl_Position = renderer_MVPMat * v.POSITION;
}

void frag() {
vec3 grayColor = vec3(0.299, 0.587, 0.114);
float gray = dot(grayColor, gl_FragColor.rgb);
gl_FragColor = vec4(gray, gray, gray, gl_FragColor.a);
}
}
}
}
1 change: 1 addition & 0 deletions tests/src/shader-lab/shaders/planarShadow.shader
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ Shader "PlanarShadow" {
// shadow color
o.color = u_planarShadowColor;
o.color.a *= falloff;
return o;
}

VertexShader = vert;
Expand Down