如何从ShaderToy转换这些fragColor代码片段,以便它们在Unity中工作?

时间:2019-02-05 22:10:30

标签: unity3d colors shader

我正在遵循本教程:https://www.youtube.com/watch?v=CzORVWFvZ28,将一些代码从ShaderToy转换为Unity。这是我尝试转换的着色器:https://www.shadertoy.com/view/Ws23WD

我在教程中看到,他能够从ShaderToy中获取他的fragColor语句,而只是在Unity中返回一种颜色。但是,当我尝试使用ShaderToy的代码执行此操作时,弹出一个关于无法将其从float3隐式转换为float4的错误。我看到我的颜色变量被声明为float3,这肯定是导致该问题的原因,但是我需要一些帮助来弄清楚如何解决此问题。

我还注意到除了rgb值外,我还有一个带有fragColor变量的'a'值;我会用float4来获取(r,g,b,a)值吗?

fixed4 frag (v2f i) : SV_Target
            {                                
                //float2 uv = float2(fragCoord.x / iResolution.x, fragCoord.y / iResolution.y);
                float2 uv = float2(i.uv);

                uv -= 0.5;
                //uv /= float2(iResolution.y / iResolution.x, 1);

                float3 cam = float3(0, -0.15, -3.5);
                float3 dir = normalize(float3(uv,1));

                float cam_a2 = sin(_Time.y) * pi * 0.1;
                cam.yz = rotate(cam.yz, cam_a2);
                dir.yz = rotate(dir.yz, cam_a2);

                float cam_a = _Time.y * pi * 0.1;
                cam.xz = rotate(cam.xz, cam_a);
                dir.xz = rotate(dir.xz, cam_a);

                float3 color = float3(0.16, 0.12, 0.10);
                float t = 0.00001;
                const int maxSteps = 128;
                for(int i = 0; i < maxSteps; ++i) {
                float3 p = cam + dir * t;
                float d = scene(p);

                if(d < 0.0001 * t) {
                    color = float3(1.0, length(p) * (0.6 + (sin(_Time.y*3.0)+1.0) * 0.5 * 0.4), 0);
                    break;
                }

                t += d;
            }

            //fragColor.rgb = color;
            return color;
            //fragColor.a = 1.0;
        }

0 个答案:

没有答案