A Pen by Arifayan Idowu Olatubosun on CodePen.
List of freely available resources to study computer graphics programming.
WARNING: Article moved to separate repo to allow users contributions: https://github.com/raysan5/custom_game_engines
A couple of weeks ago I played (and finished) A Plague Tale, a game by Asobo Studio. I was really captivated by the game, not only by the beautiful graphics but also by the story and the locations in the game. I decided to investigate a bit about the game tech and I was surprised to see it was developed with a custom engine by a relatively small studio. I know there are some companies using custom engines but it's very difficult to find a detailed market study with that kind of information curated and updated. So this article.
Nowadays lots of companies choose engines like [Unreal](https:
- 2011 - A trip through the Graphics Pipeline 2011
- 2013 - Performance Optimization Guidelines and the GPU Architecture behind them
- 2015 - Life of a triangle - NVIDIA's logical pipeline
- 2015 - Render Hell 2.0
- 2016 - How bad are small triangles on GPU and why?
- 2017 - GPU Performance for Game Artists
- 2019 - Understanding the anatomy of GPUs using Pokémon
| // | |
| // C++ implementaion of "A simple method to construct isotropic quasirandom blue | |
| // noise point sequences" | |
| // | |
| // http://extremelearning.com.au/a-simple-method-to-construct-isotropic-quasirandom-blue-noise-point-sequences/ | |
| // | |
| // Assume 0 <= x | |
| static double myfmod(double x) { return x - std::floor(x); } |
| auto world = GetWorld(); | |
| if(world == nullptr) | |
| return; | |
| auto viewLocations = world->ViewLocationsRenderedLastFrame; | |
| if(viewLocations.Num() == 0) | |
| return; | |
| FVector camLocation = viewLocations[0]; |
For particularly necessary to-do reminders, the JM_TODO macro below will print to the build console (and on the warning/error list) as a trivial warning -- so it won't interfere with builds that treat warnings as errrors. Then you can just double-click it and jump to that spot.
#define JM_PRAGMA_STRING2(x) #x
#define JM_PRAGMA_STRING(x) JM_PRAGMA_STRING2(x)| // Comments are left by me, not from the code. | |
| // Because why not have a default set or make the method abstract or, really, anything but this. Luckily no one would ever | |
| // think to use ::GetMaxSpeed as a divisor or anything. | |
| inline float UMovementComponent::GetMaxSpeed() const | |
| { | |
| return 0.f; | |
| } | |
| // FUN FACT: UMovementComponent defines a plethora of methods for managing the maximum speed of a component. It does not, |
| // NOTE: This does not result in the accessors being available for blueprint-use as they're not UFUNCTIONs. | |
| UCLASS( ) | |
| class URawr : public UObject | |
| { | |
| GENERATED_CLASS( ) | |
| protected: | |
| float RawrValue; | |
| // Generally, developers in UE4 tend towards the following convention for enumerations: | |
| UENUM( BlueprintType ) | |
| enum class ENoiseGeneratorCellularType : uint8 | |
| { | |
| NGCT_Natural UMETA( DisplayName = "Natural" ), | |
| NGCT_Euclidean UMETA( DisplayName = "Euclidean" ), | |
| NGCT_Manhattan UMETA( DisplayName = "Manhattan" ), | |
| NGCT_Max UMETA( Hidden ) | |
| }; |
