This is it. This is the best thing available to me on the internet. t.co/vW9p6k3t6A (Yesterday)

@TommyRefenes @TomFulp back when you had to run a WinNuke protection program whenever you went online (2 days ago)

@rabbit_nabokov its no problem just take water and add gravity (2 days ago)

@floatvoid da fuek is that all about. I guess I don't notice this happening when I use render textures as maps for displacement? (2 days ago)

When using a render texture to control my color grading shader... it interprets the texture upside down? So I'll just use ScaleY = -1 #magic (2 days ago)

@infinite_ammo Did you know that 1 out of 10 cameras will reset your game data? (3 days ago)

@Silvanis_s play with math formulas until you finally google the right thing to find out someone already figured it out in a much better way (3 days ago)

@DrewFitz whaaaaa what is that? :O (3 days ago)

@Silvanis_s it's magic even when writing shaders (3 days ago)

good times with a color grading shader t.co/e43rKm0WTU yahoooo (3 days ago)

Making a game engine/framework is actually not too bad until you get to TEXT RENDERING AAUGHuihaisgha (3 days ago)

@celsiusgs @hippiemanx @TeaRascal that is the sound of a nostalgia bomb going off in the distance (3 days ago)

@celsiusgs @TeaRascal if you say ridge racer, riiiiiiidge racer 5 times while in front of a mirror kaz hirai appears (3 days ago)

@celsiusgs Submitted for the approval of the midnight society... I call this story... we're getting old. (3 days ago)

@MANvsGAME Did you show up for the first day of filming and forget your pants? (3 days ago)

@celsiusgs aauaghguiaghh shuuuuuut uuuuuupp (3 days ago)

@Demruth I love how they can't sell these pictures anymore because everyone just cell phone photos them from the screens. (3 days ago)

@kaylasara @Demruth Go to Disney World in January, that was pretty much the scenario I had last year! (3 days ago)

@kaylasara @Demruth or my spine being super compressed (4 days ago)

@MattThorson Ole Bonehands (4 days ago)

follow
search

2014 - 10 - 15 / 4:25 pm / general

Dev Log: Color Grading Shader

Dev Log: Color Grading Shader

I love post processing shaders! I think they're one of my favorite things to mess with now that I have a cool C# game making framework to play around with. One of my latest experiments was implementing color grading into Stratoforce, and by extension all of my future games built with Otter.

What's color grading? Basically you have a texture that contains every single color possible on it. This texture is usually referred to as a Look Up Table, or LUT. When your texture, or your game, or whatever goes to render itself, the shader can remap all of its colors to the colors on the LUT texture.

Check out these links for more details:
* Unreal Engine Color Grading
* Simple Color Grading for Games
* Color Grading: Another cool rendering trick

So here's what Stratoforce looks like with a normal color table:

Image

And here's a quick test on color grading:

Image

Whoa look at how different all the colors are! The effect is really powerful as it allows you to apply any sort of color corrections to the whole game in real time.

Here is my work flow for creating a color table and using it to alter the colors of the game:

* I downloaded a standard LUT texture from Epic: RGBTable16x1.png

* I took a screenshot of my game with the RGBTable superimposed on the top left corner of the screen.

* I brought the screenshot into Photoshop and played around with some adjustment layers: Hue/Saturation, Color Balance, Curves, etc.

* I then copy merged the RGBTable image from that document and exported it as a new png file.

* I used that png file as the LUT table for the color correction in the shader.

So the standard RGB table looks like this:

Image

And the modified version from the Photoshop file comes out looking like this:

Image

Now the LUT texture gets loaded into a shader as a 3d texture. Whoa a 3d texture! I didn't even know that a 3d texture could exist until yesterday. Basically imagine a cube that is composed of every color possible. The x y z of the cube is actually r g b! That's why the look up table texture looks like a series of squares. Notice how its 16 x 16 x 16 pixels. Crazy, right?

So here's what I had to do for my GLSL shader in Otter:

// Apply the color grading
//pixel is input color, colorGrade is sampler2D of LUT.
vec4 gradedPixel = sampleAs3DTexture(colorGrade, pixel.rgb, 16);
gradedPixel.a = pixel.a;
pixel = gradedPixel;


Since SFML by default only binds textures as 2D textures in OpenGL, I had to find a work around for loading a 2d texture as a 3d one. I found a work around here and used it in my shader.

vec4 sampleAs3DTexture(sampler2D texture, vec3 uv, float width) {
float sliceSize = 1.0 / width; // space of 1 slice
float slicePixelSize = sliceSize / width; // space of 1 pixel
float sliceInnerSize = slicePixelSize * (width - 1.0); // space of width pixels
float zSlice0 = min(floor(uv.z * width), width - 1.0);
float zSlice1 = min(zSlice0 + 1.0, width - 1.0);
float xOffset = slicePixelSize * 0.5 + uv.x * sliceInnerSize;
float s0 = xOffset + (zSlice0 * sliceSize);
float s1 = xOffset + (zSlice1 * sliceSize);
vec4 slice0Color = texture2D(texture, vec2(s0, uv.y));
vec4 slice1Color = texture2D(texture, vec2(s1, uv.y));
float zOffset = mod(uv.z * width, 1.0);
vec4 result = mix(slice0Color, slice1Color, zOffset);
return result;
}


It seems like the real magic is using this dynamically in a game. Interpolating between various LUT textures for different effects seems like it could be really interesting! I'm excited to play around with this kind of stuff more while procrastinating on solving the hard problems of working on this game.

2 Comments

2014 - 10 - 13 / 2:09 pm / doodle

Doodle Post

Image

Distracted by doodling lately!

No Comments

2014 - 10 - 10 / 5:21 pm / general

Dev Log: Bezier Curves

Dev Log: Bezier Curves

This week has kinda sucked for game development stuff. I'm not really sure why, but I just haven't really felt super inspired to work on anything lately, and when I do try to work on things I feel like everything I make is just terrible so I procrastinate. It's a vicious cycle! So I tried to think of maybe something I can add to Otter because that should be easy enough.

I decided to try and just learn about bezier curves in more detail. I've never used them in a game, but it seems like they would be handy in a lot of aspects of game development. I found this quick tutorial and got started with recreating the example code in Otter.

Image

Although... I'm not sure if this is looking quite right. I'm pretty sure I'm doing the same exact code in the example, but for some reason every curve on my bezier path has sharp end points with the next curve on the path... so for now I'm going to have to look into this further, but the current source is in the Util class in Otter's dev branch if anyone wants to give it a look!

3 Comments

2014 - 10 - 8 / 6:04 pm / otter

Otter Updates

Otter Updates

Some quick updates to Otter in the dev branch!

* Added the Polygon class: For the Polygon collision stuff I created a quick helper class to keep track of the points in a polygon. This class also has some neat functions that are used in the Collider class to figure out polygon collision stuff.

* Added PolygonCollider: Now there is an actual PolygonCollider in Otter! You can use it to check for collisions with any other type of collider too. I expect there to be some bugs so be on the look out when using it.

* Various Collider Updates: Some of the colliders had some minor bugs so I squashed all of the ones I could find.

No Comments

2014 - 10 - 5 / 3:19 pm / doodle

Doodle Post

Image

No Comments

2014 - 10 - 4 / 8:15 pm / otter

Dev Log: Polygon Collisions

Dev Log: Polygon Collisions

I never thought I'd be able to get polygon collisions working in Otter but this past week I managed to jam out a quick prototype of an overlapping polygon test that seems to be working.

Image

Probably not the most exciting image in the world, but it's pretty dang cool to me. I found this tutorial on the Separating Axis Theorem. This tutorial specifically has some great images, and amazing pseudocode with explanations that allowed me to finally understand what the hell to do. I still don't understand some things, like what exactly projecting a vector onto an axis means, but right now I think I have the core of it working.

I'll be working on getting the PolygonCollider integrated into Otter properly over the next few days. That means I'll have to get it working with each other Collider type which shouldn't be too crazy, but we'll see if I end up getting stumped by something!

5 Comments

about

About

Hi there, my name is Kyle, and I'm a 27 year old kid with adult powers. I'm making video games and living the indie game developer life in Tempe, Arizona. Here you will find my thoughts, games, websites, doodles, and other stuff like that. I worked on Snapshot, Offspring Fling, and a whole bunch of other games. I also created and maintain Otter, a 2d game making framework. If you want to get a hold of me use the form on the bottom of the page, leave a comment, or just tweet at me. I try to post three times a week. Thanks for stoppin' by! You're the coolest.

facebook

videos

Do you want to make a Let's Play of one of my games, or a just a video featuring footage of my games? You have my full permission to do so! Even if you are monetizing your videos, you still have my full permission to use any footage from any of my games. Go for it!

contact

Your message has been sent! Thanks :)
SEND MESSAGE