[GLSL] Help understanding this code

Started by
0 comments, last by cherryyosh 15 years, 3 months ago
Hi, Im looking to create a edge decetion for AA with my deferred rendered. Ingrater from opengl.org pointed out the following code from GPU gems 2. I am trying to udnerstand how and why this code works, so I can port this to GLSL and use it in my code. Particularly what should I pass in for tc5 and tc6, Why it takes the dot product on the normals to detect a edge. And why it works when they store them as 'xyzw' values rather then adding them up as with other filters. Heres the code and thanks

struct v2p

{

  float4 tc0: TEXCOORD0; // Center

  float4 tc1: TEXCOORD1; // Left Top



  float4 tc2: TEXCOORD2; // Right Bottom

  float4 tc3: TEXCOORD3; // Right Top

  float4 tc4: TEXCOORD4; // Left Bottom



  float4 tc5: TEXCOORD5; // Left / Right

  float4 tc6: TEXCOORD6; // Top / Bottom

};





/////////////////////////////////////////////////////////////////////

uniform sampler2D s_distort;

uniform half4 e_barrier;  // x=norm(~.8f), y=depth(~.5f)

uniform half4 e_weights;  // x=norm, y=depth

uniform half4 e_kernel;   // x=norm, y=depth



/////////////////////////////////////////////////////////////////////

half4 main(v2p I) : COLOR

{

 // Normal discontinuity filter

 half3 nc = tex2D(s_normal, I.tc0);

 half4 nd;

 nd.x = dot(nc, (half3)tex2D(s_normal, I.tc1));

 nd.y = dot(nc, (half3)tex2D(s_normal, I.tc2));

 nd.z = dot(nc, (half3)tex2D(s_normal, I.tc3));

 nd.w = dot(nc, (half3)tex2D(s_normal, I.tc4));

 nd -= e_barrier.x;

 nd = step(0, nd);

 half ne = saturate(dot(nd, e_weights.x));



 // Opposite coords



 float4 tc5r = I.tc5.wzyx;

 float4 tc6r = I.tc6.wzyx;



 // Depth filter : compute gradiental difference:

 // (c-sample1)+(c-sample1_opposite)

 half4 dc = tex2D(s_position, I.tc0);

 half4 dd;

 dd.x = (half)tex2D(s_position, I.tc1).z +

        (half)tex2D(s_position, I.tc2).z;

 dd.y = (half)tex2D(s_position, I.tc3).z +

        (half)tex2D(s_position, I.tc4).z;

 dd.z = (half)tex2D(s_position, I.tc5).z +

        (half)tex2D(s_position, tc5r).z;

 dd.w = (half)tex2D(s_position, I.tc6).z +

        (half)tex2D(s_position, tc6r).z;

 dd = abs(2 * dc.z - dd)- e_barrier.y;

 dd = step(dd, 0);

 half de = saturate(dot(dd, e_weights.y));



 // Weight



 half w = (1 - de * ne) * e_kernel.x; // 0 - no aa, 1=full aa



 // Smoothed color

 // (a-c)*w + c = a*w + c(1-w)

 float2 offset = I.tc0 * (1-w);

 half4 s0 = tex2D(s_image, offset + I.tc1 * w);

 half4 s1 = tex2D(s_image, offset + I.tc2 * w);

 half4 s2 = tex2D(s_image, offset + I.tc3 * w);

 half4 s3 = tex2D(s_image, offset + I.tc4 * w);

 return (s0 + s1 + s2 + s3)/4.h;

}


( I know the code it hlsl, but im looking to make the equlivate in glsl, which is why I put it here ) EDIT: the page is at http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter09.html
Advertisement
Anyone? Please, I could really use help =/

This topic is closed to new replies.

Advertisement