Unity3d 在RFloat纹理中设置像素

Unity3d 在RFloat纹理中设置像素,unity3d,Unity3d,我想使用Graphics.Blit在GPU上实现一个算法。输入值是浮点值,输出值也是浮点值。我用RFloat格式创建了一个纹理,并希望为每个像素设置值。我该怎么设置呢?根据unitySetPixels的说明,设置像素不起作用: 此函数仅适用于ARGB32、RGB24和Alpha8纹理格式。 对于其他格式,将忽略SetPixels 该算法需要浮点精度,因此这两种格式都不可用。那么,如何做到这一点呢 编辑:在与unity RenderTextures进行了更多的斗争之后,下面是我提出的将数据传输到G

我想使用
Graphics.Blit
在GPU上实现一个算法。输入值是浮点值,输出值也是浮点值。我用RFloat格式创建了一个纹理,并希望为每个像素设置值。我该怎么设置呢?根据unity
SetPixels
的说明,设置像素不起作用:

此函数仅适用于ARGB32、RGB24和Alpha8纹理格式。 对于其他格式,将忽略SetPixels

该算法需要浮点精度,因此这两种格式都不可用。那么,如何做到这一点呢

编辑:在与unity RenderTextures进行了更多的斗争之后,下面是我提出的将数据传输到GPU的代码

    int res=512;
    Texture2D tempTexture= new Texture2D(res, res, TextureFormat.RFloat, false);

    public void ApplyHeightsToRT(float[,] heights, RenderTexture renderTexture)
    {

        RenderTexture.active = renderTexture;
        Texture2D tempTexture = new Texture2D(res, res, TextureFormat.RFloat, false);
        tempTexture.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0
            , false);
        for (int i = 0; i < tempTexture.width; i++)
            for (int j = 0; j < tempTexture.height; j++)
            {
                tempTexture.SetPixel(i, j, new Color(heights[i, j], 0, 0, 0));
            }
        tempTexture.Apply();
        RenderTexture.active = null;
        Graphics.Blit(tempTexture, renderTexture);
    }
int res=512;
Texture2D tentexture=新的Texture2D(res,res,TextureFormat.RFloat,false);
公共空间应用权重侵权(浮动[,]高度,渲染器渲染器渲染器)
{
RenderTexture.active=RenderTexture;
Texture2D tentexture=新的Texture2D(res,res,TextureFormat.RFloat,false);
ReadPixels(新矩形(0,0,renderTexture.width,renderTexture.height),0,0
,假);
for(int i=0;i
这段代码成功地将Tentexture上传到RenderTexture。反向操作类似地通过以下方法完成(RenderTexture复制到Tentexture):

public void ApplyRTToHeights(渲染器渲染器渲染器,浮动[,]高度)
{
RenderTexture.active=RenderTexture;
ReadPixels(新矩形(0,0,renderTexture.width,renderTexture.height),0,0
,假);
for(int i=0;i
为了测试代码,我得到了地形的heightmap,然后调用第一个方法用heightmap填充RenderTexture。然后我调用第二种方法从RenderTexture中获取像素,并将它们放在地形上。它不应该做任何事情。对吧?

实际上,一个接一个地调用这两个方法将翻转地形高度贴图,并创建带状瑕疵。很奇怪。经过进一步调查,flip的原因原来是格式问题。这两种方法上面创建的诱惑纹理实际上是一个ARGB32纹理,而不是我希望的RFloat

这就是翻转的原因。将TenterTexture的代码更改为ARGB32纹理并将RenderTexture更改为RGBA32后,翻转行为消失了。现在只有带状瑕疵:

这是可以理解的,因为我只使用了8位(红色通道)的TenterTexture和RenderTexture


现在的问题不是在RFloat纹理上设置数据。问题是我的图形卡和许多其他不同的图形设备不支持RFloat纹理问题是找到一种方法将浮点数组传输到渲染器。

是否要实现某种hdr图像效果?如果不是,你就不能把你的浮点值映射到[0255]上吗?不是。这是一个数值算法,与图像效果和hdr无关。此外,计算还需要浮点精度,这意味着无法将其转换为0-255范围的整数。您试图在gpu上运行的算法是什么?也可以使用计算着色器/缓冲区(假设您对目标具有DX11访问权限)完成此操作。也许你不必使用textures@xyLe_这是一个地形侵蚀模拟算法。是的,它可以使用计算着色器运行,但正如您所说,它需要DX11,我不想将我的算法与之绑定。好的,如果您还没有使用计算着色器,本教程帮助我开始:(现在只能通过web archive使用,因为博客已被删除:|)
    public void ApplyRTToHeights(RenderTexture renderTexture, float[,] heights)
    {

        RenderTexture.active = renderTexture;
        tempTexture.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0
            , false);
        for (int i = 0; i < tempTexture.width; i++)
            for (int j = 0; j < tempTexture.height; j++)
            {
                heights[i, j]=tempTexture.GetPixel(i, j).r;
            }
        RenderTexture.active = null;
    }