2011-09-23 13 views
5

Solo hay que encontrar una manera, mediante el uso de Pixel Shader, de proyectar una textura en un cuadrilátero arbitrario definido por el usuario.Sombreador de píxeles para proyectar una textura en un cuadrilátero arbitrario

aceptará coordenadas de los cuatro lados de un cuadrilátero:

/// <defaultValue>0,0</defaultValue> 
float2 TopLeft : register(c0); 

/// <defaultValue>1,0</defaultValue> 
float2 TopRight : register(c1); 

/// <defaultValue>0,1</defaultValue> 
float2 BottomLeft : register(c2); 

/// <defaultValue>1,1</defaultValue> 
float2 BottomRight : register(c3); 

pareja trató de algoritmo de interpolación, pero no lograba hacerlo bien.

¿Hay alguna muestra que ustedes piensen que yo pueda modificar para obtener el resultado deseado?

Respuesta

1

Hay un nice paper here que describe sus opciones (o este .ppt). Básicamente, debe definir algunas coordenadas baricéntricas en el cuadrángulo, luego interpolar los valores de los fragmentos como sumas ponderadas BC de los valores de vértice dados.

Lo siento, no sé de ningún código; la falta de soporte directo para los quads en HW orientado a triángulos moderno (ver la respuesta de voidstar69) significa que ya pasaron de moda.

1

El problema aquí es que todo el hardware de gráficos 3D moderno rasteriza triángulos, no cuadriláteros. Entonces, si le pides a Direct3D u OpenGL que renderice un quad, la API dividirá internamente el quad en dos triángulos. Esto no suele ser un problema, ya que todas las representaciones modernas tienen una perspectiva correcta, por lo que el espectador no debería poder distinguir entre un cuadrángulo y dos triángulos; la interpolación será perfecta.

La forma correcta de pedirle a la API que realice esta interpolación es pasándola las coordenadas de textura como datos por vértice, que la API/hardware se interpolarán en cada píxel. Su sombreador de píxeles tendrá acceso a esta coordenada de textura por píxel. Supongo que cuando usas el término "proyecto" te refieres simplemente al mapeo de una textura rectangular en un cuadrante, y no te refieres a la proyección de textura (que es como un reflector que proyecta una textura sobre las superficies).

La línea de fondo aquí es que pasar las coordenadas de textura del quad al sombreador de píxeles es el enfoque incorrecto (a menos que tenga alguna razón especial por la que esto es necesario).

+0

Esto es todo cierto ... pero también es completamente posible esquivar completamente los interpoladores basados ​​en triángulos de HW y definir su propio esquema en quads o polígonos o cosas más complejas incluso si puede dividir su huella en triángulos y obtener cada píxel sombree la información que necesita (específicamente, la posición y los valores de todos los otros vértices, no solo el triángulo local). Por supuesto, esta no es una forma particularmente eficiente de hacer las cosas en comparación con el soporte de interpolación de triángulos dedicado de HW, pero eso no significa que no tenga aplicaciones. – timday

+1

El póster no ha especificado si están tratando de utilizar la interpolación de HW, o de paso lateral. Estoy de acuerdo en que ambos son posibles. Creo que la pregunta original debe ser aclarada y proporcionar más detalles. – voidstar69

Cuestiones relacionadas