Показать сообщение отдельно
Старый 02.06.2012, 13:06   #30
radiobutton
Бывалый
 
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений
(для 546 пользователей)
Ответ: Вопросы по XNA.

Основная нагрузка идет за счет шейдеров. То что ты напишеш на ДиректИкс будит все равно все отсылать данные на видео карту. А та в свою очередь применять шейдеры.

effect.CurrentTechnique = effect.Techniques["Textured"];
Matrix world = Matrix.Identity;// worldRotation* worldTranslation;
effect.Parameters["xWorldViewProjection"].SetValue(
world * camera.view * camera.projection);
effect.Parameters["xColoredTexture"].SetValue(texture);

foreach (EffectPass pass in effect.CurrentTechnique.Passes)
{
pass.Apply();
GraphicsDevice.DrawUserPrimitives<VertexPositionTe xture>
(PrimitiveType.TriangleStrip, verts, 0, 2);
}
Тоесть ты по сути перепишешь этот код только на С++ используя функции DirectX. Но этот код выполняется очень быстро и никакого прироста ты не получишь. А вот шейдеры:


float4x4 xWorldViewProjection;
Texture xColoredTexture;

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

struct VertexIn
{
    float4 position : POSITION;
};

struct VertexOut
{
    float4 Position : POSITION;
    float2 textureCoordinates : TEXCOORD0;
};

VertexOut VertexShaderFunction(VertexIn input)
{
    VertexOut Output = (VertexOut)0;
    Output.Position = mul(input.position,xWorldViewProjection);
    Output.textureCoordinates = normalize(input.position.xy);
    return Output;
}

float4 PixelShaderFunction(float2 texCoord: TEXCOORD0) : COLOR0
{
   float ang = atan2 (texCoord.x, texCoord.y);
   float rad = dot (texCoord, texCoord);

   return float4(0.5*(1 + sin (ang *20.0f )),0.5*cos(50.0f * ang),0.5*cos(60.0f),1);
};

technique Textured
{
    pass Pass0
    {
        VertexShader = compile vs_2_0 VertexShaderFunction(  );
        PixelShader = compile ps_2_0 PixelShaderFunction(  );
    }
}


Вот этот код (точнее некоторые функции внутри него, одна для вертексного, другая для пиксельного шейдера) выполняется, как минимум 4 раза для вертексного (ну у обычной картинки 4 вершины же) и 100*100 раз для пиксельного для картинки размером 100 на 100. Тоесть для каждого пикселя.

И если ты хочеш добиться лучшей проиводительности, то тебе нужно помаксимуму упростить код пиксельного шейдера. Тоесть вот эту хрень:
float4 PixelShaderFunction(float2 texCoord: TEXCOORD0) : COLOR0
{
   float ang = atan2 (texCoord.x, texCoord.y);
   float rad = dot (texCoord, texCoord);

   return float4(0.5*(1 + sin (ang *20.0f )),0.5*cos(50.0f * ang),0.5*cos(60.0f),1);
};
Ведь неизвестно, что прописано в том, что используется по умолчанию в XNA для вывода 2D картинок.

Поэтому лучше учи HLSL.
(Offline)
 
Ответить с цитированием