Jump to content

  • Log In with Google      Sign In   
  • Create Account

FREE SOFTWARE GIVEAWAY

We have 4 x Pro Licences (valued at $59 each) for 2d modular animation software Spriter to give away in this Thursday's GDNet Direct email newsletter.


Read more in this forum topic or make sure you're signed up (from the right-hand sidebar on the homepage) and read Thursday's newsletter to get in the running!


Anisotropic Specular


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
8 replies to this topic

#1 Chris_F   Members   -  Reputation: 2466

Like
0Likes
Like

Posted 12 February 2013 - 08:04 PM

I'm trying to implement an anisotropic version of GGX in UDK. Here is what the shader looks like:

 

 

float3 H = normalize(L + V);
float NdotL = saturate(dot(N, L));
float NdotV = dot(N, V);
float NdotH = dot(N, H);
float LdotH = dot(L, H);
float HdotX = dot(H, X);
float HdotY = dot(H, Y);

float NdotH_2 = NdotH * NdotH;
float HdotX_2 = HdotX * HdotX;
float HdotY_2 = HdotY * HdotY;
float ax_2 = ax * ax;
float ay_2 = ay * ay;

float GGX = (ax * ay * pow(HdotX_2 / ax_2 + HdotY_2 / ay_2 + NdotH_2, 2.0));

float3 F = Ks + (1.0 - Ks) * exp(-6 * LdotH);

float3 Rs = F / (4 * GGX * LdotH * LdotH);
float3 Rd = Kd * (1 - Ks);

return (Rs + Rd) * NdotL;

 

The problem is I'm not sure what to use for vectors X and Y. Because this is UDK, vectors L and V are relative to the surface (tangent space), so would I simply use X = [1, 0, 0], Y = [0, 1, 0]?


Edited by Chris_F, 12 February 2013 - 08:05 PM.


Sponsor:

#2 Bacterius   Crossbones+   -  Reputation: 9299

Like
1Likes
Like

Posted 13 February 2013 - 01:21 AM

I believe X and Y should be set to your tangent and bitangent vectors. So if your L and V vectors are already in TBN space, then yes, you should set them to the tangent and bitangent's representation in this coordinate space, which is just (1, 0, 0) and (0, 1, 0).


The slowsort algorithm is a perfect illustration of the multiply and surrender paradigm, which is perhaps the single most important paradigm in the development of reluctant algorithms. The basic multiply and surrender strategy consists in replacing the problem at hand by two or more subproblems, each slightly simpler than the original, and continue multiplying subproblems and subsubproblems recursively in this fashion as long as possible. At some point the subproblems will all become so simple that their solution can no longer be postponed, and we will have to surrender. Experience shows that, in most cases, by the time this point is reached the total work will be substantially higher than what could have been wasted by a more direct approach.

 

- Pessimal Algorithms and Simplexity Analysis


#3 Chris_F   Members   -  Reputation: 2466

Like
0Likes
Like

Posted 13 February 2013 - 01:09 PM

In that case, I'm not sure what I'm doing wrong. I don't have this issue with isotropic shaders. sad.png

 

aniso.png



#4 Bacterius   Crossbones+   -  Reputation: 9299

Like
0Likes
Like

Posted 13 February 2013 - 04:20 PM

That because isotropic shaders don't care about the tangent and bitangent, all they need is the normal (since they are isotropic about the normal axis). Are you sure your TBN matrix is correct for every face here? The bottom looks good but there's a discontinuity.


The slowsort algorithm is a perfect illustration of the multiply and surrender paradigm, which is perhaps the single most important paradigm in the development of reluctant algorithms. The basic multiply and surrender strategy consists in replacing the problem at hand by two or more subproblems, each slightly simpler than the original, and continue multiplying subproblems and subsubproblems recursively in this fashion as long as possible. At some point the subproblems will all become so simple that their solution can no longer be postponed, and we will have to surrender. Experience shows that, in most cases, by the time this point is reached the total work will be substantially higher than what could have been wasted by a more direct approach.

 

- Pessimal Algorithms and Simplexity Analysis


#5 Chris_F   Members   -  Reputation: 2466

Like
0Likes
Like

Posted 13 February 2013 - 04:37 PM

Well, this is UDK that I'm working in ATM, so as far as I know I have no control over the tangents. The discontinuities seem to correlate to the UVs.



#6 ATEFred   Members   -  Reputation: 1131

Like
0Likes
Like

Posted 17 February 2013 - 12:28 PM

Tangents are usually generated from the UVs, so that makes sense. Fixing up the mesh should solve the issue.



#7 Chris_F   Members   -  Reputation: 2466

Like
0Likes
Like

Posted 17 February 2013 - 03:13 PM

Tangents are usually generated from the UVs, so that makes sense. Fixing up the mesh should solve the issue.

 

I've UV unwrapped the meshes six ways from Sunday, and I have found no unwrap that doesn't produce a horrible discontinuity along the UV seam(s).



#8 Vilem Otte   Crossbones+   -  Reputation: 1568

Like
2Likes
Like

Posted 18 February 2013 - 05:47 AM

I've rewritten your code into my own game engine, that has correct tangent space vectors computation from UV coordinates, here are the results for different UV coordinate modes (just quickly made sphere in 3D modeller and used 3 different UV mappings). Note that I don't transform light and view vectors into tangent space (I keep them in view space), but this won't make a difference (as I use actual tangent & bitangent vectors in world space).

 

In your case (when you transfer light and view vectors to tangent space, your tangent and bitangent vectors in that space are tangent space basis -> tangent = (1, 0, 0), bitangent = (0, 1, 0) and normal = (0, 0, 1).

 

1. Correct one (spherical UV coordinates - works fine):

vxn1qs.jpg

 

2. Box UV coordinates (obviously wrong)

2mq6v4o.jpg

 

3. Face unwrap (e.g. each face is mapped between 0.0 - 1.0 UV coordinates) - again obviously wrong:

28i2dqv.jpg


My current blog on programming, linux and stuff - http://gameprogrammerdiary.blogspot.com


#9 Chris_F   Members   -  Reputation: 2466

Like
0Likes
Like

Posted 18 February 2013 - 04:26 PM

Here I used a spherical unwrap.

 

sphere.png






Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS