How to become a graphics programmer in the games industry
- Check out the excellent #AltDevBlog article “So you want to be a Graphics Programmer” by Keith Judge
- Read " Real-Time Rendering (Third Edition)"
- Refresh your math with the book "3D Math Primer for Graphics and Game Development"
- Calculate the intersection between a ray and a sphere (on a piece of paper!)
- Program a ray-tracer
- Implement a SIGGRAPH paper
- Use PIX to debug and optimize your demo
- Write an article about your experience writing the demo
- Check out what fellow Graphics Programmers are excited about
As we were recently hiring a new Graphics Programmer at work I had to identify what kind of technical knowledge and skills we would expect from a potential candidate. Although this definition will be somewhat specific to what we look for in a candidate, it might still be of interest to other coders trying to score a job in the industry as a Rendering Engineer.
최근에 새로운 그래픽스 프로그래머를 고용할 때 우리가 잠재적인 후보자로 부터 기대하는 기술적인 지식과 스킬을 가지고 있는가를 확인해야만 했다. 비록 이 정의가 한명의 후보자에게서 우리가 찾고자 하는 특정의 어떤것이기는 하지만 렌더링 엔지니어로써 산업에서 하나의 직업으로 점수를 얻고자 하는 다른 코더들에게도 흥미로울 것 이다.
This post might help you to identify areas to learn about in order to get you closer to your goal of becoming a Graphics Engineer, whether you just finished your degree or perhaps have been working in the games industry in a different role. Alternately, if you are a seasoned Rendering Programmer, then you know all of this stuff and I would love to hear your comments on the topic.
이 포스트는 당신이 막 학위를 마쳤든 아니면 다른 직업 군으로 게임 산업에서 일을 하고 있는 중이든 그래픽스 엔지니어가 되려는 당신의 목표에 더 가까워 지기 위해서 배워야 하는 영역을 배우는데 도움을줄 것이다. 반대로, 만약 당신이 숙련된 렌더링 프로그래머라면 당신은 이 내용의 모든 부분을 알 것이고 이 주제에 대해서 당신의 코멘트를 듣고 싶다.
Know the Hardware
Learning about the strengths and weaknesses of the hardware that will execute your code should be important for any programmer, but it's an essential skill for a Graphics Engineer. Making your game look beautiful is important; getting all of the fancy effects to run at target frame rate is often the trickier part.
당신의 코드가 실행되는 하드웨어의 장점과 단점에 대해서 배우는 것은 어떤 프로그래머에게도 중요하지만 그래픽스 엔지니어에게는 필수적인 스킬이다. 당신의 게임을 아름답게 보이도록 만드는 것은 중요하다. 환상적인 이펙트들을 타겟 프레임 레이트에 모두 실행시키는 것은 보통 트릭키한 부분이다.
Of course, it would be unrealistic to expect you to know every little detail about the underlying hardware (especially if you are just starting out) but having a good high-level understanding of what is involved to make a 3D model appear on screen is a mandatory skill, in my opinion. A candidate should definitely know about the common GPU pipeline stages (e.g. vertex- and pixel-shader, rasterizer, etc.), what their functionality is and whether or not they are programmable, configurable or fixed.
물론 하드웨어 기초를 이루는 부분에 대해 모든 작은 디테일까지 당신이 안다고 기대하는것(특히 만약당신이 이제 막 시작한 사람이라면)은 비현실적이지만, 내 생각으로는 화면에 하나의 3D 모델이 표시되는데 연관된 것들에 대해 훌륭한 고수준의 이해는 꼭 필요한 스킬이다. 후보자들은 공통의 GPU 파이프라인 스테이지(예를 들어 버텍스, 픽셀 쉐이더, 레스터라이져 등등)에 대해서 그것들의 기능이 무엇이고프로그래밍 가능한지, 설정이 가능한지, 고정된건지를 분명하게 알아야만 한다.
Very often, there are many ways to implement a rendering effect, so it’s important to know which solution will work best on a given target device. Nothing is worse than having to tell the artists that they will have to modify all of the existing assets, because the GPU doesn’t support a necessary feature very well.
때때로, 렌더링 이팩트를 구현하는 방법은 많이 있어서 주어진 타겟 디바이스에서 가장 잘 동작하는 솔루션이 무엇인지 아는 것이 중요하다. 아티스트들에게 GPU가 필요한 기능을 잘 지원해주지 않기 때문에 존재하는 어셋들의 모두를 수정해야만 한다 라고 말해야 하는 것 보다 최악인 것은 없다.
For example, the game that I am currently working on is targeting desktop computers as well as mobile devices, which is important because mobile GPUs have very different performance characteristics compared to their desktop counterparts (check out my 5 minute micro talk on this topic if you are interested). Our team took this difference into account when making decisions about the scene complexity and what kind of effects we would be able to draw.
예를 들어, 내가 현재 작업중인 게임은 데스크탑 컴퓨터를 타겟으로 하고 있고 또한 모바일 디바이스를 타겟으로 하고 있다. 모바일 디바이스는 데스크탑에 있는 부분과 비교하여 매우 다른 퍼포먼스 특성을가지고 있는 모바일 GPU 때문에 중요하다. (만약 관심이 있다면 이 토픽에 대해서 나의 5분 마이크로 토크를 확인해봐라) 우리 팀은 씬의 복잡도와 우리가 그릴 수 있는 이펙트들의 종류를 결정할 때 이 차이점을 고려했다.
A great way to learn more about GPUs is to read chapter 18 of Real-Time Rendering (Third Edition), because it contains an excellent overview of the Xbox 360, Playstation 3 and Mali (mobile) rendering architectures.
GPU에 대해서 더 많은 것을 배우는 좋은 방법은 Real-Time Rendering (3rd)의 18번째 챕터를 읽는 것이다. 왜냐하면 여기에 Xbox 360, PS3, Mali (모바일) 렌더링 아키텍쳐의 훌륭한 오버뷰를 포함하고 있기때문이다.
Good Math Skills
Extensive knowledge of trigonometry, linear algebra and even calculus is very important for a Graphics Programmer, since a lot of the day to day work involves dealing with math problems of varying complexities.
나날이 가지각색의 복잡한 수학적 문제들을 다루는 것을 포함한 업무를 하기 때문에 삼각법, 선형대수학, 심지어 미적분의 해박한 지식은 그래픽스 프로그래머에게 매우 중요하다.
I certainly expect a candidate to know about the dot and cross products and why they are very useful in computer graphics. In addition to that, it is essential to have an intuitive understanding for the contents of a matrix, because debugging a rendering problem can make it necessary to manually ‘decompose’ a matrix in order to identify incorrect values. For example, not that long ago I had to fix a problem in our animation system and was able to identify the source of the problem purely by looking at the joint matrices.
나는 내적과 외적에 대해 알고 그것들이 왜 컴퓨터 그래픽스에서 매우 유용한지를 아는 후보자를 기대한다. 추가적으로 행렬 개념에 대해 직관적인 이해를 가진 것은 필수다. 왜냐하면 렌더링 문제의 디버깅은올바르지 않은 값을 식별하기 위해서 행렬을 수동적으로 분해하는 것을 필요로 할 수 있기 때문이다. 예를 들어, 얼마전에 우리 애니메이션 시스템의 문제를 해결해야만 했고 조인트 행렬을 살펴 보는 것으로문제의 근원을 찾을 수 있었다.
In my opinion, a candidate should be able to analytically calculate the intersection between a ray and a plane. Also, given an incident vector and a normal, I would expect every Rendering Engineer to be able to easily derive the reflected vector.
내 생각에는 후보자는 광선과 평면 사이의 충돌을 분석적으로 계산할 수 있어야만 한다. 또한 입사 벡터와 노말이 주어졌을 때, 나는 모든 렌더링 엔지니어들이 쉽게 반사 벡터를 구할 수 있다고 기대한다.
There are plenty of resources available on the web. You can find some good resources here. The book "3D Math Primer for Graphics and Game Development" does a great job explaining a lot of the fundamentals like vectors, matrices and quaternions to name just a few topics. I would also strongly recommend attempting to solve some of these problems on a piece of paper instead of looking at a preexisting solution. It’s actually kind of fun, so you should definitely give it a try.
웹상에 유용한 리소스들이 많이 있다. 당신은 여기서 몇몇개의 좋은 리소스들을 찾을 수 있을 것이다. 3D Math Primer for Graphics and Game Development 책은 몇가지 예를 들어 벡터, 행렬, 쿼터니언과 같은 많은 기초들에 대해 멋지게 설명해준다. 나는 또한 기존의 해답을 보는 대신에 종이에 이 문제들 일부를 풀어보기를 강력하게 추천한다. 이것은 실제로 재밌기도 하고 분명히 한번 해봐야 한다.
Passion for Computer Graphics
An ideal candidate will keep up to date with the latest developments in computer graphics especially since the field is constantly and rapidly advancing (just compare the visual fidelity of games made 10 years ago with what is possible today).
이상적인 후보자는 특히 끊임없이 빠르게 발전하는 분야이기 때문에 최신의 컴퓨터 그래픽스 개발에 대해 최신 트렌드를 유지할 것이다. (단지 10년전 게임과 오늘날 할 수 있는 것들의 비주얼적인 정확함을비교해보라.)
There are plenty of fascinating research papers (e.g. current SIGGRAPH publications), developer talks (e.g. GDC presentations) and technical blogs available on the internet, so it should be pretty easy to find something that interests you. Make sure to check out the blogs of fellow Rendering Engineers for some really inspiring articles!
매혹적인 논문들(예를 들어 최근 씨그래프에서 발행)과 개발자들의 발표(예를 들어 GDC 발표) 그리고인터넷 상에 유용한 기술적 블로그들이 많이 있다. 당신이 관심있어 하는 어떤 것이든 꽤 쉽게 찾을 수있다. 이 몇몇개의 정말 감명 깊은 아티클들을 위해 렌더링 엔지니어 동료들의 블로그들을 확인해 봐라.
Of course implementing an algorithm is the best way to learn about it, plus it gives you something to talk about in an interview. Writing a cool graphics demo also helps you to practice your skills and most of all it is a lot of fun.
물론 알고리즘을 구현하는것은 그것을 배우는 가장 좋은 방법이다. 추가로 면접때 이것에 대해 말할거리도 준다. 멋진 그래픽스 데모를 작성하는 것은 또한 당신의 스킬을 연습하는데 도움을 주고 무엇보다도 재밌다.
If you want to maximize your chances of getting a job make sure to spend some time making your demo look pretty. You may have implemented the most efficient tessellation algorithm, but if people can't see what's going on they might not be as impressed as they should be. Creating visually pleasing images is a big part of the profession, so it's generally a good idea to show that you have this skill as well.
만약 취직의 기회를 최대로 높이길 원한다면 당신의 데모가 예뻐 보이도록 만드는데 시간을 더 사용해야만 한다. 당신이 가장 효과적인 테셀레이션 알고리즘을 구현했지만 만약 사람들이 무슨 일인지 알지 못한다면 감명을 받았어야 할 만큼 받지 못할 것이다. 시각적으로 만족을 주는 이미지를 만드는 것은 프로의 한 큰 부분이고 또한 일반적으로 당신이 가진 스킬을 보여주는 좋은 아이디어다.
Performance Analysis and Optimization
One of the responsibilities of a Graphics Programmer is to profile the game in order to identify and remove rendering related bottlenecks. If you are just starting out I wouldn’t necessarily expect you to have a lot of practical experience in this area, but you should definitely know the difference between being CPU and GPU bound.
그래픽스 프로그래머의 책임중 하나는 렌더링과 관련된 보틀넥을 찾고 없애기 위해서 게임을 프로파일링 하는 것이다. 만약 당신이 막 시작하는 사람이라면 당신이 이 분야에서 많은 실용적인 경험을 가지는게 필수라고 기대하지는 않는다. 하지만 CPU와 GPU 바운드 사이의 차이점을 분명하게 알아야만 한다.
An ideal candidate will have used at least one graphics analysis tool like PIX (part of the DirectX SDK), gDEBugger or Intel’s GPA. These applications are available for free allowing you to take a closer look at what’s going on inside of a GPU, isolate bugs (e.g. incorrect render-state when drawing geometry) and identify performance problems (e.g. texture stalls, slow shaders, etc.)
이상적인 후보자는 적어도 하나의 PIX(DirectX SDK에 포함되어 있음), gDEBugger, Intel's GPA 같은 그래픽스 분석 툴을 사용할 수 있을 것이다. 이 어플리케이션들은 무료로 GPU 내부가 어떻게 동작하는지더 가까이 볼 수 있도록 해주고 버그들을 격리 시키고 (예를들어 지오메트리를 그릴 때 잘못된 렌더 스테이트) 퍼포먼스 문제(텍스쳐 스톨, 느린 쉐이더 등등)를 식별할 수 있게 해준다.
Conclusion
The job of a Graphics Programmer is pretty awesome since you’ll be directly involved with the visual appearance of a product. The look of a game is very often the first thing a player will know about it (e.g. trailers, screenshots) which has been very gratifying for me personally.
그래픽스 프로그래머의 잡은 제품의 시각적 외향에 직접적으로 참여하게 되면 꽤 멋지다. 게임의 외형은 때때로 플레이어에게 개인적으로 나에게 매우 기쁨을 준다는 것에 대해 처음으로 알게 해준다. (예를들어 트레일러나 스크린샷)
Truth be told, you won’t be able to write fancy shaders every day. You should be prepared to work on other tasks such as: data compression (e.g. textures, meshes, animations), mathematical and geometry problems (e.g. culling, intersection computations) as well as plenty of profiling and optimizations. Especially, the latter task can be very challenging since the GPU and the associated driver cannot be modified.
사실대로 말하자면 당신은 매일 환상적인 쉐이더를 작성할 수는 없다. 당신은 데이터 압축 (예를들어 텍스쳐, 메쉬, 애니메이션), 수학적이고 기하학적인 문제들(컬링, 충돌 계산), 또한 많은 프로파일링과 최적화와 같은 다른 작업들도 할 준비가 되어 있어야만 한다. 특히 후자의 일이 GPU와 관련된 드라이버들은수정할 수 없기 때문에 매우 도전적일 수 있다.
To sum up, becoming Rendering Engineer requires a lot of expert knowledge, and it is certainly not the easiest way to get a foot in the proverbial games industry door, but if you are passionate about computer graphics it might be the right place for you!
요약하자면 렌더링 엔지니어가 되는 것은 많은 전문적인 지식이 필요하고 유명한 게임업계의 문안에 발을 들이는 가장 쉬운 방법은 분명하게 없다. 하지만 만약 당신이 컴퓨터 그래픽스에 대해 갈망을 가지고있다면 그것이 당신을 올바른 위치에 있게 할 것이다.
The Beginner's Checklist
'Goal > Goal in Life' 카테고리의 다른 글
여태까지를 써 볼까... (0) | 2014.04.29 |
---|---|
My Lecture - 목록 정리 (0) | 2014.03.10 |
만약 네가 그래픽스 프로그래머가 되고자 한다면... (0) | 2010.11.29 |