Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.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# 如何基于Unity中的摄影机视口将纹理应用于材质_C#_Unity3d_Image Processing_Camera_Textures - Fatal编程技术网

C# 如何基于Unity中的摄影机视口将纹理应用于材质

C# 如何基于Unity中的摄影机视口将纹理应用于材质,c#,unity3d,image-processing,camera,textures,C#,Unity3d,Image Processing,Camera,Textures,所以这篇文章或多或少是我最后一个问题的延续,所以如果你迷路了,请检查这个链接 基本上,当用户进一步放大相机时,我需要加载应用于球体上材质的高质量图像。现在,我根据缩放级别一次加载所有图像,这在较低的缩放级别上是非常不优化的,在较高的缩放级别上是不可能的,因为texture2darray只能容纳2048幅图像 我需要知道的是,我怎么能只加载相机正在查看的图像,而不担心屏幕外的图像 这可能是一个可笑的具体问题,所以我知道如果我在这里找错了方向,但我想我会把它扔出去,看看有没有人有什么见解 以下是我当

所以这篇文章或多或少是我最后一个问题的延续,所以如果你迷路了,请检查这个链接

基本上,当用户进一步放大相机时,我需要加载应用于球体上材质的高质量图像。现在,我根据缩放级别一次加载所有图像,这在较低的缩放级别上是非常不优化的,在较高的缩放级别上是不可能的,因为texture2darray只能容纳2048幅图像

我需要知道的是,我怎么能只加载相机正在查看的图像,而不担心屏幕外的图像

这可能是一个可笑的具体问题,所以我知道如果我在这里找错了方向,但我想我会把它扔出去,看看有没有人有什么见解

以下是我当前的平铺课程:

使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类TilerHelper:单一行为
{
MapTiler tiler=new MapTiler(“G:/s2cloudless_4326_v1.0.0.sqlite”);//从sql表加载的函数
公共材质垫;//该材质
Texture2DArray texArr;//将生成最终纹理的数组
public Texture2D[]textures;//从sql表加载的图像
int size=2048;//texture2darray只能保存2048个纹理
int count=0;//用于加载图像的迭代器
int zoom=1;//确定从sql表加载哪个缩放级别
int lastZoom=1;//确定缩放级别是否已移动
CameraOrbit cam;//主摄像机
int initX=3;//缩放级别为1的图像的x值
int initY=1;//缩放级别为1的图像的y值
//在第一帧更新之前调用Start
void Start()
{
SetTiles(3,1,1,4,2);//当程序启动时,它以最大距离加载第一组图像
cam=Camera.main.gameObject.GetComponent();
}
//每帧调用一次更新
无效更新()
{
//这些不同的缩放级别基于相机与地球的距离(地球很大,所以数字很大)

if(cam.distance这是一个有趣的问题,可以尝试解决,而不必在大量的瓷砖或像素中循环。下面是一个部分答案,可能会帮助您找到解决方案

这里有两个主要问题:

  • 查找哪些“瓷砖”对摄影机可见
  • 将这些平铺加载到着色器中并使其正确索引

  • 查找哪些“瓷砖”对摄影机可见 我在这里能想到的最好的办法是尝试找到一种方法,将摄像机的球面视图投影到可见点在等矩形投影上的位置

    您可以使用多个
    ViewportPointToRay
    和碰撞检查对此进行采样,但这将是不准确的,尤其是在摄影机可以看到球体“周围”且光线不与球体发生碰撞的情况下

    可能有一个公式化的方法,但我不知道该怎么做


    将这些平铺加载到着色器中并使其正确索引。 如果您可以确定需要发送哪些等矩形图块,那么这是更容易的部分。如果您可以绘制一个矩形,在相机可以看到的所有点周围水平循环,那么您可以发送部分或完全位于“加载矩形”内的图块

    您还需要发送矩形的起点和终点。因此着色器可以计算如何将整个贴图
    texIndex
    坐标更改为“加载矩形”中存储该平铺的位置

    基本上,着色器中的这些线可能是相同的:

    float2 equiUV = RadialCoords(IN.normal);
    
    float2 texIndex;
    float2 uvInTex = modf(equiUV * float2(_COLUMNS, _ROWS), texIndex);
    
    ...
    
    return UNITY_SAMPLE_TEX2DARRAY(_MainTexArray,
            float3(uvInTex, flatTexIndex));
    
    该行必须以某种方式更改,以同时考虑加载矩形参数以及它如何水平环绕平铺贴图:

    int flatTexIndex = texIndex.x * _ROWS + texIndex.y;
    


    很抱歉含糊不清,特别是第一部分。祝你好运。

    你在这个问题上取得了进展吗?这是一个棘手的问题,不是真的。最终我在Unity store(世界政治地图)上找到了一项资产它有自己的自定义平铺系统,这或多或少满足了我的目的。尽管看了他们的代码,我仍然对它的工作原理感到迷惘。啊,解决方案一直都是一种邪术。这就是软件工程师的生活。谢谢你提供了解决方案的想法。
    int flatTexIndex = texIndex.x * _ROWS + texIndex.y;