Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unity3d:如何计算彩色网格中不同颜色的表面积_C#_Unity3d_Shader - Fatal编程技术网

C# Unity3d:如何计算彩色网格中不同颜色的表面积

C# Unity3d:如何计算彩色网格中不同颜色的表面积,c#,unity3d,shader,C#,Unity3d,Shader,我在运行时创建了一个网格,并使用一个特殊的共享。共享文件具有以下属性: 1.第一次上色时,颜色为蓝色 2.第二次着色时,颜色为黄色 3.第三次着色时,颜色为红色 4.当第四次或更多次着色时,颜色变为绿色 下面是一个彩色区域的示例: 在上图中,绿色区域有许多糖浆层。我无法通过对网格中的三角形求和来计算面积,因为存在许多重叠。 编辑我正在用更多信息更新问题 网格是使用以下代码生成的(这不是完整的代码,它足以给出如何生成网格的一般概念) for(int i=start;i 0.5) { parent

我在运行时创建了一个网格,并使用一个特殊的共享。共享文件具有以下属性:
1.第一次上色时,颜色为蓝色
2.第二次着色时,颜色为黄色
3.第三次着色时,颜色为红色
4.当第四次或更多次着色时,颜色变为绿色

下面是一个彩色区域的示例:

在上图中,绿色区域有许多糖浆层。我无法通过对网格中的三角形求和来计算面积,因为存在许多重叠。

编辑我正在用更多信息更新问题
网格是使用以下代码生成的(这不是完整的代码,它足以给出如何生成网格的一般概念)

for(int i=start;i 0.5)
{
parent.rotation=Quaternion.LookRotation(relativePos);
}
当前位置=点[i];
Vector3偏移=父级。右*宽度/2f;
顶点。添加(当前位置-偏移);
顶点。添加(当前位置+偏移);
添加(新向量2(0,1));
添加(新矢量2(1,1));
如果(顶点数<4)
{
返回;
}
int c=顶点数;
三角形。添加(c-1);
三角形。添加(c-2);
三角形。添加(c-3);
三角形。添加(c-3);
三角形。添加(c-2);
三角形。添加(c-4);
Vector3[]v=新的Vector3[c];
Vector2[]uv=新Vector2[c];
int[]t=新的int[triangles.Count];
顶点。复制到(v,0);
uvs.CopyTo(uv,0);
三角形。CopyTo(t,0);
网格顶点=v;
mesh.triangles=t;
网格uv=uv;
}
现在我要计算每种颜色的面积。给定上述网格,是否可以计算每种颜色的面积?欢迎提出任何建议

编辑2

显然,没有办法使用mash信息计算彩色区域(至少根据我的研究)。我是如何寻找一种创造性的方式来实现我想要的。我欢迎并感谢任何建议

我只取一组绿色顶点,计算它的Delaunay三角剖分,然后找到它的面积。或者,为了得到更精确的结果-计算凹面外壳的轮廓,而不是Delaunay,然后使用任意多边形的面积。

一个简单的脚本来截图,然后计算绿色像素

将脚本放在渲染摄影机上,将
m_TakeScreenshot
设置为true,它将在当前帧中工作

公共类截屏摄像机:单一行为
{
公共图书馆m_截图;
公共纹理2D m_输出纹理;
void OnPostRender()
{
如果(m_截图)
{
m_TakeScreenshot=错误;
//截图
if(m_OutputTexture==null)
m_OutputTexture=新纹理2d(屏幕宽度、屏幕高度);
m_OutputTexture.ReadPixels(新的矩形(0,0,Screen.width,Screen.height),0,0);
m_OutputTexture.Apply();
//获取所有像素,计算绿色像素
var pixels=m_OutputTexture.GetPixels(0,0,m_OutputTexture.width,m_OutputTexture.height);
int绿色像素=0,其他像素=0;
foreach(以像素为单位的颜色变量)
{
//绿色的
if(color.g>0.8f&&color.r<0.1f&&color.b<0.1f)
绿色像素++;
//不黑
else if(color.r>0.1f | | color.g>0.1f | | color.b>0.1f)
其他像素++;
}
}
}
}

能否添加用于着色的代码?一般情况下:运行->,计算每一个并将相应的面积相加如果您可以访问网格,那么您可以访问三角形?你知道每个通道的颜色吗?如果是的话,就把它们循环一下。。你应该用这些信息更新这个问题,因为现在还不清楚这是关于重叠网格的。再说一遍:问题中的图像是如何生成的?首先是什么使网格着色?你也看到了吗?你尝试过我们之前提到的任何事情吗?嗯,由于区域不规则,几乎不可能获得准确的结果,如果近似结果正常,你可以将此场景渲染为大纹理,然后计算绿色像素。
for (int i = start; i<colorUntil; i++)
{
    parent.position = currentPosition;
    Vector3 relativePos = points[i + 1] - points[i];
    if (relativePos.magnitude > 0.5)
    {
        parent.rotation = Quaternion.LookRotation(relativePos);
    }

    currentPosition = points[i];
    Vector3 offset = parent.right * width / 2f;
    vertices.Add(currentPosition - offset);
    vertices.Add(currentPosition + offset);

    uvs.Add(new Vector2(0, 1));
    uvs.Add(new Vector2(1, 1));

    if (vertices.Count< 4)
    {
        return;
    }

    int c = vertices.Count;
    triangles.Add(c - 1);
    triangles.Add(c - 2);
    triangles.Add(c - 3);
    triangles.Add(c - 3);
    triangles.Add(c - 2);
    triangles.Add(c - 4);

    Vector3[] v = new Vector3[c];
    Vector2[] uv = new Vector2[c];
    int[] t = new int[triangles.Count];
    vertices.CopyTo(v, 0);
    uvs.CopyTo(uv, 0);
    triangles.CopyTo(t, 0);

    mesh.vertices = v;
    mesh.triangles = t;
    mesh.uv = uv;
}