Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: Haddd en 17 de Julio de 2003, 12:27:17 PM

Título: Duda De Pixel Shaders
Publicado por: Haddd en 17 de Julio de 2003, 12:27:17 PM
 Imaginar que quiero renderizar la misma escena 2 veces. En la primera, lo único que hago es renderizar la geometría para poder obtener el valor de Z.

En la 2ª quiero comparar el valor de Z real con el valor que he grabado en esa textura.

Si esto fuera por sotfware, lo que haría sería esto en la comparación:

if PuntoXY(Textura_con_Z_Precalculada)>Z del punto xy actual then 0 else 1

Yo me imagino que tengo que utilizar Clip Space, pero me parece tan trivial poder hacer esta comparación que creo que debe haber alguna forma más simple de comparar, pq el shader sabe la x,y de la textura en la que está trabajando y yo lo único que quiero es recuperarla para poder utilizar para buscar un valor en otro textura.


Título: Duda De Pixel Shaders
Publicado por: MChiz en 17 de Julio de 2003, 03:23:43 PM
 hmm... no entiendo tu problema. Que es lo que no sabes hacer?
Título: Duda De Pixel Shaders
Publicado por: samsaga2 en 17 de Julio de 2003, 03:52:22 PM
 En OpenGL hay una funcion (creo) para copiar en un buffer el z-buffer, eso es lo que quieres no? Pero ojo que no es apto para para gente deseosa de un alto framerato.

No acabo de entender para que quieres hacer eso, ¿que intentas? Una especia de textura 3d? OpenGL lo soporta pero las tarjetas actuales no tienen aceleracion para eso, asi que solo hay soporte software (y ya te haces una idea de su velocidad).
Título: Duda De Pixel Shaders
Publicado por: Haddd en 17 de Julio de 2003, 08:42:28 PM
 Quiero poder acceder a una textura utilizando la x,y de las coordenadas de pantalla. Si tengo dos texturas con el mismo tamaño y quiero saber en ese pixel exacto cual es la información de la otra textura.
Título: Duda De Pixel Shaders
Publicado por: Haddd en 18 de Julio de 2003, 12:18:25 AM
 Mirad, este sería un pequeño ejemplo que NO me funciona.

Lo que quiero es pasar la posición del vértice en Clip Space al pixel shader, de forma que me dibuje en el pixel shader la posición del vértice. De esta forma si pinto un rectángulo que ocupe toda la pantalla me debería dibujar un rectángulo con graduación de (0,0) a (1,1) en las esquinas

Este es el Vertex Shader

; Ahora cogemos el ClipSpace y lo pasamos como textura para saber donde estamos
; Recordar que el Clip Space son coordenadas entre -1 y 1, por tanto debo dividirlo entre 2(*0.5) y sumar 0.5
; para pasarlo a 0-1

m4x4      r0,v0,c0

mad      r0,r0,c32.g,c32.g

mov      oT3.xy,r0.xy


Y este el Pixel Shader

dcl   t3.xy            ; Posición en pantalla

mov      r2,t3.y                ;Cogemos sólo la y

mov      oC0,r2

Pero me sale la mitad de la pantala negra y la otra blanca!!!!
¿Alguien puede ayudarme?
Título: Duda De Pixel Shaders
Publicado por: MChiz en 18 de Julio de 2003, 12:42:13 AM
 buf... porque no utilizas Cg o HLSL? Creo que los shaders en ensamblador no tienen mucho futuro... ademas, asi no te puedo ayudar : ( Lo siento
Un saludote!
Título: Duda De Pixel Shaders
Publicado por: BeRSeRKeR en 18 de Julio de 2003, 05:43:26 AM
 ¿He de suponer que esperas un degradado de negro a blanco pasándo por las distintas tonalidades de gris?...si es eso, la verdad es que ahora mismo no encuentro un motivo por el cual no haga el degradado...supuestamente debería hacerlo automáticamente, ¿no? :huh:
Título: Duda De Pixel Shaders
Publicado por: BeRSeRKeR en 18 de Julio de 2003, 07:04:59 AM
 Vale, acabo de caer.

Antes de pasar las coordenadas de textura al rango [0,  1], hay que pasar las coordenadas del vértice de homogéneas a no-homogéneas (el rasterizador las necesita de esta forma). Esto se hace dividiendo la coordenada X e Y por la coordenada W. El código del vertex shader quedaría algo así (estilo HLSL):

// Transformamos la posición del vértice a clip-space
OUT.Position = mul(g_WorldViewProjMatrix, float4(Position, 1.0f));

// Pasamos de coordenadas homogéneas a no-homogéneas
float2 nCoords = float2(OUT.Position.x / OUT.Position.w, OUT.Position.y / OUT.Position.w);

// Las coordenadas de textura deben estar en el rango [0, 1]
OUT.TexCoord0 = nCoords * 0.5f + 0.5f;


En el caso que fueses a utilizar la Z, también tendrías que dividir por W. Y en el caso de W, la nueva W (RHW) sería 1/W.

Espero que esto solvente tus problemas...

Saludos
Título: Duda De Pixel Shaders
Publicado por: Haddd en 18 de Julio de 2003, 08:57:04 AM
 Sí que funciona muchas gracias.

Aquí está el código por si alguien quiero verlo

; Ahora cogemos el ClipSpace y lo pasamos como textura para saber donde estamos
; Recordar que el Clip Space son coordenadas entre -1 y 1, por tanto debo dividirlo entre 2(*0.5) y sumar 0.5
; para pasarlo a 0-1

m4x4      r0,v0,c0

; pasamos de coordenadas no homogeneas a homogeneas dividiendo entre w

rcp      r1.x,r0.w

mul      r0,r0,r1.x

mad      r0,r0,c32.g,c32.g         ; Dividimos por 2 (*0.5) y sumamos 0.5 para pasarlo al rango 0,1

mov      oT3.xy,r0.xy