.[ ČeskéHry.cz ].
C# Mesh + (vs.) Effect

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 25. prosinec 2008, 15:38:23    Předmět: C# Mesh + (vs.) Effect Odpovědět s citátem

No takže opět otravuju. Doufám že to bude stejná banalita jako minule... Tentokrát se pokouším prohnat mesh shaderem a nějak se nedaří. Něco je špatně, ale netušim co. Obrazovka jenom střídavě problikává barvou textury a pozadí.

Takže vertex:
kód:
            struct MyVertex
            {
                float X;
                float Y;
                float Z;
                float Tu;
                float Tv;
                int Color;

                public MyVertex(Vector3 pos, float tu, float tv, int color)
                {
                    X = pos.X;
                    Y = pos.Y;
                    Z = pos.Z;
                    Tu = tu;
                    Tv = tv;
                    Color = color;
                }

                public MyVertex(float x, float y, float z, float tu, float tv, int color)
                {
                    X = x;
                    Y = y;
                    Z = z;
                    Tu = tu;
                    Tv = tv;
                    Color = color;
                }

...
Dále deklarace vertexu nezbytná pro shader:
kód:
VertexElement[] velements = new VertexElement[]{
                    new VertexElement(0, 0, DeclarationType.Float3, DeclarationMethod.Default, DeclarationUsage.Position, 0),
                    new VertexElement(0, 12, DeclarationType.Float2, DeclarationMethod.Default, DeclarationUsage.TextureCoordinate, 0),
                    new VertexElement(0, 20, DeclarationType.Color, DeclarationMethod.Default, DeclarationUsage.Color, 0),
                   
                    VertexElement.VertexDeclarationEnd};


Při vytváření meshe dávám jako jeden ze vstupních parametrů právě velements a předpokládám že při volání DrawSubset to nastaví do device.VertexDeclaration.

Poté metoda na vykreslení:
kód:
Shader.Technique = "Simplest";

                    Shader.SetValue("xViewProjection", Device.Transform.World * Device.Transform.View * Device.Transform.Projection);

                    Shader.SetValue("xColoredTexture", Texture);

                    //d3dDevice.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);
                    int passes = Shader.Begin(0);

                    // Loop through all of the effect's passes.
                    for (int i = 0; i < passes; i++)
                    {                       
                        Shader.BeginPass(i);
                        Mesh.DrawSubset(0);
                        Shader.EndPass();
                    }
                    Shader.End();


A samotný shader:
kód:
struct VertexToPixel
{
    float4 Position     : POSITION;   
    float2 TexCoords    : TEXCOORD0;
    float4 Color        : COLOR0;
};

struct PixelToFrame
{
    float4 Color : COLOR0;
};

float4x4 xViewProjection;

Texture xColoredTexture;
sampler ColoredTextureSampler = sampler_state { texture = <xColoredTexture> ; magfilter = LINEAR; minfilter = LINEAR; mipfilter=LINEAR; AddressU = mirror; AddressV = mirror;};

Texture xAlphaTexture;
sampler AlphaTextureSampler = sampler_state { texture = <xAlphaTexture> ; magfilter = LINEAR; minfilter = LINEAR; mipfilter=LINEAR; AddressU = mirror; AddressV = mirror;};


VertexToPixel SimplestVertexShader(float3 inPos : POSITION,  float2 inTexCoords : TEXCOORD0, float4 inColor : COLOR0)
{
    VertexToPixel Output = (VertexToPixel)0;
   
    Output.Position = mul(inPos, xViewProjection);   
    Output.TexCoords = inTexCoords;
    Output.Color = inColor;
   
    return Output;   
}

PixelToFrame OurFirstPixelShader(VertexToPixel PSIn)
{
    PixelToFrame Output = (PixelToFrame)0;

    //Output.Color = 1;

    Output.Color = tex2D(ColoredTextureSampler,PSIn.TexCoords) * PSIn.Color;
    //Output.Color.a = tex2D(AlphaTextureSampler,PSIn.TexCoords).a;
    //Output.Color = PSIn.Color;

    return Output;
}

technique Simplest
{
    pass Pass0
    {       
   //AlphaBlendEnable = True;
   //SrcBlend = SrcAlpha;
   //DestBlend = InvSrcAlpha;

        VertexShader = compile vs_2_0 SimplestVertexShader();
        PixelShader = compile ps_2_0 OurFirstPixelShader();
    }
}


Snad aspoň někdo zkoušel něco podobného a bude umět poradit.
Taky jsem to zkoušel prohnat pixem, z toho mě zarazilo, ze pre a post VS se zda byt ok, ale ve viewportu není nic...
http://disk.jabbim.cz/matasx@njs.netlab.cz/pix.jpg

Ještě bych asi mohl dodat, že používám indexy a předtím, než sem začal používat shadery se mesh vykresloval ok.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 27. prosinec 2008, 16:01:32    Předmět: Odpovědět s citátem

Po 2 dnech ztracených hledáním příčiny si konečně můžu odpovědět sám. Vstup do shaderu pro pozici vertexu musí být: float4 inPos : POSITION.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
zapytchu



Založen: 08. 08. 2007
Příspěvky: 352
Bydliště: čechy i chacharov

PříspěvekZaslal: 27. prosinec 2008, 19:50:56    Předmět: Odpovědět s citátem

Gratuluji.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1827

PříspěvekZaslal: 28. prosinec 2008, 04:01:44    Předmět: Odpovědět s citátem

Ja si dovolim dat jemne nesuvisiacu otazku, no nazov topicu sa na to hodi...

Ked vykreslim nacitany (cez content manager) .x mesh pomocou basic effectu, tak je krasny otexturovany. Ja chcem vsak pouzit vlastny effect.

No, ale ten uz potrebuje vediet konkretnu texturu, ta sa do neho posle ako 'parameter'. Ako to robi BasicEffect, ze vie, ktoru texturu z toho nacitaneho modelu pouzit?

Zatial som tomu dal len asi pol hodinky, ale v triede Model, ModelMesh, ModelMeshPart a tak podobne som nenasiel ani zoznam nacitanych (pouzitych, referencovanych, whatever) textur ani nic podobne. Alebo som slepy?
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
posila



Založen: 29. 07. 2007
Příspěvky: 201

PříspěvekZaslal: 29. prosinec 2008, 13:45:24    Předmět: Odpovědět s citátem

pcmaster:
BasicEffect (podedeny od Effectu, jejich kolekci vraci ModelMesh.Effects) texturu zjistuje nejak takto:
kód:

EffectParameter basicTextureParam = base.Parameters["BasicTexture"];
Texture2D texture = basicTextureParam.GetValueTexture2D();
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1827

PříspěvekZaslal: 30. prosinec 2008, 01:30:47    Předmět: Odpovědět s citátem

Po diskusii a nie velmi hlbokom vyskume sme usudili, ze jedine miesto, kam sa informacia o texturach po nacitani .x pomocou Content.Load<Model>() ulozi, je prave vygenerovany BasicEffect.

Takze ak chcete pouzit automaticky nacitany .x model aj s texturami + vlastny Effect, musite si mile textury z BasicEffectu pre kazdu ModelMeshPart ulozit a nasledne nastavit/poslat do vlastneho Effectu. Alebo si napisat vlastny loader a o textury sa starat samostatne.

Je mozne, ze to ide aj lepsie, ale neprisli sme na to. OOOO ake krasne a ciste riesenie Very Happy

Posilovi dik.
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna