Novedades del Blog

viernes, 26 de septiembre de 2008

Shader con Mallas

Despues de una semana un poco complicada y con poco tiempo para desarrollar ya he conseguido pintar mallas con Shaders, de momento he pintado una malla de un coche que he conseguido de ejemplo por ahi. Ahora continuare a ver si puedo empezar a aplicarle luces y sombras.

Como casi siempre aqui dejo una captura de la malla pintada con Shaders:


28/09/08: Ya funciona con la clase que gestiona que no se repitan los Shaders cargados en memoria, a partir de ahora seguiré avanzando en este mundillo de los Shaders :)

domingo, 21 de septiembre de 2008

...y el primer Pixel Shader

Pues si también he implementado mi primer Pixel Shader, tampoco hace nada del otro mundo ademas no he cogido ninguna captura de pantalla de como ha quedado.
Ahora mismo estoy integrando esta nueva funcionalidad en el motor que estoy creando, y ya de paso, aplicar Vertex Shader y Pixel Shader a las mallas cargadas.

De momento ya tengo un gestor de Effects, igual que para las mallas, los bitmaps, las texturas y las fuentes. Este gestor se encarga de almacenar en memoria los recursos y así evitar volver a cargar un recurso que ya ha sido cargado previamente con el consiguiente ahorro en la memoria. Evitando que haya recursos repetidos que puedan ralentizar la ejecución.

sábado, 13 de septiembre de 2008

Mi Primer Shader

Después de mucho pegarme con el código y de mucho mirar en webs, por fin he conseguido mostrar un triangulo usando Shaders.
El Shader es muy básico, solo tiene un Vertex Shader que coloca el triangulo en el mundo (aquí su código):

struct VertexToPixel
{
float4 Position :POSITION;
float4 Color :COLOR0;
};


float4x4 xViewProjection : WORLDVIEWPROJECTION;

VertexToPixel SimplestVertexShader (float4 inPos : POSITION, float4 inColor : COLOR0)

{

VertexToPixel Output = (VertexToPixel)0;

Output.Position = mul(inPos, xViewProjection);
Output.Color= inColor;


return Output;
}


technique Simplest
{
pass Pass0

{

VertexShader = compile vs_1_1 SimplestVertexShader();

PixelShader = NULL;

}

}



El único pero, es que debo hacer algo en el código que hace que cuanto mas tiempo se esta ejecutando mas baja el framerate, es algo del Shader porque cuando utilizo el Fixed Pipeline de Directx sin el Shader no me ocurre este decremento de Framerate.
Aqui pongo una imagen con el ejemplo, el triangulo de la derecha se crea con el Fixed Pipeline de DirectX y el de la izquierda con el Shader arriba publicado.


14/09/08:
Ya he encontrado el problema, era la carga e inicializacion del Effect que se hacia en cada ciclo, simplemente lo he puesto en la inicialización y ya se ha solucionado, ademas gracias a los Shaders he visto que hay un pequeño incremento del Framerate frente a usar el Fixed Pipeline.

El siguiente paso sera el Pixel Shader.

miércoles, 10 de septiembre de 2008

Luces y Sombras con Shaders

Viendo que el resultado de las luces de DirectX es un poco pobre, ya que no implementa sombras, he decidido intentar utilizar Shaders para que las luces en la escena sean mas reales. De momento solo he creado un Vertex Shader muy simple para intentar utilizarlo en el juego, pero al ejecutar el DrawPrimitive me da un error un poco raro.

Depurando el codigo he podido encontrar que en una propiedad del objeto Effect aparecia una posible Excepcion que en estos momentos estoy analizando.
La propiedad es StateManager y despues de cargar el efecto con Effect.FromFile(), me aparece este literal en la propiedad :

'm_eEffect.StateManager' threw an exception of type 'System.NullReferenceException'

Intentare averiguar porque aparece y como se corrige.