我正在为Unity3d编写CG语言着色器。
如果要为透明对象创建着色器,则需要在“SubShader”中创建两个类似的通道。第一个仅渲染背面(使用“Cull Front”),第二个仅渲染正面(使用“Cull Back”)。但是,两个通道的顶点和片段函数代码是相同的。
是否有可能不复制代码并声明一些函数,使得这些函数可以在通道之间共享?
我希望我的代码示例中有类似这样的东西:
如果要为透明对象创建着色器,则需要在“SubShader”中创建两个类似的通道。第一个仅渲染背面(使用“Cull Front”),第二个仅渲染正面(使用“Cull Back”)。但是,两个通道的顶点和片段函数代码是相同的。
是否有可能不复制代码并声明一些函数,使得这些函数可以在通道之间共享?
我希望我的代码示例中有类似这样的东西:
Shader "cool shader" {
Properties {
...
}
SubShader {
CGPROGRAM
// need to declare vertexOutput somewhow here
float4 sharedFragFoo(vertexOutput i) : COLOR // How to make smth like this?
{
....
return float4(...);
}
ENDCG
pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
vertexOutput vert(vertexInput v) {
vertexOutput o;
...
return o;
}
float4 frag(vertexOutput i) : COLOR
{
return sharedFragFoo(i); // call the shared between passes function
}
ENDCG
}
pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
vertexOutput vert(vertexInput v) {
vertexOutput o;
...
return o;
}
float4 frag(vertexOutput i) : COLOR
{
return sharedFragFoo(i); // call the shared between passes function
}
ENDCG
}
}
}
更新:找到了使用包含文件的方法。
但是是否可能在一个文件内完成呢?
#pragma vertex vert
是用来指定你想要着色器使用哪个顶点函数的,否则它会默认使用一些内置的函数而不是你在 .cginc 文件中定义的函数。 - Spectraljump