在Android上计算着色器错误

时间:2019-04-09 05:46:05

标签: unity3d bit-manipulation shader hlsl

我正在尝试在Compute Shader中将Texture2D与RWTexture2D混合。我需要逐个通道完成

由于我看到Android不支持RWTexture2D<float4>纹理,因此我使用了自己的RGBA32结构,该结构由4个浮点数组成。当我尝试在Unity Editor中对两个纹理的通道求和或插值时,一切正常。在Android上会发生错误(Kernel at Index(0) is invalid)。

   ARBG32 finalColor;
    float finalColor.r = colorA.r + colorB.r

如果我将代码更改为finalColor.r = colorB.r,则可以在Android上正常运行。 是否可以像这样添加或内插频道?还是我需要按位操作或将它们拆包以合并两个通道? 我以为我没有这么做,因为编辑器中的代码可以正常工作。

更新-------

其他信息:我想做的是在运行时使用“渲染纹理”创建遮罩,该遮罩在创建后将用于在地形上混合一些纹理。该蒙版的每个通道(RGBA)将被绘制一些形状(画笔),并用于在材质上混合不同的纹理。这将导致地形由地面,草地和积雪区域组成。

我正在Compute Shader中执行所有操作,因为我不需要将此附加到材质上,我还需要从一些缓冲区中获取信息。

我现在的主要目标是进行这项工作,以后会进行优化。 画笔是灰度的。 因此,除了AddIntensity()函数之外,该项目中的所有内容都在工作。该代码可在Unity编辑器上很好地工作,但不能在Android上工作。 如果我这样做:

        mainTexColor.r = brushColor.r;

它可以在Android上运行,但我需要的是每次在该像素中使用画笔绘制时都增加强度。 实际上,我尝试在颜色通道中执行的每个操作都可以在Editor上正常运行,但不能在Android上正常运行。 我是图形编程的新手,但是我知道Unity编辑器可以在OpenGL上的Vulkan和Android上运行。

例如:我发现float4在Android上不起作用。

我希望这可以帮助您更好地理解我的问题。

// Textures
RWTexture2D<ARBG32> ResultMask;
Texture2D<ARBG32> Brush;
//Color class
class ARBG32
{
    float r;
    float g;
    float b;
    float a;
};

//Function to add a brush value to a channel
       ARBG32 AddIntensity(ARBG32 mainTexColor, ARBG32 brushColor, int channel)
        {
            if(channel == 0)
                mainTexColor.r += brushColor.r;
            else if (channel == 1)
                mainTexColor.g += brushColor.r;
            else if (channel == 2)
                mainTexColor.b += brushColor.r;
            else 
                mainTexColor.a += brushColor.r;

            return mainTexColor;
        }

0 个答案:

没有答案