Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
Zaslal: 25. prosinec 2008, 15:38:23 Předmět: C# Mesh + (vs.) Effect |
|
|
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 |
|
 |
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
Zaslal: 27. prosinec 2008, 16:01:32 Předmět: |
|
|
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 |
|
 |
zapytchu

Založen: 08. 08. 2007 Příspěvky: 352 Bydliště: čechy i chacharov
|
Zaslal: 27. prosinec 2008, 19:50:56 Předmět: |
|
|
Gratuluji. |
|
Návrat nahoru |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 28. prosinec 2008, 04:01:44 Předmět: |
|
|
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 |
|
 |
posila
Založen: 29. 07. 2007 Příspěvky: 201
|
Zaslal: 29. prosinec 2008, 13:45:24 Předmět: |
|
|
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 |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 30. prosinec 2008, 01:30:47 Předmět: |
|
|
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
Posilovi dik. _________________ Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est. |
|
Návrat nahoru |
|
 |
|