-
Creator 版本:2.3.3
-
目标平台: 全平台
在shader中使用世界坐标,当模型坐标不在(0,0,0)时,世界坐标怀疑计算错误。
CCProgram vs %{
precision highp float;
#include <cc-local>
#include <cc-global>
#include <skinning>
#include <input-standard>
#define CC_USE_TEXTURE CC_USE_ATTRIBUTE_UV0 && USE_DIFFUSE_TEXTURE && USE_LIGHT_TEX
uniform MAIN_TILING {
vec2 mainTiling;
vec2 mainOffset;
};
#if CC_USE_TEXTURE
out mediump vec2 v_uv0;
#endif
#if CC_USE_ATTRIBUTE_COLOR
out lowp vec4 v_color;
#endif
out vec3 v_worldPos;
void main () {
StandardVertInput In;
CCVertInput(In);
#if CC_USE_ATTRIBUTE_COLOR
v_color = In.color;
#endif
#if CC_USE_TEXTURE
v_uv0 = In.uv * mainTiling + mainOffset;
#endif
vec4 position = In.position;
//计算世界坐标
v_worldPos = (cc_matWorld * position).xyz;
gl_Position = cc_matViewProj * cc_matWorld * In.position;
}
}%
CCProgram fs %{
precision highp float;
#include <alpha-test>
#include <cc-global>
#include <texture>
#include <output>
uniform UNLIT {
lowp vec4 diffuseColor;
};
in vec3 v_worldPos;
#if USE_DIFFUSE_TEXTURE
uniform sampler2D diffuseTexture;
#endif
#define CC_USE_TEXTURE CC_USE_ATTRIBUTE_UV0 && USE_DIFFUSE_TEXTURE
#if CC_USE_ATTRIBUTE_COLOR
in lowp vec4 v_color;
#endif
#if CC_USE_TEXTURE
in mediump vec2 v_uv0;
#endif
void main () {
vec4 color = diffuseColor;
//使用红色展示顶点世界坐标
color.r = v_worldPos.x ;
color.g = 0.;
color.b = 0.;
//x坐标大于1的点丢弃,理论上应该显示切面
if(color.r >= 1.)
{
discard;
}
ALPHA_TEST(color);
gl_FragColor = CCFragOutput(color);
}
}%

把模型放到(0,0,0)坐标点,模型显示符合预期,出现一个整齐的横截面。
调整fs,将x坐标缩小10倍,调整模型到(10,0,0)
void main () {
vec4 color = diffuseColor;
color.r = v_worldPos.x * 0.1;
color.g = 0.;
color.b = 0.;
if(color.r >= 1.)
{
discard;
}
ALPHA_TEST(color);
gl_FragColor = CCFragOutput(color);
}

横截面出现凹凸痕迹,部分区域相同x的点的颜色值不同。

相同的逻辑,在unity中就显示正常。
麻烦帮忙看下是哪里出了问题,是模型有问题还是计算顶点坐标有问题。NewProject_2.rar (269.9 KB)