1 registered members (AndrewAMD),
1,203
guests, and 9
spiders. |
Key:
Admin,
Global Mod,
Mod
|
|
|
Re: Shader Tools - Frage / Question
[Re: Team_GamesArk]
#33252
09/15/04 17:06
09/15/04 17:06
|
Joined: Oct 2002
Posts: 8,939 planet.earth
ello
Senior Expert
|
Senior Expert
Joined: Oct 2002
Posts: 8,939
planet.earth
|
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:
www.earthcontrol.dequoted: We want to maintain a clean, decent, American family suited forum look... which means you may post zombies or chainsaw massacres, but no erotic.
|
|
|
Re: Shader Tools - Frage / Question
[Re: ello]
#33253
09/16/04 17:53
09/16/04 17:53
|
Joined: Aug 2004
Posts: 176 Germany
Team_GamesArk
OP
Member
|
OP
Member
Joined: Aug 2004
Posts: 176
Germany
|
Danke für die Tipps.. Ich bin damit etwas weiter gekommen, habe aber noch ein Problem. Statt nix, wie vor der Anwendung der Tipps , sehe ich jetzt einen weißen Kreis (Kugel) ohne die Textur. Ich habe mal den Code von Rendermonkey und die 3DGS Änderung angehangen. Könntest Du mal schauen woran es liegt.
Rendermonkey: -------------
string MyEffectGroup_MyEffect_Pass_0_model : ModelData = "E:/Source_Code/Chapter_4/Teapot.3ds";
float4x4 view_proj_matrix : ViewProjection;
float cos_time_0_X : CosTime0_X; float sin_time_0_X : SinTime0_X;
struct VS_OUTPUT { float4 Pos: POSITION; float2 Txr1: TEXCOORD0; };
VS_OUTPUT MyEffectGroup_MyEffect_Pass_0_Vertex_Shader_vs_main( float4 inPos: POSITION, float2 Txr1: TEXCOORD0 ) { VS_OUTPUT Out;
Out.Pos = mul(view_proj_matrix, inPos);
Out.Txr1 = float2(Txr1.x+cos_time_0_X,Txr1.y+sin_time_0_X);
return Out; }
texture MyTxr1_Tex < string ResourceName = "E:\Source_Code\Chapter_4\Fieldstone.tga"; >;
sampler Texture0 = sampler_state { Texture = (MyTxr1_Tex); };
float4 MyEffectGroup_MyEffect_Pass_0_Pixel_Shader_ps_main( float4 inDiffuse: COLOR0, float2 inTxr1: TEXCOORD0 ) : COLOR0 { return tex2D(Texture0,inTxr1); }
technique MyEffect { pass Pass_0 { VertexShader = compile vs_1_1 MyEffectGroup_MyEffect_Pass_0_Vertex_Shader_vs_main(); PixelShader = compile ps_1_1 MyEffectGroup_MyEffect_Pass_0_Pixel_Shader_ps_main(); }
}
Modifiziert: ------------ float4x4 matWorldViewProj;
texture entSkin1;
float cos_time_0_X : CosTime0_X; float sin_time_0_X : SinTime0_X;
struct VS_OUTPUT { float4 Pos: POSITION; float2 Txr1: TEXCOORD0; };
VS_OUTPUT MyEffectGroup_MyEffect_Pass_0_Vertex_Shader_vs_main( float4 inPos: POSITION, float2 Txr1: TEXCOORD0 ) { VS_OUTPUT Out;
Out.Pos = mul(inPos, matWorldViewProj);
Out.Txr1 = float2(Txr1.x + cos_time_0_X,Txr1.y + sin_time_0_X);
return Out; }
sampler Texture0 = sampler_state { Texture = (entSkin1); ADDRESSU = WRAP; ADDRESSV = WRAP; ADDRESSW = WRAP; MAGFILTER = LINEAR; MINFILTER = LINEAR; MIPFILTER = LINEAR; };
float4 MyEffectGroup_MyEffect_Pass_0_Pixel_Shader_ps_main( float4 inDiffuse: COLOR0, float2 inTxr1: TEXCOORD0 ) : COLOR0 { return tex2D(Texture0,inTxr1); }
technique MyEffect { pass Pass_0 { VertexShader = compile vs_1_1 MyEffectGroup_MyEffect_Pass_0_Vertex_Shader_vs_main(); PixelShader = compile ps_1_1 MyEffectGroup_MyEffect_Pass_0_Pixel_Shader_ps_main(); }
}
Wenn der Effekt richtig funktioniert soll sich Textur auf dem obejkt bewegen, aber wie gesagt sehe ich nur einen weißen Kreis(Kugel) ohne Textur. Ich hoffe du kannst mir sagen was ich noch vergessen habe zu ändern.
Vielen Dank schon mal im Vorraus
|
|
|
Re: Shader Tools - Frage / Question
[Re: ello]
#33260
09/21/04 20:00
09/21/04 20:00
|
Joined: Aug 2004
Posts: 176 Germany
Team_GamesArk
OP
Member
|
OP
Member
Joined: Aug 2004
Posts: 176
Germany
|
hier ist die .fx Datei die Rendermonkey auswirft. Wenn Du möchtest kann ich dir auch das Rendermonkey-File (.rfx Datei) per E-Mail schicken.
//**************************************************************// // Effect File exported by RenderMonkey // // - Although many improvements were made to RenderMonkey FX // file export, there are still situations that may cause // compilation problems once the file is exported, such as // occasional naming conflicts for methods, since FX format // does not support any notions of name spaces. You need to // try to create workspaces in such a way as to minimize // potential naming conflicts on export. // // - Note that to minimize resulting name collisions in the FX // file, RenderMonkey will mangle names for passes, shaders // and function names as necessary to reduce name conflicts. //**************************************************************// //--------------------------------------------------------------// // Metal Effects Group //--------------------------------------------------------------// //--------------------------------------------------------------// // MetalEffect //--------------------------------------------------------------// //--------------------------------------------------------------// // Skull Pass //--------------------------------------------------------------// string Metal_Effects_Group_MetalEffect_Skull_Pass_Metal_Effect_Skull_Pass_Skull : ModelData = "D:/Programmierung/ATI Research Inc/RenderMonkey 1.5/Examples/Media/Models/Torus.3ds";
//--------------------------------------------------------------// // vs1 //--------------------------------------------------------------// VertexShader Metal_Effects_Group_MetalEffect_Skull_Pass_vs1_ = asm { vs.1.1 dcl_position v0 dcl_normal v1 dcl_texcoord v2 dcl_tangent v3 dcl_binormal v4 // output vertex position m4x4 oPos, v0, c0 // output texture coordinates mov oT0, v2 // output normal vector mov oT2, v1 // find the light position in object space mov r0, c9 m4x4 r1, r0, c5 // find light vector sub r1, r1, v0 // normalize light vector dp3 r2.x, r1, r1 rsq r2.x, r2.x mul r1.xyz, r1.xyz, r2.xxx // output light vector mov oT1, r1 // find the eye position in object space mov r0, c4 m4x4 r2, r0, c5 // find eye vector sub r2, r2, v0 // normalize eye vector dp3 r3.x, r2, r2 rsq r3.x, r3.x mul r2.xyz, r2.xyz, r3.xxx // output eye vector mov oT4, r2 // find half angle vector add r3, r1, r2 mul r3, r3, c10.yyy // normalize half angle vector dp3 r4.x, r3, r3 rsq r4.x, r4.x mul r3.xyz, r3, r4.xxx mov r3.xy, v1.xy // normalize half angle vector dp3 r4.x, r3, r3 rsq r4.x, r4.x mul r3.xyz, r3, r4.xxx // output half angle vector vector mov oT3, r3 };
//--------------------------------------------------------------// // ps1 //--------------------------------------------------------------// PixelShader Metal_Effects_Group_MetalEffect_Skull_Pass_ps1_ = asm { ps.1.4 def c0, 0.0f, 0.0f, 0.0f, 1.0f texcrd r0.rgb, t0 // env map texcrd r1.rgb, t1 // L texcrd r2.rgb, t2 // N texcrd r3.rgb, t3 // H texcrd r4.rgb, t4 // V // N.L dp3 r5, r2, r1 // offset basemap mov r0.a, c0.a add r0, r0, r5 // N.H dp3 r4.r, r2, r3 // H.H (aka ||H||^2) dp3 r4.g, r3, r3 mov r4.g, 1-r4.g phase texld r1, r4 // N.H^k texld r0, r0 // base mul r1.rgb, r1, r5 mul r1.rgb, r1, c1 mul r5.rgb, r5, c2 mul r0.rgb, r5, r0 add_sat r0, r0, r1
};
//--------------------------------------------------------------// // Technique Section for Metal Effects Group //--------------------------------------------------------------// technique MetalEffect { pass Skull_Pass { CULLMODE = CCW; ZFUNC = LESS; ZENABLE = TRUE;
VertexShader = (Metal_Effects_Group_MetalEffect_Skull_Pass_vs1_); PixelShader = (Metal_Effects_Group_MetalEffect_Skull_Pass_ps1_); }
}
|
|
|
|