I’ve found here something like… changing an offset in instanced mesh, as it passes Vector2 and not Vector4 type?
PG: playground
Is it possible to replace UV using Vector4? Not just making some offset but all UV coords: left bottom, right top.
I’ve found here something like… changing an offset in instanced mesh, as it passes Vector2 and not Vector4 type?
PG: playground
Is it possible to replace UV using Vector4? Not just making some offset but all UV coords: left bottom, right top.
No, an instanced attribute is a single value for the whole instance, that is for all the vertices of an instance. If you want to pass 4 values per instance, you will have to pass 4 attributes. In your case, the values are vec2, so you can pass two values per attribute (which is vec4), so you would need 2 attributes. However, I’m not sure you could achieve to do what you want, as there are 24 vertices in the cube, so 24 coordinates, not 4.
Well I’m making it for a plane so I have only 4 numbers in UV: [ left, bottom ] → [ right, top ]. If I would pass two values
mat1.AddAttribute("uv0");
mat1.AddAttribute("uv1");
then how do I pass it in a material?
mat1.Vertex_Definitions(`
attribute vec2 uv0;
attribute vec2 uv1;
`);
mat1.Vertex_Before_PositionUpdated(`
uvUpdated += uv0;
.... something else should goes here? ....
`);
plane.registerInstancedBuffer("uv0", 2);
plane.registerInstancedBuffer("uv1", 2);
plane.instancedBuffers.uv0 = new BABYLON.Vector2( uv_left, uv_bottom );
plane.instancedBuffers.uv1 = new BABYLON.Vector2( uv_right, uv_top );
You can do it like that:
Note that I had to add another attribute (vindex), to know which vertex is currently processed by the vertex shader, so that the right uv value can be set to uvUpdated.
Wow, thanks for a good example here! But why does it use two Vector4 positions when in regular plane’s UV we use only one Vector4? I mean for frontUV or backUV.
Do we actually need to change all 4 vertices for changing frontUV or backUV for a plane?
Not sure what you mean by “frontUV” and “backUV”, but uv coordinates are defined for each vertex, so for a plane you need 4 pair of coordinates. If you want to freely define the uv for each plane instance, you need to pass 4 vec2 to the shader, hence the 2 vec4 (2 vec2 are concatenated into a single vec4).