so einiges... vor allem wenn du rendermonkey1.5 verwendest ists echt der hammer.
1. matrizen vectoren an die 3dgs spezifikation anpassen, und zwar am besten im kompletten script. z.b.:
float4x4 Various_Wood_Shaders_Wood2_Single_Pass_Vertex_Shader_view_proj_matrix : ViewProjection;
wird zu
float4x4 matWorldViewProj;
und dann im ganzen script austauschen.
2.
im vertexshader:
z.b. Out.Pos = mul(Pos, matWorldViewProj);
rendermonkey exportiert aber mul (matWorldViewProj,Pos) und das führt zu unerwünschten ergebnissen
3. sowas:
float Various_Wood_Shaders_Wood2_Single_Pass_Vertex_Shader_scale
<
string UIName = "Various_Wood_Shaders_Wood2_Single_Pass_Vertex_Shader_scale";
string UIWidget = "Numeric";
float UIMin = 0.00;
float UIMax = 0.10;
> = 0.03;
wird zu:
float Various_Wood_Shaders_Wood2_Single_Pass_Vertex_Shader_scale = 0.03;
4. wo immer sowas : float4 blabla = (x,y,z,w); auftaucht müssen die runden klammern in { umgewandelt werden. das hat mir gestern nacht 4 stunden kopfzerbrechen bereitet
5. die sampler definition sollte z.b. so aussehen:
sampler sampler_name = sample_state
{
Texture = (mtlSkin1);
ADDRESSU = WRAP;
ADDRESSV = WRAP;
ADDRESSW = WRAP;
MAGFILTER = LINEAR;
MINFILTER = LINEAR;
MIPFILTER = LINEAR;
};
6. z.b. wird aus:
Out.normal = mul( normal,matView);
Out.viewVec = -mul( Pos,matView);
sowas:
Out.normal = mul(normal,matWorld);
Out.viewVec = vecViewPos - mul(Pos,matWorld);
das war jetzt bestimmt nicht alles, aber es sollte dir schonmal helfen:)
hier z.b. mal ein funktionierender holzshader. mtlSkin1 ist z.b. eine DifferenzWolke aus Photoshop.
Code:
float4x4 matWorldViewProj;
float4x4 matWorld;
float4 vecSunDir;
float4 vecViewPos;
float scale = 0.01;
texture mtlSkin1;
struct Vertex_Shader_VS_OUTPUT {
float4 Pos: POSITION;
float3 pos: TEXCOORD0;
float3 normal: TEXCOORD1;
float3 viewVec: TEXCOORD2;
};
Vertex_Shader_VS_OUTPUT Vertex_Shader_main(float4 Pos: POSITION, float3 normal: NORMAL){
Vertex_Shader_VS_OUTPUT Out;
Out.Pos = mul(Pos, matWorldViewProj);
// Pass position to fragment shader
Out.pos = scale * Pos;
// Eye-space lighting
Out.normal = mul(normal,matWorld);//mul( normal,matView);
Out.viewVec = vecViewPos - mul(Pos,matWorld);//-mul( Pos,matView);
return Out;
}
float Kd = 0.89;
float Ks = 0.66;
float4 darkWood = { 0.44, 0.21, 0.00, 1.00 };
float4 liteWood = { 0.92, 0.50, 0.13, 1.00 };
float frequency = 3.72;
float ringSharpness = 21.00;
float noiseScale = 0.96;
float4 lightDir = { 0.41, 0.41, -0.82, 0.00 };
sampler Noise = sampler_state
{
Texture = (mtlSkin1);
ADDRESSU = WRAP;
ADDRESSV = WRAP;
ADDRESSW = WRAP;
MAGFILTER = LINEAR;
MINFILTER = LINEAR;
MIPFILTER = LINEAR;
};
float4 Pixel_Shader_main(float4 pos: TEXCOORD0, float3 normal: TEXCOORD1, float3 viewVec: TEXCOORD2) : COLOR {
// Signed noise
float snoise = 2 * tex3D(Noise, pos) - 1;
// Rings goes along z axis, perturbed with some noise
float r = frac(frequency * pos.z + noiseScale * snoise);
// Map [0.1] to 0->1->0 in a smooth curve, f(r) = r - r^ringSharpness
// We want this curve to reach a value of 1 at its maximum in
// the 0 < r < 1 interval. So we'll need to find the maximum
// value in this interval, invert and multiply with the curve.
// Those interested in math might want to derive the invMax
// calculation below themselves by solving for f'(r) = 0
// and inserting into the function.
float invMax = pow(ringSharpness, ringSharpness / (ringSharpness - 1)) / (ringSharpness - 1);
float ring = invMax * (r - pow(r, ringSharpness));
// Add some noise and get our Various_Wood_Shaders_Wood3_Single_Pass_Pixel_Shader_base color
float lrp = ring + snoise;
float4 base = lerp(darkWood, liteWood, lrp);
normal = normalize(normal);
// Soft Various_Wood_Shaders_Wood3_Single_Pass_Pixel_Shader_diffuse
float diffuse = 0.5 + 0.5 * dot(vecSunDir, normal);
// Standard Various_Wood_Shaders_Wood3_Single_Pass_Pixel_Shader_specular
float specular = pow(saturate(dot(reflect(-normalize(viewVec), normal), vecSunDir)), 12);
float4 result=Kd * diffuse * base + Ks * specular;
return result;
}
technique holz
{
pass pussi
{
VertexShader = compile vs_1_1 Vertex_Shader_main();
PixelShader = compile ps_2_0 Pixel_Shader_main();
}
}
das sieht dann so aus: