通过Primitive加载多个面对象,每个面对象的大小不一样,设置贴图时会有的拉伸,该怎么样设置repeat值,才能保证贴图不被拉伸呢?
研究的也不是很深,尝试着看剖析问题看看,有翻了之前的文章看了下:
Fabric 材质 上
Fabric 材质 下
本来想尝试看看 repeat的回调的函数,结果发现没有好的解决方案。
只能尝试更改默认的着色器代码:
let appear = new Cesium.MaterialAppearance({
flat :true ,
material: new Cesium.Material({
translucent:false,
fabric : {
type :`Image`,
uniforms : {
image:`./static/images/symbol/0301.png`
}
},
}),
vertexShaderSource://重点更改顶点着色器
`
// GLSL 300 语法,顶点着色器
in vec3 position3DHigh;
in vec3 position3DLow;
in vec3 normal;
in vec2 st;
in float batchId;
out vec3 v_positionEC;
out vec3 v_normalEC;
out vec2 v_st;
void main() {
vec4 p = czm_computePosition();
v_positionEC = (czm_modelViewRelativeToEye * p).xyz; // position in eye coordinates
v_normalEC = czm_normal * normal; // normal in eye coordinates
v_st = st;
gl_Position = czm_modelViewProjectionRelativeToEye * p;
}
`
});
//appear.fragmentShaderSource 片元着色器
//appear.vertexShaderSource 顶点着色器
let primitive = new Cesium.Primitive({
geometryInstances: instances,
appearance: appear
});
下面是说明:
着色器代码是源码,并没有更改匹配uv坐标。 我没有实际代码,没有调试。
还请你根据实际项目,更改试试。
@hawk86104 非常感谢大佬的指导,我把您的代码加进去了,可是没有效果,我对glsl的了解很少,不太清楚代码逻辑,以下是我的完整代码:
(我想达到的效果就像用砖头砌墙那样,砖头的大小是固定的,墙面越大需要的砖头越多,墙面越小则砖头数量越少,麻烦大佬帮忙看下,非常感谢!)