2011-07-26 21 views
9

¡Tengo un televisor 3D y siento que estaría eludiendo mis responsabilidades (como geek) si al menos no intentara mostrar bonitas imágenes en 3D de mi propia creación!¿Cómo envío imágenes 3D a mi TV 3D?

He hecho una cantidad muy básica de programación OpenGL antes y por lo tanto entiendo los conceptos involucrados: supongamos que puedo renderizar un Tetraedro o Cubo simple y hacerlo girar un poco; ¿Cómo puedo hacer que mi TV 3D muestre esta imagen en 3D?

Tenga en cuenta que entiendo los conceptos básicos de cómo funciona 3D (renderizar la misma imagen dos veces desde dos ángulos diferentes, uno para cada ojo), mi pregunta es sobre la logística de hacerlo (¿necesito un SDK? ..)

  • El televisor tengo utiliza la polarización 3D, aunque mi intención es que esta cuestión también ser relevante para otras tecnologías 3D (si es posible)
  • mi portátil tiene una salida HDMI, que es lo que pretendo para usar para conectarme a mi TV con (¿esto marca alguna diferencia con respecto al uso de un cable de video componente/VGA?)
  • En el pasado tengo experimentó con GLUT/OpenGL; sin embargo, si es más fácil/solo realmente posible hacerlo utilizando alguna tecnología alternativa, entonces está bien
+0

Posible duplicado de [¿Cómo puedo emitir una señal estereoscópica compatible con HDMI 1.4a desde una aplicación OpenGL a una 3DTV?] (Https://stackoverflow.com/questions/7032991/how-can-i-output-a -hdmi-1-4a-compatible-estereoscópico-señal-de-un-opengl-appli) – user2284570

Respuesta

7

El problema principal es que su GPU envíe un formato estereoscópico. En el caso de una conexión HDMI esto no funcionará sin la ayuda de un controlador. Si usted tiene una GPU de nivel profesional (Quadro, FireGL), entonces lo más probable es quadbuffers soporte OpenGL, es decir, se obtiene framebuffers para el ojo izquierdo y el derecho, tanto delante y por detrás:

glDrawBuffer(GL_BACK_LEFT); 
render_left_eye(); 

glDrawBuffer(GL_BACK_RIGHT); 
render_right_eye(); 

glDrawBuffer(GL_BACK); // renders to both eyes simultanously 
render_screen_level_and_nonstereoscopic(); 

SwapBuffers(); 

Desafortunadamente búfer cuádruple OpenGL se considera profesional cosas de grado

En su lugar, NVidia (al menos) proporciona una biblioteca estereoscópica habitual más algunas extensiones para controlarla. El razonamiento principal es que los fragmentos compartidos se renderizan una sola vez y luego se envían a ambos ojos con la paralaje apropiada. Sin embargo, desde mi experiencia semiprofesional con la estereoscopía¹, este tipo de estereoscopias semi/automáticas simplemente no lo hacen. La estereoscopía requiere un control estricto de toda la tubería de "producción"; de lo contrario, se atornilla. Con Elephants Dream llegué a modificar el código central del procesador.

Envié a la gente de 3Dvision en NVidia algunos escenarios de casos en los que necesita control exacto sobre el proceso estereoscópico, y espero que vean la luz y den acceso al estéreo quad-buffer también en hardware de consumo.

Nota que entiendo los conceptos básicos de cómo funciona 3D (render la misma imagen dos veces a partir de 2 diversos ángulos, una para cada ojo)

En realidad, usted no se representan desde dos ángulos diferentes, pero con un paralaje cambiado y un cambio de lente. De lo contrario, obtendrá una distorsión trapezoidal/trapezoidal en la horizontal, que es muy, muy desagradable de ver (de hecho, ahora creo que en el proceso de representación estereoscópica debe divergir ligeramente los ejes ópticos, es decir, hacer todo lo contrario a lo ingenuamente hacer - y "sobre" compensar con el cambio de lente, actualmente estoy preparando un pequeño estudio sobre esto, pero todavía necesito reunir mis grupos de prueba y control).


1: diablos, yo soy el tipo que single-handedly stereographed Elephants Dream, rendered it y consiguieron un award at a 3D movie festival.

+0

¡Gracias por su respuesta integral! Da la casualidad de que en realidad estaba pensando en comprar otra computadora portátil que tenga una tarjeta gráfica Quadro (sin darme cuenta de que podría ser útil), así que aún puedo tener la oportunidad de experimentar con ambos métodos. – Justin

+0

En realidad, a partir de su documentación, la mierda nVidia 3D funciona mediante la decisión basada en algunos heurísticos como rendertarget ratio si duplicar o no los objetivos de renderizado, así como todas las llamadas de sorteo, y la modificación del vertex shader para hacer los cálculos de paralaje. Lo ingenioso es que un chico de nVidia es mucho más inteligente que tú y sabe mucho más sobre cualquier aplicación de la que podrías escribir, por lo que funciona muy bien. Debes preguntarte qué es tan difícil en _properly_ que admite 3D, es decir, búferes cuádruples. No es que le pida nada especial a HW. – Damon

+0

@Damon: El motivo es simple: el estéreo quad-buffer real es un punto de venta para las GPU de alto nivel profesional de NVIDIA. Si simplemente activaran el interruptor del controlador que permitiría que esto funcione en GPU de consumo, podrían perder muchas ganancias de sus GPU profesionales infladas de precios. Con un poco de suerte, Direct3D 12 requerirá QBS, y por lo tanto NVIDIA (y AMD) lo expondrá en OpenGL. –

0

Dado que tiene un TV 3D pasivo, es probable que las vistas del ojo izquierdo y derecho se representen en líneas de exploración alternativas. (o tal vez en píxeles alternativos en un patrón de tablero de ajedrez)

Por lo tanto, su misión es hacer que la vista del ojo izquierdo coincida con las líneas de escaneo numeradas pares, y el ojo derecho con líneas de escaneo impares (o viceversa). Esto se puede lograr a través de operaciones de galería de símbolos OpenGL o, más modernamente, usando sombreadores de fragmentos personalizados.

De esta manera, puede evitar todo el enfoque de la tarjeta de video/GL_BACK_LEFT/GL_BACK_RIGHT de quad-buffer descrita por datenwolf. Y desea evitar ese enfoque, ya que nunca he encontrado un controlador de video que dirija 3D estéreo con búfer cuádruple a un TV 3D real.

Estoy de acuerdo con el consejo de datenwolf de que debe utilizar el desplazamiento truncado asimétrico en lugar de la rotación de escena para generar los puntos de vista del ojo derecho y el izquierdo.