-
-
Notifications
You must be signed in to change notification settings - Fork 97
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Use OpenGL 3.3 for the low-end rendering backend #877
Comments
How does adoption of Vulkan looks like on mobile devices? Iirc, the Khornos Group stated that all hardware capable of OpenGL 3 should be capable of Vulkan and it's just question of drivers. If it's the same as OpenGL 3, then porting the OpenGL 3 renderer could be just replaced with Vulkan and there would not be need for OpenGL 3. I kinda fancy the idea of having OpenGL 2 just for 2D since it's just a compatibility option and is not really good at 3D. Also, I'd like to notice that there is pretty big community of people using cheap secondhand Thinkpads with Linux. These laptops are capable of only OpenGL 2. This might be just a really little minority of userbase. I have no idea how many people with Thinkpads using Godot are there. If it happens, then in the editor should be icon stating "You device is not supported for rendering 3D" when user with only OpenGL 2 tries to open 3D. |
What about WebGL1? Only the most current devices support WebGL2. Personally I want to make 3D games for very old computers since where I'm from a lot of people have very old computers. If you drop it I hope you find a way to make WebGL1 work, or make the next Godot 3.2 version LTS. |
This is already noted in the proposal:
|
On newer devices it is great! We hope that the Vulkan Mobile renderer will be sufficient for most mobile devices. However, older devices definitely do not support vulkan. And there is a significant amount of mobile devices that don't support it.
If you have more information about this, I'd love to hear it. All the hardware surveys I have found say that more than 99% of desktop computers support OpenGL 3.x+. If there really is a significant portion of users that only have OpenGL 2.1 only devices, then we would have to consider using GLES2 instead of GLES3. That being said, if we go this route, we will have to plan on having long term support for Godot 3.2, So those users may be better off just using Godot 3.2 anyway. |
99? I'm not sure about that. I have a laptop from 2010 and it can't run the GLES3 renderer. Where I live most people have computers from that era without dedicated graphics. That survey probably focused on the US and European countries. Now I feel like I'm hindering progress xD . I would love to keep using Godot but if you feel it's going to be too hard to support GLES2 then drop it. |
According to the post above, planned to drop is just 3D for GLES2. You can keep using Godot even after this changes but only for 2D.
Here's link to the Thinkpad community on Reddit. I have no idea how many people with ThinkPads use Godot but this community engage in OSS quite a lot. I've seen many people from this community online. |
This is an important topic. The GLES3 situation was terrible at the Godot 3.0 release time. Even if a mobile device officially support GLES3 there was no guarantee that Godot can be launched.. Please be sure most devices really support GLES3 reliably. |
The survey is from the Steam hardware survey (linked above), the second and third most prominent locations were Russia and China. The survey is a bit biased towards people who play video games, but for our purposes that is a good thing.
Is the issue that you can't run the GLES3 renderer, or that your computer doesn't support OpenGL 3.3? I would be surprised if your computer didn't support OpenGL 3.x (released in 2008). If you read the above proposal you would see the importance of distinguishing between hardware API support and support of low-end devices. Just because your computer is too low-end to support the Godot GLES3 renderer, doesn't mean that it isn't capable of running OpenGL 3.x. The intention behind this proposal is that we would write a GLES3 renderer much the same as the current GLES2 renderer, so that it would be fast enough to run on any device that supports OpenGL 3.x. |
I wouldn't be so sure it's actually as nice as described, given the hash some manufactures (cough Adreno cough) made of OpenGL 3 support on mobile. |
Drop GLES2, I don't want Godot to turn into another openGL (In the meaning that for shake of compatibility they suffered in new features and slowly turned into a bloody mess, ergo Vulkan was born) |
|
"Low-end rendering". OpenGL 4 is DEFINITELY NOT low-end! |
Just to mention that as supporting older hardware is much more my interest than I suspect @clayjohn or @reduz 😁, I'd be prepared to get this working (with some minimal support from the IDE regarding materials). 👍 |
To me, GL 3.0 is the optimal "low-end" spot for years to come. |
need GLES 3.X for mobile 3D, GLES 2 is suitable for 2D games |
no please now, i use GLES 2 daily for mobile games and low end pc games, it works well on browsers which GLES3 doesn't, GLES 3 is useless because it neither has the backward compatibility or light weight of GLES 2 and neither the high end graphical fidelity of VULKAN |
Not true, Vulkan 1.1 is Android 9 and higher and Vulkan 1.0 is Android 6 and higher iirc |
i still use 3D features of GLES 2, to make 2.5 D game |
It has an Intel GMA HD (form an intel i5-520M), it supports DirectX 10 and OpenGL 2.1. There are a lot of 2010 laptops without dedicated graphics, so none of them can run GLES3 Godot games. |
there are many student computers out there in universities and courses, where the computers are old dual core celerons who only support gles 2, if godot drops support for gles 2 i won't be able to teach about godot on those places anymore (i had made lecture about introduction to godot before), and would have to go back to construct or multimedia fusion |
I think Godot 4 having wide support for HTML5 should be a high priority. My biggest challenge is always getting people to play my stupid little games so I can get feedback and grow as a game designer. My solution to that is that I mostly target HTML5, because folks are way more inclined to follow a link and play, than to download a build. In my experience, GLES3 only seems to work on Chrome, but GLES2 works on almost every browser. I'm fine with my games having lower quality graphics, if we just say "OK, GLES2 is supported, but it looks pretty bad." But I'm not OK with saying "GLES2 is for 2D only" because I like to make little 3D games too! Of course, we can hope that browser support for GLES3 / WebGL 2 will improve over time, but I can't imagine it getting dramatically better on the current timeline for Godot 4... |
UpdateI have updated the proposal to reflect @reduz's comment and to clarify that GLES2 is not going to be dropped. GLES2 will be 2D-only to start. Instead of automatically switching between a GLES2 and GLES3 context, I have updated the post to reflect that they will be two distinct backends, with GLES2 only supporting 2D to start. Further QuestionsI'm hearing a lot of support for maintaining a GLES2 backend. What I would appreciate more clarity on is whether users who are using GLES2 to target HTML and ultra-low-end platforms are shipping 3D games? |
Especially for game jams, HTML is crucial. Not many people want to download a game to rate it. Our team uses Godot to build 3D HTML games, particularly because it's fast HTML export. The turnaround speed is a significant advantage over other game engines I worked with (Unity and Unreal). |
Maybe not "shipping" 3D games, but definitely creating and sharing and collaborating on 3D games targeting HTML5! |
Go for it. GLES 3 is going to be supported by almost every device, and also that minority that want to play a game on an old device is going to look for a 2D game most of the time, that will be supported on GLES 2. When I had an old movile I wasn't looking for the next 3D battle royale on the playstore to be able to play it at 2 frames per second. |
I'd lean over the option of an all around but simplified GLES 2 support because a mixed solution (GL 3.x for something, GLES 2 for the rest) not only is a desktop only solution (doesn't export to WebGL if you do 3D, no support 3D for old mobile devices) but seems quite more work than thinking about a system that disable features from the rendering device used. Plus not sure about how buggy is GL 3.x on older integrated GPUs and if it's like GLES 3 that seems to work slower compared to GLES 2 on some hardware. Still i don't know how good is supporting something that is a bit out of place in a newer design of the renderer, dodging/downgrading many features (from a programming standpoint inside the engine to the game developer one that will need to use an editor with many things disabled, performance issues and things to consider to make it work like lighting that isn't as intented, etc). Maybe focusing on GLES3 and Vulkan as the only options for 4.x and make users use the 3.x engine if the hardware is too old would make more sense. Not to exclude people with old hardware you could go for a full GL3.x renderer so that they can work "on par" feature wise and then export to WebGL 2, GLES 3 on mobile, etc. No more GLES 2 or WebGL but a least they can work on things with the lastest version of the engine. But if with GL3.x you still need to cripple too many things i don't think it does make much sense to do it. Another idea is having an unofficial GLES 2 renderer and make it so that it can be an external library to load instead of having to build the entire engine to use it. The community that is interested in continuing that support could contribute, implementing only the features that they want to use without the editor/engine having to cripple itself officially to mantain back compatibility with default values, etc. Maybe only a basic filtering of unsupported things commanded by the renderer could be done officially or default values read from the renderer classes? |
I would echo this sentiment. These surveys are not of any reassurance, when one sends their game to a friend, and they tell you it doesn't run. And the reason ends up being because their laptop or older machine doesn't support X version of OpenGL or even that they're on a 32-bit system. I also recall not being able to run any of the Godot web games that came out of the 3.0 era, because of web gl2 complaints on my machines. Still happens occasionally. |
I just saw this post and I'm really late to the party but I want to second @Rexxilion-ex point - I personally work on an older ThinkPad X220 with Linux installed - I have a better computer, so I won't be completely cut-off but it would change my workflow completely. But sure enough there are other people who don't have the luxury of a modern PC. Because @clayjohn asked for an specific example: I'm working on a commercial 3D game at the moment (classic dungeon crawler) and GLES 3.0 was running a lot worse on my ThinkPad even though GLES 3.0 worked (the CPU is capable of OpenGL 3.0 and this seemed to be enough even if 3.3 is required) so I switched to GLES 2.0. I'm specifically targeting also older devices, Linux and Windows to be exact. When I started working on the 3D game I was amazed how well Godot handled my game (when I don't go crazy on the lights). The Steam survey is a bit misleading since I suspect that most people who are on really low end devices download the version from the website because Steam eats a lot of resources on a low-end device. I'm not an expert by any means and I could be definitely really wrong about how this stuff works but: With dropping GLES 3.0 all together and accepting the limitations of GLES 2.0 this would likely reduce the workload to:
But as I stated maybe I'm getting something completely wrong. Since the 3.2.x branch will likely be supported for a long time as with 2.1.x, I don't have much fear at least for the current project but I would love to see it maintained in the future even without newer features. And when I read correctly it seems that GLES 2.0 won't be dropped and get features slowly and eventually 3D, so I'm happy (even though I would love to see 3D sooner but I dunno what eventually means). I personally don't need many of the features but I can only speak for my projects (The most advanced thing are some world environment sliders and lights). Thanks for your work guys. |
@Daniel-da-Silva Thanks for sharing your thoughts! I'm not going to provide a lengthy response (as I think I have said all I need to say above!), but I would like to point out a few important things that jumped out at me from your comment. GLES2 is not synonymous with "low-end"What I mean by that is that many users are in the same boat as you. They have an older device that technically supports OpenGL 3.3 but the Godot GLES3 renderer seems to run poorly or have many graphical glitches, so they choose GLES2. These people, like yourself, are choosing GLES2 because it is a backend designed for low end devices. It actually doesn't matter if that backend runs on OpenGL 1.1, 2.1, or 3.3, they just need something targeting low end devices. Our unfortunate naming of our backends (GLES2 and GLES3) has made people think that OpenGL 2.1 is a superior API for all low end devices, but in reality, it is two distinct designs. In reality, there are very few devices that only support OpenGL 2.1 while there are many devices that only support GLES2. In theory, our proposed OpenGL 3.3 low-end renderer for 4.0 should support nearly every device that broadcasts OpenGL 3.3 support as well as our current GLES2 renderer does. Using OpenGL 3.3 allows us modernize our renderer (why we prefer OpenGL 3.3 to OpenGL 2.1)Currently there are a lot of weird gotcha's when switching between GLES2 and GLES3. Lights look different between the two backends, GPUParticles aren't supported on GLES2, no HDR in GLES2 so no tonemapping, there are many more subtle issues with skeleton animations and blendshapes that catch users by surprise. While we tell users that they can just switch between the two backends as they please, the reality is that switching to GLES2 (in 3D) comes with a bunch of hidden pitfalls. Using OpenGL 3.3 gives us a minimal feature set to write a modern renderer supporting modern features that targets low-end devices. This allows us to unify basic behaviour between the two renderers without sacrificing support for low-end devices.
It isn't this simple. Supporting OpenGL 2.1 forces us to hold the Vulkan backend back. Godot has only 1 renderer, but it has 2 rendering backends. In 3.x, the renderer is limited by a need to support OpenGL 2.1. In other words, performance and available features in the GLES3 backend are reduced so that the GLES2 backend can exist. If we choose to keep an OpenGL 2.1 backend for 4.0, the Vulkan renderer will be similarly limited and won't achieve close to the performance goals we have planned. |
While I need GLES2 for 2D/3D to target SBC that only supports that API, given the circumstances described and discussed here, it's best to keep using 3.2.x for this kind of purpose. if there was a possibility to encapsulate GLES2 and run it as a module it is actually a great solution if it were possible just keep it as it is now without any further development. On the other hand, @lawnjelly wants to port GLES2 to 4.0 in an unofficial branch, so that everyone can compile on their own. Although he does not know if he will do it soon or when. As @clayjohn says, we must understand and see how a GLES3 made for low-end devices will be as effective and fast as GLES2 or more. |
The Steam survey isn't specific to any game or application – it's an average of all people using Steam. That said, keep in mind it tends to be skewed towards the higher end because of all the people using Steam to play AAA games exclusively (or almost). When making an indie game, you often have to aim for lower-end machines to broaden your audience. |
Uh, I didn't expect so many answers! Thanks! @clayjohn Okay, I'm confused now, that sounds dropping GLES2.0 is now official? I'm just confused because of
and I didn't find something else. Even if Godot 4.0 won't work for any reason I can still use the 3.2.x branch for a long time because I'm not interested in mobile and only support Windows and Linux and it seems that I'm able to work on these platforms for a long time even if support was dropped tomorrow (and it isn't obviously). Thank you for explaining and your time! @alexfreyre Yeah, I understand better now - I'm interested how SBC and Web will be affected but it isn't a problem for me personally. Thanks. @Calinou Hey, I know that - but I wasn't explaining good what I meant. I personally use Steam on my developer machine only to test my own game sometimes so I think I'm registered with my other PC that I use for gaming sometimes. A big thanks to all of you taking the time to explain that stuff to me even if the thread is months dead! |
The OpenGL renderer is still a few months away from being implemented in the
In the interest of user privacy, there are no plans to add telemetry to official Godot releases 🙂 |
The only problem I see with removing 3D support for GLES 2 is the fact that the docs say that GLES 2 works best on the Oculus Quest 1, meaning GLES 3 wouldn't work as well |
@Kylogias The Oculus Quest 1 and 2 both support GLES3 and Vulkan. It's likely that GLES2 was recommended because in Godot it's a more lightweight renderer, however, the GLES3 backend in Godot 4.0 will be more lightweight than GLES3 in 3.x. |
Honestly, I wanna see GLES2 not removed, but evolve as a retro/legacy renderer, something like the "Lubuntu" renderer.
As such, I wanna see GLES2 not removed, but evolved into a new purpose. EDIT: As someone from south america is still common to find old laptops and computers that only support OpenGL 2.1 |
I really hope GLES2, GLES3, or both, are implemented sooner than later, this is kind of the major block that prevents me from contributing to Godot 4.0 at this point in time, not necessarily talking as a user here. |
I presume software Vulkan implementations will be widespread enough by the time 4.0 is released. They will never be fast enough to run games playably, but they will still allow people without Vulkan-compatible GPUs to contribute to the engine code. Still, the OpenGL renderer is aimed for a future 4.x release to avoid delaying the Godot 4.0 release by 9+ months. See https://godotengine.org/article/about-godot4-vulkan-gles3-and-gles2. |
This was implemented by godotengine/godot#54307, closing. Only basic 2D rendering functionality is present for now. 3D support will likely only be finalized in 4.1. Nonetheless, the decision to use GLES3 as a baseline is now taken, so the proposal is closed. If you really need GLES2 support, it should be possible to use the first commits from godotengine/godot#53150 as a base in your own engine fork. |
To add some more information for those involved in this thread. We considered all responses to this thread very carefully. It is quite clear that the community strongly desires a rendering backend that is targeted at older and lower end devices. Unfortunately, it is also clear that using OpenGL 3.3/ES 3.0 as our targeted API for the low-end renderer will result in some users being unable to upgrade their projects to 4.0. Our hope is that it is very few people and with time OpenGL 3.3/ES 3.0 should be universally supported. At the time of writing, only 8.5% of active Android devices are limited to OpenGL ES 2.0, and as explained in the OP, the number is even lower for desktop hardware. Additionally, it appears that WebGL 2 is now supported by all major browsers (https://caniuse.com/webgl2) Our hope is that the new OpenGL3 backend will be sufficiently simple that any device advertising support for OpenGL 3.3/ES 3.0 will run it without problem (related to rendering API that is). |
@clayjohn The most interesting part for me is OpenGL support in GPU drivers for Windows, specifically, Intel GPUs (not officially declared, but actual). If there is an easy way to tie OpenGL 3.3 with ANGLE, then it should work as a replacement for OpenGL 2.1 renderer for me. |
|
@Calinou Thanks for the link, it turned out I was already subscribed to the PR. However, please take a look at this quote:
Note that what I'm asking for is apparently ANGLE for Godot 4.0 (the context of this proposal), not 3.x, because in Godot 3.x I still have the OpenGL 2 renderer. |
edit: see #877 (comment) below for updates. Make sure to read both this post and the updates before responding.
Describe the project you are working on:
The Godot engine renderer
The Problem
Describe the problem or limitation you are having in your project:
Implementing new 3D features is becoming increasingly difficult as we try to support modern workflows (e.g. HDR, PBR) while maintaining support for OpenGL 2.1/ES 2.0 devices.
We frequently have to sacrifice quality in our high-end rendering backend in order to support consistent workflows between the high-end (Vulkan) and low-end (OpenGL) backends.
Some common issues that arise:
Compatibility with older Devices
Right now the GLES2 backend serves 2 purposes:
When we decided to add the GLES2 backend many devices only supported GLES2. At the time, 40% of Android devices only supported GLES2. Thankfully that is no longer true.
OpenGL 2.1/ ES 2.0 only devices are becoming increasingly rare. On Android over 85% of devices now support GL ES 3.0 or higher. On iOS, every device supports ES 3.0. On Desktop the overwhelming majority of devices support GL 3.3+ (more than 99% support at least GL 3.3 according to the Steam hardware survery)
As a result of the rapid adoption of OpenGL/ES 3.x+ the main purpose served by the GLES2 renderer is as a low-end renderer to maximize speed on high and low-end devices. Many users that are choosing to use GLES2 currently are not doing so because their device doesn't support OpenGL 3.3, they are doing so because their device doesn't like the high-end features that are in the Godot GLES3 renderer.
The Solution
Describe the feature / enhancement and how it helps to overcome the problem or limitation:
I propose dropping GLES2 support for 3D. For 2D, we can still use GLES2, but when 3D features are used, we will require GLES3.
Given that the main purpose behind the OpenGL backend will be supporting low-end devices, we will write the GLES3 renderer to target low-end devices. This means it won't have the feature set that that Godot 3.2 GLES3 renderer has, but it should run even faster than the current GLES2 renderer and look much better.
This change will both increase the perceived speed and quality of the low-end renderer, but it will also make development much smoother.
What this allows us to:
The one issue with this proposal is WebGL. WebGL 2.0 is not supported well yet. We will either have to work out a sort of compatibility mode for WebGL, or wait for more widespread adoption of the WebGL 2.0 API.
If we do drop 3D support for GLES2 in 4.0, it will mean that we will have to work harder to support 3.2.x for a long time. Users will still be able to make and export games using Godot 3.2.x and critical bugfixes will still be merged for 3.2.x. This seems to be a fair trade off. If the GLES2 renderer is ported to Godot 4.0, it won't have access to any of the additional features that come with 4.0.
One of the factors we considered when moving to Vulkan was the poor quality of OpenGL ES 3.0 drivers on mobile. At this point, OpenGL ES 3.0 drivers support seems to have improved substantially. Further, basic features are supported very well in the OpenGL ES 3.0 drivers. By limiting ourselves to a limited feature set (closer to GLES2) then we won't bump up against any of the features that are poorly supported by the drivers and we should be able to avoid any of the major problems we had before.
Describe how your proposal will work, with code, pseudocode, mockups, and/or diagrams:
This section is edited based on comments below
User will be able to choose between 4 backends:
If this enhancement will not be used often, can it be worked around with a few lines of script?:
No.
Is there a reason why this should be core and not an add-on in the asset library?:
Yes, this has to do with core engine functionality
The text was updated successfully, but these errors were encountered: