¿Comportamiento OpenGL según la tarjeta gráfica?

Esto es algo que nunca me había pasado antes. Tengo un código OpenGL que usa sombreadores GLSL para texturizar un model 3D. El código implica una gran cantidad de procesamiento de textura GPU, mezcla, etc.

Quería comprobar cómo mejora el performance de mi código utilizando una tarjeta gráfica más rápida (tanto las nuevas como las antiguas son NVIDIA, utilizando siempre los controlleres de desarrollo de NVIDIA). Pero ahora descubrí que una vez que ejecuto el código con la nueva tarjeta gráfica, se comporta completamente diferente (el renderizado final se ve mal), probablemente porque algún efecto de fusión no se realiza correctamente.

Realmente no he investigado qué ha cambiado, pero supongo que algunos estados de OpenGL son, por defecto, diferentes. es posible? ¿Alguna vez has encontrado diferentes comportamientos OpenGL / GLSL usando diferentes tarjetas gráficas? ¿Alguna solución "rápida"? (Hasta ahora he pensado en volver a conectar el anterior, presionar todos los estados pnetworkingeterminados de OpenGL y comparar con los que inicialmente obtengo usando la nueva tarjeta …)

Edición n. ° 1 : las tarjetas gráficas son NVIDIA Quadro GX7300 (en las que mi código funciona bien) y NVIDIA GeForce GTX 560 Ti (en las que los resultados cambian / fallan)

Editar # 2 He comentado gran parte de mi código, y aparentemente el extraño comportamiento no tiene nada que ver con el event handling la textura. Un piso simple similar a un tablero de ajedrez parece diferente. Las líneas blancas diagonales no aparecían con el viejo NVIDIA Quadro GX7300. ¿Adivina qué cosas relacionadas con OpenGL podrían estar causando esto?

enter image description here

Figura 1


Edición n. ° 3 Ahora he resuelto el problema comentado en la edición anterior, con respecto a las extrañas líneas diagonales finas no deseadas. Como comenté a continuación , tuve que eliminar glEnable(GL_POLYGON_SMOOTH); , que estaba afectando a NVIDIA GeForce GTX 560 por cualquier razón (probablemente debido a razones explicadas por mh01 en su respuesta) .

Sin embargo, todavía estoy enfrentando un problema de "combinación de texturas" cuando uso NVIDIA GeForce GTX 560. Tengo un model 3D que está siendo texturizado usando un sombreador que combina 8 imágenes diferentes para calcular la textura correcta, dependiendo de dónde esté la camera. ese momento en particular. La textura resultante es entonces una combinación de diferentes imágenes, e idealmente se mezclaron muy bien, utilizando un set de pesos de mezcla calculados cada vez que se mueve la camera. Los pesos de fusión todavía están bien calculados, pero la textura resultante es incorrecta. Supongo que la function GL_BLEND se está comportando de manera diferente, pero la he comprobado en ambas tarjetas gráficas y en realidad es la misma. No tengo idea de qué otra cosa puede estar involucrada en get este resultado incorrecto:

Hola

Como se puede imaginar, la línea negra es donde se mezclan dos texturas originales para get una textura perfecta. Si utilizo el código exacto y un NVIDIA Quadro GX730, el sombreador funciona como se esperaba. Sin embargo, cuando uso NVIDIA GeForce GTX 560, la mezcla de texturas sale mal. ¿Alguna conjetura?

Este es el sombreador GLSL que estoy usando.

Si dos controlleres diferentes tienen estados pnetworkingeterminados diferentes, uno de ellos no cumple con la especificación OpenGL, aunque, por otro lado, no hay testings de conformidad para GL_VERSION más recientes, por lo que las cosas son un poco salvaje oeste en este momento.

Lo que está haciendo aquí es comparar la salida de una tarjeta gfx de class profesional / estación de trabajo con la salida de una tarjeta de class de consumidor / escritorio, y lo que está viendo es probablemente el resultado esperado de una compensación de performance / calidad.

OpenGL permite el margen de maniobra en la especificación en muchos casos, y el Quadro se equivocará por el lado de la calidad para que el último CAD o software de modelado sea más preciso, mientras que GeForce se equivocará por el performance para que el último juego corre más rápido.

Por lo tanto, las líneas blancas serán el resultado de una menor precisión de punto flotante utilizada por GeForce. NVIDIA ha funcionado tradicionalmente en una de las dos precisiones internas, 16 bits o 32 bits, y ocasionalmente tomará la ruta de menor precisión incluso en los casos en que no debería.

Puede solucionar este problema presionando los diversos controles deslizantes disponibles hacia la "calidad" en su panel de control NVIDIA, o – si usa sombreadores – puede get mejores resultados especificando explícitamente types de precisión más altos.

También puede darse el caso de que esté trabajando en una escala demasiado grande, y que networkingucir el tamaño al 10% o 1% de su tamaño (y ajustar todo lo demás para que coincida) es la solución que necesita.

Finalmente descubrí lo que estaba pasando. Las líneas diagonales blancas delgadas no deseadas en el piso aparecieron porque estaba usando glEnable(GL_POLYGON_SMOOTH); , que aparentemente es una mala práctica

El problema con respecto al resultado inesperado al mezclar texturas fue causado debido a un comportamiento extraño de un discard; operación en el sombreador. Más detalles al respecto en esta otra pregunta .