Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Probando Ps Y Vs...

Iniciado por Sergio, 27 de Julio de 2004, 11:11:02 PM

« anterior - próximo »

Sergio

 Holas!!
Viendo que no se me ocurre que hacer y tras haber flipado con las cosas que ha hecho Hadd con PS y VS  (genial)  (genial)  (genial) pues me he puesto a investigarlos, a entender como funcionan y eso jeje
Ahi va una pregunta sobre VS 2.0, seguramente sea tan basica que deberia avergonzarme, pero bueno xDD
  // Set the model view proj matrix.  We already have the projection matrix from the
  // initialize so lets multiply all of them together.
  D3DXMATRIX modelViewProj = WorldMatrix * ViewMatrix * ProjectionMatrix;

  // Transpose the model view matrix and we are all set.
  D3DXMatrixTranspose(&modelViewProj, &modelViewProj);

Esto lo hace para luego pasar esa matrix 'modelViewProj' a los registros c[0]-c[3] pero... que es esa matriz y para que sirve??
Es que luego en el shader hace lo siguiente con esa matriz:
dcl_position v0      // This is the vertex postion (x, y, z).
dcl_color    v1      // This is the vertex color.

m4x4 r0, v0, c0      // This will translate the vertex by setting its new position.
                    // r0 is a temp register we can use to store the value.[

mov oPos, r0   // Here we will move the position in r0 to our output (oPos).
mov oD0, v1    // v1 holds the original vertex color.  We will keep this.

m4x4 r0, v0, c0 ==> Como que trasladar el vertice a su nueva posicion? No se supone que v0 ya tiene la posicion del vertice? A donde se supone que lo mueve? O_O
A ver si alguien me aclara este punto, porque el shader es una mierda (de lo sencillo que es, no hace nada mas que eso xDD) y no entiendo eso en concreto.

Gracias de antemano. Un saludo!!!
here are only 10 types of people: those who understand binary and those who don't

Zaelsius

 Creo que ese vertex shader se encarga simplemente de realizar la transformación de los vértices. Es una etapa más de la "pipeline" 3D...  :rolleyes:

Citarm4x4 r0, v0, c0 ==> Como que trasladar el vertice a su nueva posicion? No se supone que v0 ya tiene la posicion del vertice? A donde se supone que lo mueve? ses.gif

Proyecta los vértices del objeto 3d que se quiera pintar, resultando en coordenadas físicas de la pantalla 2d.

Sergio

 O sea que no hace nada mas que procesar las transformaciones de vista, proyeccion y mundo?? Na mas???
Sabia que la pregunta era estupida... xDDDD Entonces cada vez que usas pixel shaders o vertex shaders se pasa por el forro el proceso normal del pipeline?? Vamos, que esto de las matrices habria que hacerlo siempre O_O

Gracias por la respuesta!!
here are only 10 types of people: those who understand binary and those who don't

Helius

 Si utilizas Vertex Shaders la etapa de transformación ya no la realiza DirectX, de hecho lo que haces es suplantar ese trozo del pipeline por tu Vertex Shader por eso multiplica por las tres matrices de transformación y así consigue una coordenada de pantalla para pasársela a la siguiente etapa del pipeline (que puede ser un Pixel Shader). Te recomiendo que veas algún dibujo del pipeline en el SDK y veas exáctamente que zonas son las que se intercambian cuando usas Vertex o Pixel Shaders.

No es obligatorio hacer siempre esa transformación porque en un Vertex Shader puedes hacer lo que quieras con el vértice. Puedes conseguir efectos de deformación en esta etapa si utilizas otro tipo de transformación para el vértice.
Geardome Devlog
Tutoriales sobre DirectX 9, Nintendo DS y PSP.

BeRSeRKeR

 
Cita de: "Sergio"m4x4 r0, v0, c0 ==> Como que trasladar el vertice a su nueva posicion? No se supone que v0 ya tiene la posicion del vertice? A donde se supone que lo mueve? O_O
Las coordenadas almacenadas en v0 son coordenadas en object-space, es decir, relativas al origen de coordenadas del objeto. Pero Direct3D (u OpenGL) necesita otro tipo de coordenadas para trabajar.

El proceso que sigue un vértice es el siguiente:

object-space * world_matrix-> world-space * view_matrix -> view-space * projection_matrix -> clip-space

Cuando multiplicas v0 por la matriz modelViewProj, lo que estás haciendo precisamente es hacer el recorrido que he mencionado arriba hasta transformar el vértice a clip-space.

