Jump to content
  • Advertisement


  • Content count

  • Joined

  • Last visited

Community Reputation

150 Neutral

About JustChris

  • Rank

Personal Information

  • Interests


  • Github

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Thanks for the additional advice, everyone. My contract officially ended this week so now it's on to do the job hunt full-time. I have filled a specific role for the game development work that most other people didn't cover, and there were no real complaints about my work ethic or productivity. Everyone was working remotely but we had a good idea of what we were supposed to do. I worked on the company's first and only game, and came in relatively late in the process, (game was roughly 4 years in development) so mostly a lot of "polish" and code refactoring. Making things run just more smoothly while otherwise avoiding to break any existing features. A specific example is making mesh regeneration of the landscape much more efficient because it was one of the most CPU bound tasks. Occasionally I would make improvements to the UI logic, based on user feedback and testing. More recently I have mentioned opportunities to my former boss to work with him in the future in other things, or to use him as a job reference, but he's been more quiet and reserved about that. I'm not sure if he even saw my invitation to connect on LinkedIn and just ignored it. Going to follow-up with him though, after getting the official written notice for my contract termination. I am not familiar with the distinction between indie and "small studio"... from my POV, all small studios that don't have financial backing by a publisher are indie. I'm also pretty selective when it comes to AAA, there's only a handful of larger companies I'd be interested in applying to, so I'm not carpet-spamming my resume to a bunch of places. However, I do know how it is first-hand what it's like working in relatively unstable jobs without a lot of experience, in places with high turnover (and the financial hardships that come with it). Whether it was in a early-stage startup, mom & pop business or website agency. In fact, I never worked for a company that many would consider stable or "enterprisey". I live in Chicago and its gaming industry is smaller compared to major hubs. So I'm just looking at directories to see what I have missed. But if I can't find a local place hiring relative newcomers, I am also open to relocation.
  2. Will do. I've been doing some good contributions so far. I came late into the game dev process so it's more of "polish" and optimization work at the moment but may work on adding to general game features at some point. The lead programmer also has some good credentials outside of game dev so I'm hoping he could recommend or refer me to other jobs. Also as far as balance with another job, yeah, that's a good point especially if you're trying to manage time with another remote job. Part-time programmer jobs are already far and few, and guess it's not gonna be easy to find a complement, unless I take a small freelance gig, perhaps.
  3. My professional background has been in web development since I graduated with a multimedia art degree 8 years ago. I typically do LAMP stack work and JavaScript working on anything from SaaS applications to doing front-end work for e-Commerce websites. In my free time, though, I was working on non-web projects, including small games, as a hobby, using C# and C++. I've dabbled in that stuff as far as 10 years ago. I got very into graphics programming in particular. From a recent long job search, I was curious and started browsing remote job classifieds. I applied to a job listing from an indie company. My projects got their attention and I got a part-time contract job (it's also a remote job so no meetings in person). Compared to most of my previous job hunt- many failed phone screens and interviews for web dev roles- this job came almost effortlessly as my projects were very effective in speaking for my potential on what I can do. It's quite the pivot from my previous jobs and I'm curious to take it further. How should I take advantage of this as a stepping stone if I want to push further ahead into game programming? And how possible is it to work a second part-time programming job that can complement my current one? I'm a month into my current contract and expected to last at least two more months. When it ends, I will also be open to working on-site, for either AAA studios or indie.
  4. JustChris

    I'm new and need advice

    The problem with C++ is that it's so versatile and flexible but on the other hand there's not too much hand-holding for writing components or systems for your larger programs. The ways in which you can use and how you should use C++ is overwhelming- especially now with the C++11 standard which even I'm not familiar with (I have diverged to C# for now). Making simple console programs is easy enough with it, but anything non-trivial will be a lot harder to make with the language. I would suggest C# as well, and it also has a good selection of libraries and frameworks for creating games. With OpenTK it is possible to use OpenGL with C#.
  5. JustChris


    Carmack made a point on something I was also about to mention. It has been the trend for many companies to introduce subscription-based programs with free games, or purchase a digital download, essentially meaning you do not truly own the game. In short, more games are being distributed under a SaaS model and it seems to be the future for gaming, at least those that use an online component.
  6. JustChris

    Time lens can make events invisible. (no not joking)

    Essentially, what they have seemed to have done is that, for a very short moment, make recorded events happen with a similar effect as if the events took place at a much farther distance. When we see a star exploding as a supernova 800 light years away, the distance of the star means that the event happened at least 800 years ago. Unless I understand wrong, because with that example, you still see the event, but it was just delayed from our point of view. I especially don't get the part where they "speed up" the light beam to complement the slow down.
  7. I made changes to my first post and added pseudo-code to hopefully make the problem clearer.
  8. I've only written .obj loader for handling 3 or 4-sided polygons, nothing more, but meshes with polygons more than four sides are rare so it has worked for me. Here's what you have to do to handle 4-sided polygons as triangle lists. In your face-reading routine (that is, where you start adding nodes) count ahead to see if there are exactly 4 integer groups separated by spaces, that's when you know you have a 4 sided poly. Then read ahead and store these values into separate 4-sized arrays and add SIX vertices for the face, as two triangles resulting from splitting up the quad. Basically what you have now is this: for each line - split line by spaces - if line has 3 number groups --- for each number group ----- add vertex index ----- add UV index ----- add normal index --- form a triangle with the three groups of indices - go to next line You would want to change your method to something like this: for each line - if line has 3 number groups --- use a polygon index array { 0, 1, 2 } - if line has 4 number groups --- use a polygon index array { 0, 2, 3, 1, 2, 3 } // this set of numbers will vary - for each index in array --- add vertex index for this number --- add UV index for this number --- add normal index for this number --- if we are in the third or sixth index in the array ----- form a triangle with the three groups of indices - go to next line The reason why the set of numbers may vary for 4 sided polygons is because you have to know where the winding order is, and how the triangles should be faced. If for instance we had a square with vertices 0, 1, 2, 3 starting from the top left and going clockwise, we can divide it in the diagonal from 0 to 2 to get 0, 2, 3, 1, 2, 3. But if we were to divide the quad along the 1-3 diagonal, then our list may be 0, 1, 3, 1, 2, 3. I had to guess which way was the right order for the quads, but you can get it in one or two tries if you know how the triangles should face.
  9. JustChris

    If you could make any game you wanted...

    Honestly not much in terms of game size and scope. I do want to see a futuristic racer akin to WipEout on the Xbox 360 and maybe someday I can make it happen on XBLIG. On that note there aren't really too many flight-based racing games. Whether planes or spaceships though I prefer the latter. Other than that, I have the idea of a setting for a single-player or multi-player RPG with its story somewhat grounded in reality and speculation of the future. Basically the world takes place a few centuries after the "Great Energy Wars", which wrecked the planet and almost all of its people. All cheap and expendable energy sources are basically exhausted and most people are living in pre-Industrial era and lifestyle. But there are still pockets of advanced technological communities run by greedy tycoons that have tapped into an undisclosed energy source, but refuse to share with the commoners.
  10. So moving forward with my shadow mapping system that is described in this topic, I ran across a serious performance problem. The technique used to create shadow maps itself is standard shadow mapping with an optional PCF or manual linear filter- nothing out of the ordinary. What's different about it from most other implementations is that each object has its own render in a depth map, placed in a texture atlas. These renders are projected and combined in the final image. Why I chose to do this is because I get some high quality models with less pixels wasted in the depth map renders- I can get sharp edges on most objects with lower resolutions, plus there is no texture swimming at all. But with the current way I am drawing the projected shadows, this becomes very slow with even just a few dozen shadow casters on the screen. Imagine a small orthographic projection on each object. Each shadow caster has its own view matrix. Shadows are accumulated by passing each object's shadow map and projection with the view matrix. I clear a render target to Transparent and every pixel that is shadowed is set to white, because I want to take advantage of the Additive blendstate to add up all the shadowed areas (AlphaBlend works just the same but Additive makes more sense). When all shadows are added up this render target texture is inverted and multiplied with the lighting output. In my first approach looping over the shadow casters draws a full screen quad for each shadow to be accumulated in the render target, and this is the primary cause of slowdown. There is a major flaw to this approach. It is definitely fill-rate bound- too many additive passes with full-screen quads makes the program chug at a slow framerate. Drawing one quad is no problem- drawing at least 20 brought down my framerate to under 15, whereas I'd have a rate of at least 100 without shadows. I used batching to reduce this problem, it reduces the number of times a quad must be drawn but I still get noticeable slowdown with many objects. My preferred optimization is if I can somehow draw just one quad to blend all the shadows in one step. Can this be done? My shadow mapping algorithm on a high level looks like this: // drawing shadow map set render target 1 assign common shader parameters for each shadow caster - get the bounding box for this object - compute bounding frustum to fit this box, oriented from the angle of the directional light - restrict viewport to render to a part of the texture - draw the shadow caster end for each // drawing occlusion of shadows set render target 2 assign common shader parameters use additive blending state set batch count to 0 for each shadow caster - get the bounding box for this object - compute bounding frustum to get view matrix from the light - add view matrix to a matrix array - calculate texture mapping offset for this object and add this to another array - increment batch count by 1 - if batch count == maximum batch size --- set matrix and texture offset parameters to the shader --- apply pass and render a full-screen quad --- reset batch count to 0 end for each if batch count > 0 (we have a remainder of objects) - apply the same steps used as in if batch count == max batch size I would really prefer to render all the shadows with just one quad, and know for certain that the main bottleneck is in drawing too many screen-spaced quads, because as a test I made the quads 1/5 of the full screen size and the framerate jumped back up. Z-fighting is not the issue, as giving each quad a different Z-depth produced the same results in performance.
  11. I like using AMD's GPU ShaderAnalyzer. It compiles for several types of shader models, and also produces assembly code made for different graphics cards. Being an AMD product, these code outputs are for AMD/ATI cards only, but you don't need AMD hardware to use the editor.
  12. JustChris

    Your most memorable childhood game?

    Oh, I can't forget GoldenEye for the N64. Great gameplay, multiplayer never got boring. Now I gotta try the Source Engine remake...
  13. Screen-Space Ambient Occlusion seems to be the preferred choice for most developers, probably because it's straightforward to apply to existing rendering frameworks, and it is not at the mercy of the geometric complexity of the scene. Hence, why it's done in screen space and not world space. The prerequisites are that you need at least a depth map, and usually a normal map, which is available through deferred rendering. Out of all the examples I have found, this article has the easiest to understand explanation and tutorial I have read about SSAO. It briefly covers the "Crysis approach" which is the pioneer of the SSAO technique, and then explains a modified version of that for better looking ambient occlusion maps.
  14. JustChris


    I've decided to skip the internship part and apply for an entry-level job when I'm ready. Skipping recruiters as well, but I just found this one by chance in a jobs forum. I do know how to program in C++ and have made some smallish projects using APIs such as Direct3D and SDL. So I will try to flesh out the projects that I feel are more worth showing. One job I looked at has a programming test that includes writing and running a program, and that's something I'm going to try out. But since this program alone is about 90% of the work involved for the entire test anyways, I'm assuming this in particular is how they are trying to pick out the best candidates.
  15. I might have found the cause of my shadow mapping problem. (Edit: I tried it out and this was in fact the problem.) Basically, with most objects the mini-frustum (the light blue diamond in the diagram) that encloses its bounding box is so small that part or all of the shadow falls outside of it. That is, the shadow receiver isn't completely in front of the far plane of the mini-frustum from the light's POV, so it has no depth information to compare it against, making it always zero and so this portion is completely dark. The red portion in the diagram is likely the part of the shadow that gets cut away. Being that the frustum is box shaped, the projection in the red area appears as a dark box on the surface that it hits. This is a non-issue for most shadow mapping techniques because the bounding volume used to create the frustum is usually the camera view's frustum which contains everything that's visible, so you won't see this box artifact as it falls beyond the clipping range of the camera. So from this, I can assume that the longer shadows and shadows that are projected farther away in relation to the casting object will have a larger darkened area like this. That definitely seems to be the case when I tested shadows with various objects, as pillars have more of their shadows obscured. Objects that will have more problems are taller, skinny objects and surfaces receiving shadows that are almost parallel to the angle of the light. This is probably why enlarging the frustum reduced the problem, because it puts more of the projected shadow in the frustum's view. It was a solution, but not the best one. All that's needed to do is to push the far clipping plane of the mini-frustum much farther away. The good news is that this won't reduce the shadow map quality in resolution. Also, I know this post feels like an article, responding to myself, but someone else might be wondering how to solve this as well.
  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!