La mayor parte del tiempo desarrollo mi juego bajo ArchLinux. He decidido probarlo en Ubuntu 16.04 recientemente. La situación que encontré fue realmente extraña:
- No
glGetError()
s en absoluto. - Sin errores, advertencias, nada malo en la salida de depuración gl.
- Todas las afirmaciones que hice para todas las situaciones malas no se activaron.
-
glClear
borró con éxito los búferes que especificado, pero: -
glDraw*
no dibujó nada.
Afortunadamente he encontrado una solución que debía establecer glViewport
. Sin embargo, no lo entiendo del todo, ¿por qué es necesario dibujar en Ubuntu pero no en ArchLinux? La diferencia también está entre los adaptadores de gráficos: en archlinux uso NVIDIA 1060, en Ubuntu uso HD Graphics P530 integrado (Skylake GT 2 ).
Si es importante, uso SDL2 con opengl 4.4.
Comentarios
- It ' es importante para que se dé cuenta de que el sistema operativo no es relevante aquí; el proveedor de GPU implementa OpenGL en sus controladores, por lo que los factores importantes son sus GPU y sus controladores. Donde el sistema operativo podría ser interesante es si su proveedor de GPU tiene diferentes bases de código para diferentes sistemas operativos, pero de lo contrario ' no es información útil.
- @MaximusMinimus, esta podría ser la respuesta a la pregunta.
Responder
Ya tienes dos buenas respuestas, pero pueden ser difíciles de entender para un principiante, así que «Te diré por qué realmente necesitamos función.
En el renderizado típico, puede parecer que no tiene sentido: simplemente crea una ventana o un objetivo de renderizado y dibuja en él, ¿verdad? Yo diría que más del 95% de las aplicaciones funcionan de esa manera.
Pero digamos que estás escribiendo una aplicación como 3DS MAX, donde tienes tu ventana dividida en 4 representaciones distintas. Recuerda tu posición de división actual y administra los eventos del mouse, por lo que cuando se desplaza sobre la barra de división puede cambiar el cursor del mouse para cambiar el tamaño de uno, etc. Cuando arrastra la barra de división, recuerda su nueva posición, etc.
Cuando desee renderizar sus vistas 3D, califique glViewport con la posición y el tamaño de su primera subventana 3D y ejecute los comandos GL típicos para dibujar aquí. OpenGL escalará automáticamente la renderización para que se ajuste a la ventana gráfica dada. Usted hace lo mismo para el el resto de sus ventanas gráficas y al final obtendrá una ventana con pocas representaciones diferentes, cada una con sus propios parámetros. De esta manera, puede tener tantas representaciones distintas en una sola ventana / destino de representación como desee.
¿Por qué no funcionó en una máquina?
Las GPU y sus controladores tienen muchos detalles de implementación y diferencias, por lo que, en general, debe acostumbrarse a estos problemas. Un ejemplo simple: en el sombreador GLSL puede crear un vector cero 2D como ese: vec2(0.0,0.0)
, también puede intentar escribir un valor: vec2(0.0)
y con este código, algunos controladores lo tratarán como una versión anterior, mientras que otros devolverán un error y no mostrarán nada. Tenga en cuenta que los controladores de dos proveedores serán más diferentes que dos versiones del mismo controlador, por lo que es una buena idea probar su código en las GPU nVidia, ATI e Intel. En este mismo caso, sospecho que en los controladores nVidia, cuando no establezca la vista por sí mismo, asumen que desea utilizar todo el destino de procesamiento, mientras que los controladores Intel no lo hacen.
Respuesta
glViewport le permite a opengl saber cómo asignar las coordenadas NDC a las coordenadas del framebuffer.
De forma predeterminada, se establece en el tamaño completo del búfer de pantalla. Por lo tanto, solo necesita llamarlo cuando la ventana se redimensiona o realmente desea cambiarlo.
Comentarios
- O cuando se renderiza a un framebuffer, asumiendo que el tamaño de la ventana es diferente.
Respuesta
glViewport especifica la transformación afín de xx e yy de coordenadas de dispositivo normalizadas a coordenadas de ventana. Let (xnd , ynd) xndynd ser coordinado del dispositivo normalizado inates. Luego, las coordenadas de la ventana (xw, yw) xwyw se calculan de la siguiente manera:
- «xw = (xnd + 1) (width2) + xxw = xnd + 1width2 + x»
- «yw = (ynd + 1) (altura2) + yyw = ynd + 1altura2 + y»
El ancho y la altura de la ventana gráfica se sujetan silenciosamente a un rango que depende de la implementación. Para consultar este rango, llame a glGet con el argumento «GL_MAX_VIEWPORT_DIMS»
Los parámetros xey especifican la esquina inferior izquierda de la ventana gráfica en píxeles, mientras que el ancho y la altura especifican la anchura y la altura de la ventana gráfica