Así, como he dicho anteriormente, en object-space las coordenadas del vértice son relativas al origen de coordenadas del objeto. Cuando aplicamos la matriz de mundo, aplicamos al vértice cualquier transformación contenida en dicha matriz (traslación, rotación, escalado, etc). Después, al aplicar la matriz de vista lo que hacemos es transformar las coordenadas de dicho vértice de forma que sean relativas a la posición de la cámara y finalmente, cuando aplicamos la matriz de proyección, transformamos el vértice a clip-space donde sus coordenadas cumplirán con las siguientes premisas:

-w <= x <= w
-w <= y <= w
-w <= z <= w

para Direct3D y:

-w <= x <= w
-w <= y <= w
0 <= z <= w

para OpenGL.

Se podría decir que, para el caso de Direct3D, las coordenadas en clip-space se encuentran en el rango:

-1 <= x <= 1
-1 <= y <= 1
-1 <= z <= 1

(aunque w no tiene por qué ser siempre 1).

Como puedes ver, eso define un cubo que, si mi memoria no me falla, define lo que se denomina volumen de visualización o frustum.

Finalmente el resultado de ese proceso se mapea sobre la "pantalla" en lo que se conoce como screen-space, que son las coordenadas normales y corrientes que se usan cuando se trata de gráficos 2D y que es dependiente de las dimensiones del viewport.

Por cierto, utiliza el HLSL, vivirás más. :lol:

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Sergio

 (ole)  (ole)  (ole)
Ya me he enterado, pues pense que en los VS y PS solo habia que dedicarse a hacer modificaciones del fixed pipeline, no a sustituirlo xDD Pero ahora veo que tiene muchas posibilidades (genial)
BeRSeRKeR, esa 'peaso' de explicacion! Muchas gracias a todos por las respuestas!!

CitarPor cierto, utiliza el HLSL, vivirás más.
Eso tengo pensado, pero es que este codigo no es mio (no me gusta copiar code que no entiendo xDDD) sino que es de unos tutoriales en los que van poco a poco para ver yo en que consiste esto :rolleyes:  :rolleyes:
here are only 10 types of people: those who understand binary and those who don't

Haddd

 Gracias por lo que me toca!!  (ole)

Si es que cuando haces cosas y las muestras, la gente se anima!!

A ver si enseñais lo que haceis!! (genial)  

Sergio

 Vamos a ver... todavia sigo con esto, ahora estoy en HLSL programando shaders desde Rendermonkey (me ha encantado este programa (ole)  (ole) ).
El caso es que estoy usando el libro:
Premier Press - Beginning Direct3D Game Programming, 2Nd Ed
y en el vienen los calculos necesarios para hacer diffuse lighting, ambient lighting, specular lighting, bump mapping, etc. y con las explicaciones necesarias excepto con el bump mapping. No he tenido problema en implementarlo, se que pasos hay que seguir, pero no entiendo para que.
Por ejemplo, se que hay que hacer una matriz para convertir un par de vectores de world space a tangent space, pero que es el tangent space? esa 'tangent' que pillo de input en el VS es tangente al vertice? como puede haber un vector tangente a un punto? (cualquier vector que pasara por el punto seria tangente a el, no?)
Y segundo: para hallar la normal a partir del mapa de normales hace esto:
float3 bumpNormal = 2 * (tex2D(BumpMapSampler, Tex) - 0.5); // bump map
tex2D supongo que devuelve un float4 con el color del pixel que toca dibujar segun las coordenadas de textura (que es lo que contiene 'Tex', pero porque multiplica por 2 y le resta 0.5??
Eso no lo explica tampoco <_<
Y bueno, otra pregunta: sabeis si en Rendermonkey se puede hacer rotar el objeto o algo asi? para ver como queda la iluminacion desde varios puntos O_O
here are only 10 types of people: those who understand binary and those who don't

Haddd

 Hay muchas documentación sobre Tangent Space. Yo lo entendía muy bien en :http://www.delphi3d.net/

hay un artículo sobre bump mapping.

Lo del *2 y -0.5, es debido a que cuando tu lees una textura, sus valores van de 0 a 1. Pero los vectores normalizados pueden ir de -1 a 1.

Por tanto, lo que hacen es guardan la textura convirtiendo el vector al rango (0,1). Y en el pixel shader, lo dejan de nuevo como estaba:

Fíjate, si quiero convertir un 0 al rango (-1,1):  2*(0-0.5) =-1
si quiero convertir el 1 al rango (-1,1) : 2*(1-0.5) = 1

Sergio

 muchas gracias por la info Haddd!!
El 2*(x-0.5) lo he entendido perfectamente y lo que es el tangent space tambien, pero que es exactamente ese vetor TANGENT que se pilla de input en el VS??
here are only 10 types of people: those who understand binary and those who don't






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.