Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Duda De Pixel Shaders

Iniciado por Haddd, 17 de Julio de 2003, 12:27:17 PM

« anterior - próximo »

Haddd

 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.



MChiz

 hmm... no entiendo tu problema. Que es lo que no sabes hacer?

samsaga2

 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).

Haddd

 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.

Haddd

 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?

MChiz

 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!

BeRSeRKeR

 ¿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:
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

BeRSeRKeR

 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
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Haddd

 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







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.