Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema Con Vertex Shader

Iniciado por vincent, 22 de Febrero de 2005, 12:31:33 PM

« anterior - próximo »

vincent

 Hola muy buenas,

estoy haciendo pruebas con vertex shaders y tengo un expediente X.

Intento utilizar este chorra shader:

matrix ViewProjMatrix;
matrix ViewMatrix;
vector AmbientMtrl;
vector DiffuseMtrl;
vector LightDirection;

vector DiffuseLightIntensity = {0.0f, 0.0f, 1.0f, 1.0f};
vector AmbientLightIntensity = {0.0f, 0.0f, 0.2f, 1.0f};
vector ColorDiffuse = {0.0f, 1.0f, 1.0f, 1.0f};

struct VS_INPUT
{
vector position : POSITION;
vector normal : NORMAL;
};

struct VS_OUTPUT
{
vector position : POSITION;
vector diffuse : COLOR;
};

VS_OUTPUT Main(VS_INPUT input)
{
VS_OUTPUT output = (VS_OUTPUT)0;

output.position = mul(input.position, ViewProjMatrix);
output.diffuse = ColorDiffuse;

return output;
}


Me lo compila bien. No da ningún error. Creo el vertex shader, hago el setDefaults de la contant table y intento coger los handlers a las variables globales (en el codigo no las uso para simplificar):

ViewProjMatrixHandle = DiffuseConstTable->GetConstantByName(0, "ViewProjMatrix");
ViewMatrixHandle = DiffuseConstTable->GetConstantByName(0, "ViewMatrix");
AmbientMtrlHandle = DiffuseConstTable->GetConstantByName(0, "AmbientMtrl");
DiffuseMtrlHandle = DiffuseConstTable->GetConstantByName(0, "DiffuseMtrl");
LightDirHandle = DiffuseConstTable->GetConstantByName(0, "LightDirection");


El problema que tengo es que sólo me coge el manipulador de la primera y no de las otras. Alguien sabe pq puede ser esto?

Muchas gracias!!

VinCenT
Desarrollo en .Net y metodologías http://devnettips.blogspot.com

zupervaca

 hola buenas yo aun no he mirado los shaders con lo que estoy verde total ya que con la tarjeta grafica que tengo me es imposible por que no los soporta, ¿ese shader es para opengl? es que en directx me suena que es diferente

saludos

vincent

 Es para DirectX. El shader está echo en HLSL. De echo, está sacado del libro Introduction to 3D Game programming with DirectX 9.0 (de echo el shader hace una iluminación difusa pero lo he reducido para comodidad del lector :P )

He visto que no es que solo lea la primera de las variables, sinó que tan sólo pilla la ViewProjMatrix...  (uoh)

Gracias!
Desarrollo en .Net y metodologías http://devnettips.blogspot.com

Helius

 Puede ser que al compilar el optimizador elimine las variables que no usas en el shader (ViewMatrix, AmbientMtrl, DiffuseMtrl, LightDirection) y por eso luego no puedes tener acceso a ellas, simplemente porque ya no existen.

Supongo que será por eso ;)

Saludos.
Geardome Devlog
Tutoriales sobre DirectX 9, Nintendo DS y PSP.

vincent

 Buenas,

perdón por haver tardado tanto en contestar, pero es que estava reinstalando el p... windows...

He creado otro chorra shader en el que, en principio, si que se usan las dos variables que tiene... el shader esta creado con la inestimable ayuda del fx composer y allí funciona sin problema:


float4x4 ViewProjMatrix : WorldViewProjection;
vector Light;

struct vertexInput {
   float3 Position : POSITION;
};

struct vertexOutput {
   float4 HPosition : POSITION;
   float4 Diffuse : COLOR0;
};

vertexOutput Main(vertexInput IN)
{
vector pepe = mul(Light, ViewProjMatrix);

   vertexOutput OUT;
   OUT.HPosition = mul( float4(IN.Position.xyz , 1.0) , ViewProjMatrix);
   OUT.Diffuse = float4(1.0f, 1.0f,1.0f,1.0f);
   return OUT;
}


a parte esta compilado con el flag D3DXSHADER_SKIPOPTIMIZATION, con lo que no me deberia de hacer guarradas, no?

Y el problema es el mismo, pilla la variable ViewProjMatrix pero la variable Light no...  (uoh)

Alguna idea?

Gracias!!!
Desarrollo en .Net y metodologías http://devnettips.blogspot.com

Haddd

 ¿Utilizas MDX ? Yo para coger una constante del shader utilizo effect.GetParameter(null, "WorldViewProjection");

vincent

 Bueno, parece que el tema ya está solucionado.

Creo que lo que hace el tio es cargarse todas las variables que, aunque hagas cosas con ellas, no afecten, directa o indirectamente, a algun miembro de la estructura de salida. Así pues, en mi ejemplo, por mucho que haga cosas con las variables, si al final no influyen de alguna manera en el output.position o en el output.diffuse, pues se las carga, por mucho que pongas el SKIPOPTIMIZATION.

Ya está todo claro pués.   (ole)

Muchas gracias a todos!

VinCenT.

PD: Haddd, lo que decias tu era usando la interfície de los effects, no? Yo tengo el vertex shader a pelo.
Desarrollo en .Net y metodologías http://devnettips.blogspot.com






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.