好像都被封装了,有没有相关文档啊?
比如我一个简单的需求:在SurfacesFragmentModifyBaseColorAndTransparency里面拿世界坐标。
之前实在standard-vs里面通过out一个v_position,从 vec4 pos = matWorld * In.position; 过来,然后再standard-fs里面in vec3 v_position即可,那现在怎么办呢?
最后发现该怎么用怎么用,有个SurfacesVertexModifyUV的函数里面找到了这个In,就从这里out 出来了In.position;
这个In里面具体有什么东西?应该怎么查啊?
CCProgram surface-vertex %{
out vec4 v_position;
out vec4 v_worldPosition;
//...
#define CC_SURFACES_VERTEX_MODIFY_UV
void SurfacesVertexModifyUV(inout SurfacesStandardVertexIntermediate In)
{
In.texCoord = In.texCoord * tilingOffset.xy + tilingOffset.zw;
#if CC_SURFACES_USE_SECOND_UV
In.texCoord1 = In.texCoord1 * tilingOffset.xy + tilingOffset.zw;
#endif
// 为surface-fragment输出本地坐标和世界坐标
mat4 matWorld, matWorldIT;
CCGetWorldMatrixFull(matWorld, matWorldIT);
v_position = In.position;
v_worldPosition = matWorld * In.position;
}
}%
CCProgram surface-fragment %{
in vec4 v_position;
in vec4 v_worldPosition;
#define CC_SURFACES_FRAGMENT_MODIFY_BASECOLOR_AND_TRANSPARENCY
vec4 SurfacesFragmentModifyBaseColorAndTransparency()
{
vec4 baseColor = albedo;
#if USE_VERTEX_COLOR
baseColor.rgb *= SRGBToLinear(FSInput_vertexColor.rgb); // use linear
baseColor.a *= FSInput_vertexColor.a;
#endif
#if USE_ALBEDO_MAP
vec4 texColor = texture(albedoMap, ALBEDO_UV);
texColor.rgb = SRGBToLinear(texColor.rgb);
baseColor *= texColor;
#endif
#if USE_ALPHA_TEST
if (baseColor.ALPHA_TEST_CHANNEL < albedoScaleAndCutoff.w) discard;
#endif
// test本地坐标与世界坐标
// baseColor.a = step(v_position.x - v_position.z, 0.0);
baseColor.a = step(v_worldPosition.x - v_worldPosition.z, 0.0);
baseColor.rgb *= albedoScaleAndCutoff.xyz;
return baseColor;
}
//...
}%
...
原来我每次建工程总是复制之前的工程,使用的也是引擎自动升级上去的资源,其实早在3.7开始就已经由此改变了。
最后改成了在SurfacesVertexModifyWorldPos替换函数中直接获取,不影响其它的业务流。
out vec3 v_worldPosition;
#define CC_SURFACES_VERTEX_MODIFY_WORLD_POS
vec3 SurfacesVertexModifyWorldPos(in SurfacesStandardVertexIntermediate In)
{
v_worldPosition = In.worldPos;
return v_worldPosition;
}
至于In里面有什么的问题,可以查看chunks/surfaces/default-functions 下面的几个chunk