[HN Gopher] 3D Game Shaders for Beginners ___________________________________________________________________ 3D Game Shaders for Beginners Author : ingve Score : 225 points Date : 2021-04-25 09:08 UTC (13 hours ago) (HTM) web link (github.com) (TXT) w3m dump (github.com) | Agentlien wrote: | For anyone really wanting to learn computer graphics in depth I | recommend the book Real-Time Rendering[0] | | A great way to explore, play around with, and share shaders is | Shader Toy[1] | | [0] https://www.realtimerendering.com/ | | [1] https://www.shadertoy.com/ | sneeuwpopsneeuw wrote: | I can recommend this very much. Together with | https://learnopengl.com/ I learned most I know about graphics. | | The same thread in 2019: | https://news.ycombinator.com/item?id=19895218 | forgotpwd16 wrote: | LeanOpenGL is what I used my first time around OpenGL. Truly a | great resource for someone to learn. | ggambetta wrote: | For a gentle introduction to the theory behind all this, you | might want to check out my book Computer Graphics from Scratch | (https://gabrielgambetta.com/computer-graphics-from-scratch). | Freely available online! | forgotpwd16 wrote: | Why they pushed a new repo (one commit), or they've always | updated like that? | tvb12 wrote: | Is learning OpenGL pretty much inevitable as a precursor to | learning Vulkan? | | The main page of Khronos' beginner's guide to Vulkan has a quote | which says "emphatically... NO", but then the first tutorial in | the list gives as a prerequisite "some existing experience with | 3D computer graphics" and links to a guide | (https://paroj.github.io/gltut/) which teaches OpenGL. | dagmx wrote: | OpenGL is a lot easier to learn. It's not a pre requisite, but | Vulkan is definitely the deep end of shader programming. | | Honestly if platform is not an issue, I'd recommend people | start with Metal because it's the easiest of the "modern" | graphics APIs. DirectX 12 is probably second and Vulkan is | probably among the hardest to start with. | | WebGL is also a good way to start though is obviously more | limited. | | Or start with shader graphs in unreal or unity. You can still | learn the shader logic and math without worrying about setting | up a render context and learning to "code" | bsder wrote: | > Is learning OpenGL pretty much inevitable as a precursor to | learning Vulkan? | | Well, maybe not OpenGL, but almost surely _some_ graphics API | which allows you to do graphics without a couple thousand lines | of obscure boilerplate. | | There are lots of "middleware" systems built on Vulkan that are | _WAY_ friendlier than raw Vulkan. They handle things like asset | loading, memory management, and scene composition for you. If | you want to build something, use those. You 'll be _vastly_ | happier at the end of the day. Maybe at some point you 'll hit | a performance bottleneck--fine, but by then you know a lot more | about graphics. | | If you're doing raw Vulkan, you should have a darn good idea as | to your purpose. | | If someone says: "I want to use Vulkan." I ask "Why?" | | If they say: "Because I want to make a thing that does <X>." | then they absolutely should be in a middleware system and not | Vulkan. They'll get something on the screen much faster and | keep their motivation going. | | If they say: "Because I want to learn" I have to try to | redirect them to something a lot simpler. Learning is about | motivation and Vulkan boilerplate saps your motivation _really_ | hard. | | It also doesn't help that Vulkan development is basically C++ | and Windows and there is no negotiating this as a beginner. | Trying to develop Vulkan through a language wrapper or on | Linux/OS X adds an unnecessary amount of pain to the process-- | quadruply so if the wrapper tries to be "idiomatic" in your | language of choice. | | If they say: "Well, we found a bottleneck using RenderDoc and | we..." then I ... HA! I'm kidding. Nobody says this because | they _KNOW_ why they need to use Vulkan so they don 't even ask | me. | | The primary problem with Vulkan is that you are mapping | _REALLY_ closely to the underlying hardware. If you don 't | understand what the pieces of your graphics card are and what | they are doing and why, Vulkan makes very little overarching | sense. | | One thing I will warn you about when programming Vulkan, you | better be _really_ good in your programming language of choice. | There are times when you are writing Vulkan code where you have | to add a couple hundred lines of code before you can finally | test that you got it right. You have to be very confident in | your programming skill that you got all the essential things in | your language right so that any bug is really in the way you | are using Vulkan. For example, if your understanding of | pointers and pointers-to-pointers isn 't rock solid, you're | gonna have a bad time. | | However, if you still wish to persist. Here is a class at | Oregon State that does Vulkan: | http://web.engr.oregonstate.edu/~mjb/vulkan/ | | Note that this is considered an upper division/graduate class. | That should give you an idea of what you're in for. | datalus wrote: | In my opinion, yes you should probably learn a higher level api | than Vulkan first like DX11 or OpenGL if you have no | experience. This is also still important for 2D, creating a | simple textured quad in Vulkan is at least one order of | magnitude more complicated/verbose than the higher level | mentioned apis. | | In Vulkan, you're going to be manually describing to the GPU | every last atom of your graphics pipeline. You also need to | worry about how it's all laid out in memory through a bunch of | descriptor objects that you're building in tandem. Then there's | syncing between the GPU and CPU via semaphores etc to transfer | data, which can be error prone and hard to debug. This results | in very verbose and hard to read code. If you've never touched | a graphics api before, I think frustration starts to mount and | you'd be more likely to just give up. The upside is you have | total control over how the GPU interprets and executes your | workload (most likely a triangle as a beginner :P) | | Anyway, a lot of this is hidden away in DX11 or OpenGL, you | call a few functions here and there and it will do all of these | lower level concerns for you. I think once you get used to the | jargon and feel of apis like these, you can then start to see | how Vulkan or a similar low level api would fill in between the | higher level procedures/objects. | | Edit: For any graphics api, imo, if you're concerned about | building a game you'd probably also not want to touch those | apis directly from game code. In DX11 or OpenGL it's not too | hard to wrap that up in a bit higher abstraction but in Vulkan | you'd almost first want to wrap Vulkan into an api that can be | used without writing a ton of manual setup and then use that | api to write a higher level, more game appropriate abstraction | to call from the game's code. (usually done as part of an | engine/framework) | | Edit 2: Having said all of this, you could ignore all of the | nitty/gritty details and just copy paste the code from the | tutorials and make a workable api for yourself to try to | understand. Up to you and how you like to learn. | exacube wrote: | Or DirectX. Mostly, I think the expectation is that folks won't | handwrite vulkan, they'll use a higherlevel API, like a game | engine's API. | pjmlp wrote: | Nowadays, unless one intends to become a graphics engine | developer, using middleware is a much better option than | sticking with a specific 3D API. | Jasper_ wrote: | I'd rather suggest that people learn D3D11 first, if they can, | instead of Vulkan. The OpenGL programming model has a lot of | backwards ideas that can make graphics seem far more | complicated than it is. Vulkan removes those and gets closer to | the D3D11 style, but it also introduces a lot of more | complicated ideas. Learning the whole gamut at once is a | challenge. | | There are other options to get started with graphics. | Frameworks you can use to start putting your toes in the water: | any game engine, a higher-level graphics framework like raylib | or bgfx, or a cross-platform graphics layer like WebGPU/wgpu. | | I don't want to gatekeep, just being realistic that if you're | new to graphics in general, Vulkan might not be the best place | to start. You'll get there eventually though. | anchpop wrote: | If they want to use Rust, wgpu-rs is basically a simpler and | memory-safe version of the Vulkan API. Obviously the overhead | will be unacceptable for some use-cases, but it's a good way | of learning the core concepts of Vulkan and 3D rendering in | general ___________________________________________________________________ (page generated 2021-04-25 23:00 UTC)