Jump to content

  • Log In with Google      Sign In   
  • Create Account


Member Since 10 Dec 2011
Offline Last Active Dec 11 2013 12:43 PM

Topics I've Started

Changing Depth in HLSL

02 October 2013 - 08:28 PM

Hello my friends!
I am trying to implement some kind of this...


Basically my problem is just changing the depth inside PixelShader.

When I change depth field, nothing happens, and I don't know why...

here is my .fx file:

float4x4 World;
float4x4 View;
float4x4 Projection;
float4x4 WorldInverseTranspose;
float4 AmbientColor;
float4 DiffuseColor = float4(1, 1, 1, 1);
float InvLogFar; 
float Radius;
float3 LightDirection = float3(1, 0, 0);
float DiffuseIntensity = 1.0;
float Shininess = 200;
float4 SpecularColor = float4(1, 1, 1, 1);
float SpecularIntensity = 1;
float3 ViewVector = float3(1, 0, 0);
texture ModelTexture;
sampler2D textureSampler = sampler_state {
    Texture = (ModelTexture);
    MinFilter = Linear;
    MagFilter = Linear;
    AddressU = Clamp;
    AddressV = Clamp;
texture ModelTexture2;
sampler2D textureSampler2 = sampler_state {
    Texture = (ModelTexture2);
    MinFilter = Linear;
    MagFilter = Linear;
    AddressU = Clamp;
    AddressV = Clamp;
struct VS_INPUT
    float4 Position : POSITION;
    float4 Normal : NORMAL;
    float2 TextureCoordinate : TEXCOORD;
struct VS_OUTPUT
    float4 ClipPosition : POSITION;
    float3 Normal : NORMAL;
float4 Position : TEXCOORD0;
    float2 TextureCoordinate : TEXCOORD1;
float3 ExactPos : TEXCOORD2;
struct PS_OUTPUT {
float4 Color0 : COLOR0;
float Depth : DEPTH;
VS_OUTPUT VS_Function(VS_INPUT input)
    VS_OUTPUT output;
     // Change the position vector to be 4 units for proper matrix calculations.
    input.Position.w = 1.0f;
    // Calculate the position of the vertex against the world, view, and projection matrices.
    output.ClipPosition = mul(input.Position, World);
    output.ClipPosition = mul(output.ClipPosition, View);
    output.ClipPosition = mul(output.ClipPosition, Projection);
output.Normal = normalize(mul(input.Normal, WorldInverseTranspose));
output.TextureCoordinate = input.TextureCoordinate;
output.ExactPos = input.Position;
output.Position = output.ClipPosition;
    return output;
PS_OUTPUT PS_Function(VS_OUTPUT input) 
    float3 light = normalize(LightDirection);
    float3 normal = normalize(input.Normal);
    float3 r = normalize(2 * dot(light, normal) * normal - light);
    float3 v = normalize(mul(normalize(ViewVector), World));
    float dotProduct = dot(r, v);
    float4 specular = SpecularIntensity * SpecularColor * max(pow(abs(dotProduct), Shininess), 0);
float4 textureColor = float4(1.0,1.0,1.0,1.0);
dotProduct = 0.1;
PS_OUTPUT output;
output.Color0 = dotProduct*saturate(textureColor + AmbientColor + specular);
output.Color0.a = 1.0;
output.Depth = input.Position.z / input.Position.w;
output.Depth = log(output.Depth+1)* InvLogFar; 
// InvLogFar = 1.0/log(Far + 1.0)
    return output;
technique Textured
    pass Pass1
        VertexShader = compile vs_3_0 VS_Function();
        PixelShader = compile ps_3_0 PS_Function();

Please if you help me, I would be very happy :-)

Also my main goal is to show a path composed by real GPS Captured Points and Satellites, so I need a real world size, thats why I am applying a logarithm function to depth...



PS: I have already implemented in  OpenGL and it worked, I don't know why it's not working with XNA...

Quaternions, rotate a model and align with a direction

06 November 2012 - 03:09 PM

Suppose you have quaternion that describes the rotation of a 3D Model.
What I want to do is, given an Object (with rotationQuaternion, side vector...), I want to align it to a target point.
For a spaceship, I want the cockpit to point to a target.
Here is some code I have ... It's not doing what I want and I don't know why...

		if (_target._ray.Position != _obj._ray.Position)
			Vector3 vec = Vector3.Normalize(_target._ray.Position - _obj._ray.Position);
			float angle = (float)Math.Acos(Vector3.Dot(vec, _obj._ray.Direction));
			Vector3 cross = Vector3.Cross(vec, _obj._ray.Direction);
			if (cross == Vector3.Zero)
				cross = _obj._side;
			_obj._rotationQuaternion *= Quaternion.CreateFromAxisAngle(cross,angle);
		// Updates direction, up, side vectors and model Matrix

after some time the rotationQuaternion is filled with almost Zero at X,Y,Z and W
Any help? Thanks ;-)

Intersection Between 2D Ray and Rectangle Borders

19 October 2012 - 01:01 PM

Hello! I need to find this point, if someone could help...

Posted Image
dir is always centered in rectangle.

Thanks ;-)

Tactical Formation with multiple objects

13 July 2012 - 08:11 AM

I created a video about my problem:

Given a group of objects and a goal.

STEP 1 - Find the center of the group.
STEP 2 - Find the path from the center to the goal (it's a list of points).

STEP 3 - For each object, send it to its formation position (relative to group's position).
STEP 4 - Move the objects.
STEP 5 - Repeat STEP 4 If at least one object moved.
STEP 6 - If the goal is not reached, grab the next position of the path and go to STEP 3.

STEP 7 - End.

As you can see it's not perfect, If you have any idea how to improove it, I would thank.

Getting Average Color of DXTCompressed Texture

23 June 2012 - 09:58 PM

Hello again.

I am trying to Implement a Minimap for my game and for each Texture I want the avg color to paint the minimap.

so far I've this:
		public Color GetAvgColor(Texture2D tex)
			Color[] data = new Color[tex.Width*tex.Height];
			Color sum = Color.Black;
			int amount = 0;
			foreach (Color c in data)
				sum.R += c.R;
				sum.G += c.G;
				sum.B += c.B;
			return new Color(sum.R / amount, sum.G / amount, sum.B / amount); ;

I didn't tested with Colored Textures because my terrain textures are DXTCompressed and MipMapped.

The problem is with GetData:
{"The type you are using for T in this method is an invalid size for this resource."}

Is that possible to Get the Average Color of a DXTCompressed Texture?

Thanks ;-)