程序纹理uv错误
Procedural texture uv error
我正在创建一个使用程序生成的平面和 uv 的游戏,它大部分工作正常,但有一个地方 uv 似乎以一种非常混乱的方式扭曲。
简介:uv 映射在 "Global" uv 坐标中,而不是局部坐标,因为纹理必须与相邻平面对齐。每个纹理都有 2*2 的平铺,我引入了 2 的 uv 比例,这意味着每个平面 "v" 坐标将垂直映射到纹理的 [0, 0.5] 范围内,以确保水平 "u" 坐标不会超出范围 [0, 1]。 (水平噪音在某种程度上是不可预测的)。
代码:
Vector2[] CalculateU(float[] leftXMap, float[] rightXMap) {
int length = leftXMap.Length;
float totalHeight = (length - 1) * 1; // distance between two vertices vertically is 1
float uvheight = totalHeight * uvScale; // uvScale is 2, purpose is to map a plane's v(vertically), into a range of [0, 0.5]..
Vector2[] UMap = new Vector2[length * 2];
for(int i = 0; i < length; i++) {
float left = leftXMap[i];
float right = rightXMap[i];
// make left and right positive.
while (left < 0) {
left += uvheight;
}
while(right < 0) {
right += uvheight;
}
float leftu = (left % uvheight) / uvheight;
float leftv = (i / (float)(length-1)) / uvScale;
float rightu = (right % uvheight) / uvheight;
float rightv = leftv; //(i / (float)length) / 2f;
UMap[i * 2] = new Vector2(leftu, leftv);
UMap[i * 2 + 1] = new Vector2(rightu, rightv);
}
}
解释:
函数的参数是生成平面的噪声图。噪声是 x 坐标。而 y 坐标是简单的值 0, 1, 2, .... (length-1)。
扭曲的纹理:
放大:
我设法解决了这个问题,UV 贴图变得混乱,左侧噪声贴图值为负,右侧噪声贴图为正值。
因为我总是试图将所有负值映射到正值,所以左噪声图,也就是我的左顶点 x 坐标,将被映射到正值。但随后它将大于右噪声图(右顶点 x 坐标)。然后它搞砸了紫外线。
我是完全不贴图解决的,突然发现UV贴图值可以为负,我根本不用贴图!
我正在创建一个使用程序生成的平面和 uv 的游戏,它大部分工作正常,但有一个地方 uv 似乎以一种非常混乱的方式扭曲。
简介:uv 映射在 "Global" uv 坐标中,而不是局部坐标,因为纹理必须与相邻平面对齐。每个纹理都有 2*2 的平铺,我引入了 2 的 uv 比例,这意味着每个平面 "v" 坐标将垂直映射到纹理的 [0, 0.5] 范围内,以确保水平 "u" 坐标不会超出范围 [0, 1]。 (水平噪音在某种程度上是不可预测的)。 代码:
Vector2[] CalculateU(float[] leftXMap, float[] rightXMap) {
int length = leftXMap.Length;
float totalHeight = (length - 1) * 1; // distance between two vertices vertically is 1
float uvheight = totalHeight * uvScale; // uvScale is 2, purpose is to map a plane's v(vertically), into a range of [0, 0.5]..
Vector2[] UMap = new Vector2[length * 2];
for(int i = 0; i < length; i++) {
float left = leftXMap[i];
float right = rightXMap[i];
// make left and right positive.
while (left < 0) {
left += uvheight;
}
while(right < 0) {
right += uvheight;
}
float leftu = (left % uvheight) / uvheight;
float leftv = (i / (float)(length-1)) / uvScale;
float rightu = (right % uvheight) / uvheight;
float rightv = leftv; //(i / (float)length) / 2f;
UMap[i * 2] = new Vector2(leftu, leftv);
UMap[i * 2 + 1] = new Vector2(rightu, rightv);
}
}
解释: 函数的参数是生成平面的噪声图。噪声是 x 坐标。而 y 坐标是简单的值 0, 1, 2, .... (length-1)。
扭曲的纹理:
放大:
我设法解决了这个问题,UV 贴图变得混乱,左侧噪声贴图值为负,右侧噪声贴图为正值。
因为我总是试图将所有负值映射到正值,所以左噪声图,也就是我的左顶点 x 坐标,将被映射到正值。但随后它将大于右噪声图(右顶点 x 坐标)。然后它搞砸了紫外线。
我是完全不贴图解决的,突然发现UV贴图值可以为负,我根本不用贴图!