Specular Light Shader | Monogame

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    Specular Light Shader | Monogame

    Hallo alle zusammen,

    Ich bin momentan dabei, mithilfe von Monogame, ein Spiel zu entwickeln.

    In dem Spiel lasse ich mir 3D Models von Waffen anzeigen, was auch Super funktioniert (Allerdings unwahrscheinlich hässlich ist).
    Nun habe ich mir gedacht, ich könnte einfach einen Shader implementieren und habe da ein Tutorial (rbwhitaker) gefunden.

    Habe das ganze mal angewendet und meine Models benutzt allerdings sieht das ganze nicht so aus wie es sollte:
    prntscr.com/kpl4s4
    bzw. wenn ich sein Model nehme (was ich vorher allerdings in eine .obj Konvertieren musste):
    prntscr.com/kpl52a

    Laut Tutorial sollte es allerdings so aussehen:

    Kann mir da wer weiterhelfen?

    Viele grüße.

    *Topic verschoben*
    Conway's Game Of Life Monogame Sample: 80%

    Conway's Game Of Life Monogame Sample

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Hmm, also ich hab mir jetzt auch mal die Objekte von einem Spiel selbst exportiert und da habe ich genau das selbe Problem.
    Liegt es vielleicht an dem Shader selber?:
    Spoiler anzeigen

    Quellcode

    1. float4x4 World;
    2. float4x4 View;
    3. float4x4 Projection;
    4. float4x4 WorldInverseTranspose;
    5. float4 AmbientColor = float4(1, 1, 1, 1);
    6. float AmbientIntensity = 0.1;
    7. float3 DiffuseLightDirection = float3(1, 0, 0);
    8. float4 DiffuseColor = float4(1, 1, 1, 1);
    9. float DiffuseIntensity = 1.0;
    10. float Shininess = 200;
    11. float4 SpecularColor = float4(1, 1, 1, 1);
    12. float SpecularIntensity = 1;
    13. float3 ViewVector = float3(1, 0, 0);
    14. texture ModelTexture;
    15. sampler2D textureSampler = sampler_state {
    16. Texture = (ModelTexture);
    17. MinFilter = Linear;
    18. MagFilter = Linear;
    19. AddressU = Clamp;
    20. AddressV = Clamp;
    21. };
    22. struct VertexShaderInput
    23. {
    24. float4 Position : POSITION0;
    25. float4 Normal : NORMAL0;
    26. float2 TextureCoordinate : TEXCOORD0;
    27. };
    28. struct VertexShaderOutput
    29. {
    30. float4 Position : POSITION0;
    31. float4 Color : COLOR0;
    32. float3 Normal : TEXCOORD0;
    33. float2 TextureCoordinate : TEXCOORD1;
    34. };
    35. VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
    36. {
    37. VertexShaderOutput output;
    38. float4 worldPosition = mul(input.Position, World);
    39. float4 viewPosition = mul(worldPosition, View);
    40. output.Position = mul(viewPosition, Projection);
    41. float4 normal = normalize(mul(input.Normal, WorldInverseTranspose));
    42. float lightIntensity = dot(normal, DiffuseLightDirection);
    43. output.Color = saturate(DiffuseColor * DiffuseIntensity * lightIntensity);
    44. output.Normal = normal;
    45. output.TextureCoordinate = input.TextureCoordinate;
    46. return output;
    47. }
    48. float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
    49. {
    50. float3 light = normalize(DiffuseLightDirection);
    51. float3 normal = normalize(input.Normal);
    52. float3 r = normalize(2 * dot(light, normal) * normal - light);
    53. float3 v = normalize(mul(normalize(ViewVector), World));
    54. float dotProduct = dot(r, v);
    55. float4 specular = SpecularIntensity * SpecularColor * max(pow(dotProduct, Shininess), 0) * length(input.Color);
    56. float4 textureColor = tex2D(textureSampler, input.TextureCoordinate);
    57. textureColor.a = 1;
    58. return saturate(textureColor * (input.Color) + AmbientColor * AmbientIntensity + specular);
    59. }
    60. technique Textured
    61. {
    62. pass Pass1
    63. {
    64. VertexShader = compile vs_4_0 VertexShaderFunction();
    65. PixelShader = compile ps_4_0 PixelShaderFunction();
    66. }
    67. }​
    Conway's Game Of Life Monogame Sample: 80%

    Conway's Game Of Life Monogame Sample
    Hab mal alles mögliche probiert, allerdings wird es dadurch nicht besser. Entweder ist das Model gar nicht zu sehen oder wenn ich mir nur die AmbientColor ausgebe ist das Model komplett weiß.
    Conway's Game Of Life Monogame Sample: 80%

    Conway's Game Of Life Monogame Sample
    und bei textureColor siehst du gar nichts?
    Zeile 18 sollte außerdem vom Typ Texture2D sein, Zeile 20 weg
    die Zeile

    Quellcode

    1. sampler2D textureSampler = sampler_state {

    zu

    Quellcode

    1. SamplerState textureSampler {

    und Zeile 70 dann

    Quellcode

    1. shaderTexture.Sample(textureSampler, input.tex);


    dann solltest weg von legacy HLSL sein(sollte eigt. gar nicht compilen, außer MonoGame aktiviert legacy automatisch?)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Also wenn ich nur die TextureColor benutze sieht es so aus: prntscr.com/kqm39z
    Hierzu möchte ich aber noch anmerken dass sich das Model (warum auch immer) verschiebt.

    Zu den Snippets.
    Ich hab den Typen auf Texture2D abgeändert und die SamplerState Zeile ausgetauscht.
    Die Zeile die du mir für Zeile 70 empfiehlst verstehe ich ehrlich gesagt nicht so wirklich.

    Ist mit shaderTexture die Texture die ich übergebe gemeint? Oder soll es eine weitere Variable sein?

    PS: Ich fange gerade erst an mit dem schreiben von Shadern :P
    Viele grüße
    Conway's Game Of Life Monogame Sample: 80%

    Conway's Game Of Life Monogame Sample
    soll natürlich in dem Fall deine ModelTexture sein.

    Und wie es aussieht sieht man ja doch eine Texture wenn du die TextureColor verwendest.
    Genau so solltest eben fortfahren und schritt für schritt mehr eigenschaften des shaders zur ausgabefarbe hinzufügen und gucken an welcher stelle es schief läuft...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---