Unity3d 将HLSL着色器转换为shaderLab时出现的问题
我一直在从事一个项目,其中涉及到我与着色器编码一些我不熟悉的工作。另一个团队成员向我提供了一些HLSL代码,并一直在尝试在unity中实现。由于无法直接使用提供的代码,我一直在尝试将其转换为unity希望它采用的格式,如下所示。我只是想看看是否有任何明显的地方我出错了它编译得很好,我可以将它附加到一个对象上,但它只是一个平面黑色Unity3d 将HLSL着色器转换为shaderLab时出现的问题,unity3d,shader,hlsl,fragment-shader,Unity3d,Shader,Hlsl,Fragment Shader,我一直在从事一个项目,其中涉及到我与着色器编码一些我不熟悉的工作。另一个团队成员向我提供了一些HLSL代码,并一直在尝试在unity中实现。由于无法直接使用提供的代码,我一直在尝试将其转换为unity希望它采用的格式,如下所示。我只是想看看是否有任何明显的地方我出错了它编译得很好,我可以将它附加到一个对象上,但它只是一个平面黑色 Shader "Custom/test2" { SubShader { Pass{ CGPROGRAM #pragma fragment fra
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"
}
着色器“自定义/测试2”{
子阴影{
通过{
CGP程序
#布拉格碎片碎片
结构像素输入{
浮动4范数:TEXCOORD0;
浮动4世界位置:TEXCOORD1;
float4眼向量:TEXCOORD2;
float4切线:TEXCOORD3;
浮动4副法线:TEXCOORD4;
浮动4 objpos:TEXCOORD5;
浮动4 tex0:TEXCOORD6;
浮动4 tex1:TEXCOORD7;
};
结构像素输出{
c:颜色;
};
均匀取样器;
均匀采样器2D大理石1;
浮动4 marblefunc(浮动4 p、浮动3标准、浮动3眼睛、浮动4 uv){
3个变量;
浮动3位置=p.xyz*0.019500;
浮动3 r=浮动3(位置x、位置y、位置z);
var[0]=(位置x+10000)*0.045000+60*噪声(r);
var[2]=var[0]%17;
如果(var[2],您真的应该尝试编译它,并逐步解决编译器错误。这里只是一些提示:
您使用的是普通的CG
code,而不是shaderlab
shaders。这很好,语法与文档中记录的语法相同
var[2]=var[0]%17;
var是一个浮点数,因此您应该改用它
在普通CG中编写着色器时,必须同时提供片段和顶点程序。在这种情况下,顶点程序丢失。(请参见#pragma vertexFunctionName
)
<> LI>快速测试后,您可能使用过多的指令。您应该考虑对较高的配置文件进行编译(E.S.PracMar目标3)。
上面只有一些提示。我认为这对您完全调试着色器来说太多了。如果您对特定错误有特定问题,请随时提问。好的,谢谢您的提示。我最初在那里有#pragma vertex vert,但由于它出现了错误,所以将其取出,这样我就可以使其处于运行状态。当您使用目标3的论点是在PrimaMaRag和PrimaValt之上或代替TabMaRag和PrimaValt。其他时候,阅读英伟达DOC以获得更舒适的结果:)David Parsonson:更清楚。目标3是一个统一特定的指令: