Posts Tagged ‘xna’

RealKo Engine: Updated Map 3

Wednesday, June 24th, 2009

Hey, nice to be here again.

Now the map is updated (current code is 3), you will see quite of improvement stuffs in the scene.
The map now included with buildings, highways, trees, lots of texture lights, the emissive map (which you can see the building turns on its own lights in the night),  and more and more detail on textures.

My artist has done quite a great job here. Lots of the time which he spent on the detailing the textures for each mesh. Diffuse, normal, specular, and emissive map and others too, when integrated with RealKo Engine, can give nice and virtualized both in feeling and actual quality in the scene.

I have captured a lot of screenshots here so I dont want to waste any time now, just see them below.

Last 13 screenshots (before last 2) of above gallery are the most recently updated from my experiment with light’s properties.
I have changed the position, color, specular intensity, radius, etc of the light itself just to see the different in variety in the scene. There are 1 directinal light for sun, and other 10-13 for point lights in the scene you just saw above.

Sorry for my english this time, it’s quite late now and I feel blurry. But I really want to finish the post to show you the improvement right away, so please don’t mind this thing :)

Til next time my friends.
Thanks for coming by.

RealKo Engine: Update working gallery

Saturday, June 20th, 2009

Hey, my friends.

After having a good long rest, I decide to come back quickly and start to work again!!

Programmer should have some naps right? If energy is too low, or some of the motivation has gone, it’s the time to refresh thing up by doing anything that not involving with code. That the couple of days for my day-off, but please do not worry because this time I also have something to show you again.

It’s the working gallery from my lastest testbed on the airport map. The map is updated from my professional artist, P.Yod. As I have said to you last post about the power of texture lights. They come in handy and we will put them to use again for the lights of airport. They’re cheap, nice to look at, and they’re alpha stuff that need to be cared if used in deferred shading process.

I did the same as I did for my alpha scene stuff, just draw them on top of the deferred shading scene. Thus everything gonna be in our control.

You will see the 2 types of light again. One for static light the same as what you already saw from the airplane’s head light. Another for signal light, blinking all the time in the night. The different this time is that we gonna apply lights for building, runway, taxi way, and ground under building. No matter where’s the position they’re located, the algorithm behind the scene is the same for airplane’s alpha stuff (for both types of light).

In the scene we can control all the lights (to turn it on/off, and blinking which depend on the type of light), in which the lights are brought into the engine via config file. Currently 2 types are allowed.

Also note that the map is not fully updated, some of the assets are not finished and put into the scene yet. But it’s quite close now.

Now don’t waste time, let’s see the gallery below.

XNA Game Studio 3.1 is released now!!

Friday, June 12th, 2009

As the xna team works quite hard to get the new XNA Framework version out every period of time.
Now XNA Game Studio 3.1 is released.
You can find more information from http://creators.xna.com.

And also the important thing to note is that, if your project is relied on the framework version 3.0. You can upgrade your project into 3.1 with ease. Refer to http://creators.xna.com/en-us/article/convert30to31 for step-by-step.

I’m quite pleased with one of the features, more at http://creators.xna.com/en-US/news/xnagamestudio3.1, it’s about the sound stuff. Now you can play sound with just one method call, and it will do the burden job (initialize, releasing the resource, etc for us). Wow, it maybe the time we can take the sound into the game with fun feeling.

Enjoy new version everyone!.

Integrate Creator Club’s particle system into deferred shading system.

Tuesday, May 26th, 2009

From what I have done now, integrating the particle system from creator club into my deferred shading system. I have 2 options as this case also can be applied to you too for the approaches I gonna use to integrate this stuff.

First, it’s the simplest one which can be done without much effect. NO modifications are need for ParticleEffect.fx file of the particle system, thus giving you the most comfortable one. What the first one does exactly? Well it does render the particle scene on top of the finished deferred scene by just combining their textures. In this way, although the work is well reduced, but the particles still visible through the solid objects. Thus it the early simple work now comes to the cumbersome, in which you much get the depth buffer from deferred scene, whether or not it comes from your render target or the graphics device’s current depth buffer. We use it to just occlude the particles that must not be seen if they are behind our objects in deferred scene. Also, this is not enough if we choose not to modify any part of the ParticleEffect.fx file, then we must get particle scene’s depth buffer out too. In conclusion, we need two more textures of depth buffer externally from the ParticleEffect.fx to correctly draw the particles on screen, and thus another effect to combine them so more passes required for the final scene. But if we choose to modify some parts of that file, we need to calculate the location of the depth buffer to sample the depth at the particular position of a single particle. Compare them and then correctly draw. Yes, I think it can be called the nice way too. But this is not the approach I will use, as I want the overall rendering pass to not be increased anymore.

Second approach, this is what the approach I chose. The reason is to reduce as much the render pass for my rendering system. It requires no additional rendering pass at all, as it will now become the part of the deferred shading itself. For what I done with this approach is this, I have treated the particle scene as the normal scene for deferred shading. It can be called for updating, and drawing like the normal scene existed in deferred pass. In this way, we reduce at much the overhead to switch between the effect, and time to produce the final scene.

How to do it? I have to add some codes into the ParticleEffect.fx file.

The following is the list for my addtion to the code. List of  addition
1.  add the copy of transformed position (vector4) for vertex output structure => we only do the calculatation for depth value here

2.  add the receiving parameter (corresponding to 1.)

3.  add the output of pixel shader structure, writes to all the related and only neccessary render target

4. add the part of code inside pixel shader to write the output.

Let’s see the real action below

We must add the copy of transformed position (vector4) into the vertex output, thus we can store our particle’s depth into the depth render target, thus this will solve our “particle through solid object” problem.

struct VertexShaderOutput
{
    float4 Position : POSITION0;
    float Size : PSIZE0;
    float4 Color : COLOR0;
    float4 Rotation : COLOR1;
    float4 CopyPosition: TEXCOORD0;
};

Note above that we use TEXCOORD0 semantic to hold our data. And now take a look at the vertex shader function, as we will add single line to copy the transformed position (vector4) and route it to the output. See below

// Custom vertex shader animates particles entirely on the GPU.
VertexShaderOutput VertexShader(VertexShaderInput input)
{
    VertexShaderOutput output;
 
    // Compute the age of the particle.
    float age = CurrentTime - input.Time;
 
    // Apply a random factor to make different particles age at different rates.
    age *= 1 + input.Random.x * DurationRandomness;
 
    // Normalize the age into the range zero to one.
    float normalizedAge = saturate(age / Duration);
 
    // Compute the particle position, size, color, and rotation.
    output.Position = ComputeParticlePosition(input.Position, input.Velocity,
                                              age, normalizedAge);
 
    output.Size = ComputeParticleSize(output.Position, input.Random.y, normalizedAge);
    output.Color = ComputeParticleColor(output.Position, input.Random.z, normalizedAge);
    output.Rotation = ComputeParticleRotation(input.Random.w, age);
    output.CopyPosition = output.Position;
 
    return output;
}

See the line “output.CopyPosition = output.Position”. Isn’t it simple? Now we move to the pixel shader part. But before moving into it, I must tell you what about my GBuffer layout first, so you can adapt it into your own and work correctly.

For my layout, I have 4 render targets as follow

RT1, Color  (ARGB with 8 bit pixel format  for each channel), this render target just contain the albedo color
RT2
, Depth t (32 bit float format using 32 bit for red channel), this render target contains pure depth value
RT3,
LightOcclusion (same format as RT2), this render target contains information about whether or not the light will lit each pixel (for example the skydome, you dont want to light it, so settings this value to 1 to disable light effect when drawing skydome.)
RT4,
Normal (same format as RT1), in fact you can use 16-bit for x and y, then calculate z using 1 - x^2 - y^2.

Okay, let’s see the code

struct PixelShaderOutput
{
	float4 Color: COLOR0;
	float4 Depth: COLOR1;
	float4 LightOcclusion: COLOR2;
};

You may ask at this point. Why I don’t include the normal as output in this structure? Because the hlsl rule, as when you include the output part inside the structure, you must write it too, whether or not you do not want to be messed with its value. Thus as you may expect, I rearrange the order or render target just to take the normal to the last and not include it in the output structure, as I don’t want to modify its current value in the buffer. Because of we don’t want any one of the particle to affect the lighting calculation at the later stage, so do not mess with the current normal resided in the buffer already. Leaving this way, the lighting will not concern about the existence of individual particle. (But at the later you will see that I have set the value of lightOcclusion to 0, contradict to what I have told you, it’s because if we turn off the lighting effect on individual particle in which that particle already draw on top of our normal scene, we will see the square of pure albedo color. Thus if your scene is in night, then your rain particle system is enabled, you will see the bright square everywhere which again not what we want.) Now let’s have a look about input structure, and its pixel shader function (separate for the type of output, as you will learn that the particle system created from creators club is well implemented. The type includes “Non rotating particle”, and “Rotating particle” version).

For non-rotating version.

// Pixel shader input structure for particles that do not rotate.
struct NonRotatingPixelShaderInput
{
    float4 Color : COLOR0;
 
#ifdef XBOX
    float2 TextureCoordinate : SPRITETEXCOORD;
#else
    float2 TextureCoordinate : TEXCOORD0;
#endif
 
    float4 CopyPosition: TEXCOORD1;
};
 
// Pixel shader for drawing particles that do not rotate.
PixelShaderOutput NonRotatingPixelShader(NonRotatingPixelShaderInput input)
{
	PixelShaderOutput output;
 
	//write to the GBuffer
        output.Color = tex2D(Sampler, input.TextureCoordinate) * input.Color;
	output.Depth = input.CopyPosition.z / input.CopyPosition.w;
	output.LightOcclusion = 0;
 
	return output;
}

For rotating version

// Pixel shader input structure for particles that can rotate.
struct RotatingPixelShaderInput
{
    float4 Color : COLOR0;
    float4 Rotation : COLOR1;
 
#ifdef XBOX
    float2 TextureCoordinate : SPRITETEXCOORD;
#else
    float2 TextureCoordinate : TEXCOORD0;
#endif
 
    float4 CopyPosition: TEXCOORD1;
};
 
// Pixel shader for drawing particles that can rotate. It is not actually
// possible to rotate a point sprite, so instead we rotate our texture
// coordinates. Leaving the sprite the regular way up but rotating the
// texture has the exact same effect as if we were able to rotate the
// point sprite itself.
PixelShaderOutput RotatingPixelShader(RotatingPixelShaderInput input)
{
    PixelShaderOutput output;
 
    float2 textureCoordinate = input.TextureCoordinate;
 
    // We want to rotate around the middle of the particle, not the origin,
    // so we offset the texture coordinate accordingly.
    textureCoordinate -= 0.5;
 
    // Apply the rotation matrix, after rescaling it back from the packed
    // color interpolator format into a full -1 to 1 range.
    float4 rotation = input.Rotation * 2 - 1;
 
    textureCoordinate = mul(textureCoordinate, float2x2(rotation));
 
    // Point sprites are squares. So are textures. When we rotate one square
    // inside another square, the corners of the texture will go past the
    // edge of the point sprite and get clipped. To avoid this, we scale
    // our texture coordinates to make sure the entire square can be rotated
    // inside the point sprite without any clipping.
    textureCoordinate *= sqrt(2);
 
    // Undo the offset used to control the rotation origin.
    textureCoordinate += 0.5;
 
    //write to the GBuffer
    output.Color = tex2D(Sampler, textureCoordinate) * input.Color;
    output.Depth = input.CopyPosition.z / input.CopyPosition.w;
    output.LightOcclusion = 0;
 
    return output;
}

Now, we have done it.
For all the detail I described to you so far. I have done integrated it into my RealKo Engine.
I open for your suggestion and comment about the approach I made, you can suggest the better way to do it. Thus note for my designing, I chose the one that is not that too much difficult to implement, and does not require too much time (with close to deadline of my project), thus all they have come to be the way as I explained to you so far.

Farewell for now, and see you next time.

RealKo Engine diary journal (lightOcclusion concern)

Sunday, May 24th, 2009

Deferred shading rendering system is what the system that I integrated and used as the main building block for my “RealKo Engine”.

Okay, just go straight to what I want to say now.
I have found the problem of lighting when I used deferred shading as the rendering system. I knew that all the geometry information is written to the rendertarget before any lighting calculation can take place. This concern didn’t not come to be realized when that time I am doing this, haha.

For what I want to say is that, when that time comes, the time that you want to lit the object, and select some objects not to be lit as well, how can we do it in the deferred shading, as the lighting calculation is the last pass.

Ohh, as I said above, it just comes to be relized at very late. You also need to store the information in the pre-pass, that tell the deferred shading about what pixel gonna be lit, and not to be lit => I called it “LightOcclusion”.

At very first my GBuffer layout has only 3 render targets (the same approach as Catalin Zima provided in http://www.ziggyware.com/readarticle.php?article_id=155), when I found this problem, that forces me to add in another render target. Also I have designed my each of rendertarget to contain 32 bit (RGBA), when combined all the 4, with the resolution of 1280 * 1024, I come across at exactly 20 MB (in fact should be added with another related issue too, such as Depth Buffer). That’s not quite high so far, because I have seen the one implemented in KillZone, it’s about 36 MB, so I think to myself, okay as long as we are low enough on size, we might get the speed with some close enough quality of graphics (as far as I concern, I think I come to the right track).

So by adding another rendertarget into use, I have increased it more 5 MB. The overhead of buffer need to be transfer and read/write is the big problem in deferred shading, but as long as your graphics card has enough bandwidth, that’s not gonna be a problem, as for me, GTX 275 is the beast!!!

Okay, enough for now, I will updated along when I have done some important component of the engine in the upcoming week.

Last word for today, do not forget about lightOcclusion in deferred shading.  (I can’t think of other solution to not lit some objects in the world by not use lightOcclusion, if you know some alternative just let me know here, it will be appreciated.)