【问题标题】:issues converting HLSL shader to shaderLab将 HLSL 着色器转换为 shaderLab 的问题
【发布时间】:2014-09-11 17:24:33
【问题描述】:

我一直在从事一个项目,该项目涉及我使用我不熟悉的着色器编码。我从另一个团队成员那里获得了一些 HLSL 代码,并且一直在尝试统一实施。无法直接使用提供的代码我一直在尝试将其转换为统一希望它采用的格式,如下所示。只是想看看是否有明显的地方出错了,它编译得很好,我可以将它附加到一个对象上,但它只是一个纯黑色。

Shader "Custom/test2" {
SubShader {
    Pass{
    CGPROGRAM
    #pragma fragment frag

    struct PixelInput {
        float4 norm : TEXCOORD0;
        float4 worldpos : TEXCOORD1;
        float4 eyevector : TEXCOORD2;
        float4 tangent : TEXCOORD3;
        float4 binormal : TEXCOORD4;
        float4 objpos : TEXCOORD5;
        float4 tex0 : TEXCOORD6;
        float4 tex1 : TEXCOORD7;
    };

    struct PixelOutput {
        float4 c : COLOR;
    };

    uniform sampler2D BumpTex;
    uniform sampler2D MarbleCol1;

    float4 marblefunc(float4 p, float3 norm, float3 eye, float4 uv){
        float3 var;
        float3 pos = p.xyz * 0.019500 ;
        float3 r = float3(pos.x, pos.y, pos.z);
        var[0] = (pos.x +10000 )* 0.045000 + 60 *noise (r);
        var[2] = var[0]%17;
        if (var[2]<4){
            r.r = pos.x/70.0f; r.g = pos.y/50.0f; r.b = pos.z/50.0f;
            var[1] = 0.7f+0.2f*noise(r);
        }
        else {
            r.r = pos.x; r.g = pos.y; r.b = pos.z;
            if ( var[2] <9 ) {
                if (var[2] >=12){
                    var[0] = abs(var[0]-(var[0]/17.0) *17.0 - 10.5)* 0.1538462;
                    var[1] = 0.3 + 0.3*var[0] + 0.8*noise(r);

                }
            } else {
                var[1] = 0.3f*(1.0f + noise(r));
            }
        }
        float4 c0 = tex2D(MarbleCol1,uv);
        float4 c1 = float4( 0.301961, 0.815686, 0.101961, 1.0);
        return (1.0f-var[1])*c0 + var[1]*c1;
    }

    uniform float4 Specular = float4(0.900000,0.900000,0.900000,1.000000);
    uniform float4 Emissive = float4(0.000000,0.000000,0.000000,1.0f);
    uniform float SpecularLevel = 0.000000;
    uniform float GlossLevel = 9.999999;
    uniform float3 LightCol0;
    uniform float3 LightDir0;
    uniform float LightFallOff0;
    uniform float LightHotSpot0;
    uniform float Opacity = 1.000000;

    PixelOutput fragmentEntry(PixelInput pi)
    {
        PixelOutput PO;
        float3 N;
        N = normalize(pi.norm.xyz);
        float3 Eye;
        Eye.xyz = normalize(pi.eyevector.xyz);
        float4 nColor = float4(0.0,0.0,0.0,1.0);
        float3 BumpN;
        float3 BumpX, BumpY, BumpZ;
        BumpN = tex2D(BumpTex, pi.tex0);
        BumpN = (BumpN - 0.5);
        BumpN = normalize(float3(BumpN.x *0.300000, BumpN.y *0.300000, BumpN.z));
        BumpZ = N;
        BumpX = pi.binormal.xyz;
        BumpY = pi.tangent.xyz;
        BumpX = normalize(BumpX);
        BumpY = normalize(BumpY);
        BumpZ = normalize(BumpZ);
        N = BumpX *BumpN.x + BumpY* BumpN.y + BumpZ *BumpN.z;
        float4 mDiffuse;
        mDiffuse = marblefunc( pi.objpos, N, Eye, pi.tex0);
        float4 mSpecular = Specular;
        float4 SelfIllum = Emissive;
        nColor = nColor + SelfIllum *mDiffuse;
        float3 H;
        float3 Light;
        float f;
        float fAtt;
        float fDist;
        fAtt = 1.0;
        nColor = nColor + float4(LightCol0,1.0)* mDiffuse* clamp(dot(N,LightDir0),0,1)* fAtt;
        H = normalize(Eye+Light);
        f = clamp(dot(N,H),0,1);
        f = pow(f, GlossLevel);
        f = f *SpecularLevel;
        nColor = nColor + float4(LightCol0,1.0)* mSpecular* f *fAtt;
        nColor.a = Opacity;
        PO.c = nColor;
        return PO;
    }
    ENDCG
    }
} 
FallBack "Diffuse"
}

非常感谢任何和所有帮助。

【问题讨论】:

    标签: unity3d shader hlsl fragment-shader


    【解决方案1】:

    您真的应该尝试编译它,并逐步解决编译器错误。这里只是一些提示:

    1. 您使用的是普通的CG 代码,而不是shaderlab 着色器。这很好,语法与Nvidia doc 中记录的语法相同。
    2. var[2] = var[0]%17; var 是一个浮点数,因此您应该改用 fmod
    3. 当您在纯 CG 中编写着色器时,您必须同时提供片段程序和顶点程序。在您的情况下,缺少顶点程序。 (见#pragma vertex vertexFunctionName
    4. 快速测试后,您可能使用了太多指令。您应该考虑针对更高的配置文件进行编译(例如 #pragma target 3.0 )。

    以上只是一些提示。我认为这对你来说完全调试着色器太过分了。如果您对特定错误有具体问题,请随时提出。

    【讨论】:

    • 好的,谢谢您的提示。我最初在那里有#pragma vertex vert,但是因为它给出了一个错误,所以我把它取出来,这样我就可以让它进入它运行的状态。当您提到使用目标 3.0 时,是在 pragma frag 和 pragma vert 之上或代替它。除了那段时间阅读 nvidia 文档以更适应这一切 :)
    • @David Parsonson:更清楚一点。目标 3.0 是一个特定于统一的指令:docs.unity3d.com/Manual/SL-ShaderPrograms.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    相关资源
    最近更新 更多