我正在为纹理边缘上具有单个像素轮廓的UI元素生成纹理。
在纹理中设置颜色数据的方法仅限于传递一维颜色值数组。
这些纹理是2D的,所以它们基本上是矩形。我需要能够识别当前像素何时处于边缘。这就是我目前的做法:
Color[] colorData = new Color[width * height];
for (int p = 0; p < colorData.Length; p++) {
//Top
if (p < width - 1) {
colorData[p] = DefaultOutlineColor;
}
//Left
else if(p % width == 0) {
colorData[p] = DefaultOutlineColor;
}
//Right
else if(p % height == height - outlineWidth) {
colorData[p] = DefaultOutlineColor;
}
//Bottom
else if(p >= width * (height - outlineWidth)) {
colorData[p] = DefaultOutlineColor;
}
//Fill
else {
colorData[p] = DefaultBaseColor;
}
}
一些Modulo数学,什么不是。我遇到的问题是纹理的右侧。更具体地说,计算右侧边缘。一张图片胜过千言万语:
我知道这只是右边缘部分的未命中计算。但我不知道如何让它发挥作用。任何帮助将受到高度赞赏。
编辑: 弄清楚了。这是工作代码:
//Fill
for (int p = 0; p < colorData.Length; p++) {
colorData[p] = DefaultBaseColor;
}
//Top
for (int p = 0; width * outlineWidth > p; p++) {
colorData[p] = DefaultOutlineColor;
}
//Left and Right
for (int p = 1; height > p; p++) {
for (int i = 0; i < outlineWidth; i++) {
colorData[(p * width) + i] = DefaultOutlineColor; //Left
colorData[((p * width) - i) - 1] = DefaultOutlineColor; //Right
}
}
//Bottom
for (int p = width * height - (width * outlineWidth); colorData.Length > p; p++) {
colorData[p] = DefaultOutlineColor;
}
答案 0 :(得分:2)
为什么不在三个循环中进行?一个用于顶部,一个用于左侧和右侧,然后一个用于底部?这样你就可以跳过所有不需要触摸的项目。
for(int ndx = 0; Width > ndx; ++ndx)
{
colorData[ndx] = DefaultOutlineColor;
}
for(int ndx = 1; Height > ndx; ++ndx)
{
colorDatandx * Widthp] = DefaultOutlineColor;
colorData[ndx*Width + Width] = DefaultOutlineColor;}
}
for(int ndx = Width * Height - Width; Length > ndx; ++ndx)
{
colorDatandxp] = DefaultOutlineColor;
}
答案 1 :(得分:1)
使用SoronelHaetir的方法我弄明白了。不得不稍微编辑一下数学。如果有人有兴趣,这是工作代码:
for (int ndx = 0; width > ndx; ndx++) {
colorData[ndx] = DefaultOutlineColor;
}
for (int ndx = 1; height > ndx ; ndx++) {
colorData[ndx * width] = DefaultOutlineColor;
colorData[(ndx * width) - 1] = DefaultOutlineColor;
}
for (int ndx = width * height - width; colorData.Length > ndx; ndx++) {
colorData[ndx] = DefaultOutlineColor;
}
答案 2 :(得分:0)
实际上你正在做一个像素的边框 - 但是你在原始代码中使用了outlineWidth
,所以这里有一个替代方法,适用于任意边框大小。
for (int p = 0; p < colorData.length; p++) {
// retrieving the x/y coords isn't expensive if you do this only once
int x = p % height;
int y = p / height;
if (x < outlineSize || y < outlineSize || x >= width - outlineSize || y >= height - outlineSize) {
colorData[p] = DefaultOutlineColor;
}
}