¿Hay alguna razón, excepto el rendimiento, para usar WebGL en lugar de 2D-Canvas para juegos / aplicaciones 2D ?
En otras palabras, ¿qué funcionalidades 2D ofrece WebGL que no se pueden lograr fácilmente con 2D-Canvas?
¿Hay alguna razón, excepto el rendimiento, para usar WebGL en lugar de 2D-Canvas para juegos / aplicaciones 2D ?
En otras palabras, ¿qué funcionalidades 2D ofrece WebGL que no se pueden lograr fácilmente con 2D-Canvas?
Respuestas:
Mirando esta pregunta desde otro lado:
¿cómo elige un desarrollador una tecnología sobre otra?
Así que discutiré las diferencias entre las API de canvas y webGL con respecto a estas cualidades.
Tanto canvas como webGL son API de JavaScript. Son más o menos lo mismo con respecto a la integración (enlace). Ambos son compatibles con una serie de bibliotecas que podrían acelerar su codificación. Las diferentes bibliotecas le brindan diferentes formas de organizar su código, por lo que la elección de la biblioteca dicta cómo se estructuran sus API de dibujo, pero sigue siendo más o menos lo mismo (cómo el resto del código se une a él). Si usa la biblioteca, la facilidad para escribir código depende de la propia biblioteca.
Si escribe código desde cero, la API de lienzo es mucho más fácil de aprender y comprender. Requiere un conocimiento mínimo de matemáticas y el desarrollo es rápido y sencillo.
Trabajar con la API de WebGL requiere sólidas habilidades matemáticas y una comprensión completa del proceso de renderizado. Las personas con estas habilidades son más difíciles de encontrar, la producción es más lenta (debido al tamaño y la complejidad de dicha base de código) y, por lo tanto, cuesta más.
WebGL es más rápido y tiene más capacidades. No hay duda de eso. Es una API 3D nativa que le brinda acceso completo a la canalización de renderizado, el código y los efectos se ejecutan más rápido y son más 'modificables'. Con webGL realmente no hay límite.
Tanto canvas como webGL son beneficios de html5. Por lo general, los dispositivos que admiten uno admitirán y el otro.
Así que para resumir:
Espero que esto ayude.
PD: Abierto para discusión.
La mayor ventaja es la capacidad de programación de la canalización y el rendimiento. Por ejemplo, supongamos que está dibujando 2 cuadros uno encima del otro y uno está oculto, algunas implementaciones de GL tienen margen para descartar el cuadro oculto.
En cuanto a las comparaciones, dado que no hay una forma rápida de crear una tabla aquí, acabo de subir una imagen de la tabla de comparación a continuación. Se agregó Three.js solo para completar.
Hablando por experiencia en mis propias aplicaciones , los sombreadores de gráficos han sido la única razón por la que he requerido soporte para WebGL. La facilidad de uso tiene poca importancia para mí, ya que ambos marcos se pueden abstraer con three.js. Suponiendo que no necesito sombreadores, permito el uso de cualquier marco para maximizar el soporte del navegador / máquina.
¿Qué capacidad 2D ofrece WebGL que no ofrece el lienzo 2D? El más grande en mi humilde opinión son los sombreadores de fragmentos programables en el hardware de gráficos. Por ejemplo, en WebGL, uno puede implementar Game of Life de Conway en un sombreador en su hardware 3D:
http://glslsandbox.com/e#207.3
Este tipo de pantalla 2D solo se ejecutaría en la CPU, no en la GPU, con un lienzo 2D. Todos los cálculos se implementarían en JavaScript y no serían tan paralelos como la GPU incluso con la ayuda de los trabajadores web. Este es solo un ejemplo, por supuesto, todo tipo de efectos 2D interesantes se pueden implementar con sombreadores.
Bueno, el rendimiento sería una de las principales razones porque cuando estás codificando un juego, tiene que ser rápido. Pero hay un par de otras razones por las que es posible que desee elegir WebGL en lugar de lienzo. Ofrece la posibilidad de codificar sombreadores, iluminación y zoom, lo cual es importante si estás haciendo una aplicación de juego comercial. También el lienzo se retrasa después de 50 sprites más o menos.
No hay nada que pueda hacer con Canvas que no pueda hacer con webGL: el lienzo permite aplastar los bytes con get / putImageData, y puede dibujar líneas, círculos, ... mediante programación con webGL.
Pero si está buscando hacer bastantes dibujos, y también algunos efectos a 60 fps, la brecha de rendimiento es tan alta que simplemente no será posible con lienzo, cuando funcionará bien en webGL. El rendimiento es una característica fundamental.
Sin embargo, webGL es bastante complicado de programar: vea si canvas es lo suficientemente bueno para usted o busque una biblioteca que alivie el dolor ...
Otro inconveniente: no funciona en IE (pero ¿qué funciona?), Y en algunos móviles.
Consulte aquí la compatibilidad: http://caniuse.com/webgl
Como desea específicamente algunas cosas 2d clásicas que no funcionan bien con lienzo:
... pero, por supuesto, tiene acceso a píxeles, por lo que puede hacer realmente cualquier cosa, incluido lo anterior, manualmente. Pero eso puede ser muy, muy lento. En teoría, podría emscripten Mesa openGl para renderizar en lienzo.
Otra gran razón para usar webGL sería que el resultado es muy fácil de transferir a cualquier otro lugar. Lo que también hace que la habilidad sea más valiosa.
Las razones para usar el lienzo son que aún tiene mejor soporte y si aprendes a hacer cosas píxel a píxel, también es una lección muy valiosa.
Como WebGL es una tecnología particularmente nueva y el lienzo HTML5 está más establecido, lo que desee utilizar depende de sus usuarios. Si cree que sus usuarios usarán dispositivos móviles, sugeriría un lienzo HTML5, pero si desea una mejor representación 2D, usaría WebGL. Entonces, lo que podría hacer es si el uso está en el renderizado móvil con HTML5, o si están en una plataforma que admita WebGL.
Por ejemplo:
if (window.WebGLRenderingContext) {
webGLcanvasApp()
} else if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) {
html5CanvasAppFMobile()
} else {
html5CanvasApp()
}
Fuentes: ¿
forma adecuada de detectar la compatibilidad con WebGL?
¿Cuál es la mejor forma de detectar un dispositivo móvil en jQuery?
WebGL no se puede utilizar sin una GPU.
Esta dependencia del hardware no es un gran problema porque la mayoría de los sistemas tienen GPU, pero si las arquitecturas de GPU o CPU alguna vez evolucionan, preservar el contenido webgl mediante emulación puede ser un desafío. Ejecutarlo en computadoras viejas (virtualizadas) es problemático.
Pero "Canvas vs WebGL" no tiene por qué ser una opción binaria. De hecho, prefiero usar webgl para efectos, pero hacer el resto en lienzo. Cuando lo ejecuto en una máquina virtual, todavía funciona bien y rápido, solo que sin los efectos.