Jump to content
  • Advertisement
Sign in to follow this  

Texture to world space with *correct scaling* ??

This topic is 3668 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Geometry sources generally give me normalized normals and tangents, and then the B is expected to be computed as a cross product in the vertex shader. This means that shear and scaling are gone, and I'm unable to convert from texture space to world space for anything but directions. I could assume the UV mapping is low-stretch and approximate by ignoring shear, but the scaling kills me! I need help to figure out how to do this conversion for the following: if I'm doing volume rendering on layers that are separated by some world-space distance from each other, and I know the offset in texture space of a point on one layer from the corresponding one on the previous layer (and layer offset is dynamic), I need to calculate the normal from that. Clearly, either the offset needs to go to world space, or the layer separation to texture space (also, my layers are non-planar but shells around a mesh, I'm doing fur rendering and I need individual hair normals). So how do I do this transform without being able to modify incoming vertex data (that is, I'm stuck with the normalized normals and tangents generated by the skinning library I'm using)? The only idea I had is to go through screen space first by using dFdx/dFdy in GLSL on texture and position...not sure if this will work. Also, someone asked a similar question back in 2006 and no one answered: http://www.gamedev.net/community/forums/topic.asp?topic_id=422107 I'm really hoping I'll be able to get more help than that guy -.-

Share this post

Link to post
Share on other sites
I found code that in the fragment shader computes TBN as follows;
varying vec3 position, normal:
void main(void)
vec3 v0 = dFdx(position), v1 = dFdy(position);
vec2 st0 = dFdx(gl_TexCoord[0].st),
st1 = dFdy(gl_TexCoord[0].st);
mat3 TBN = mat3(normalize(v0 * st1.t - v1 * st0.t),
normalize(v1 * st0.s - v0 * st1.s),
// Stuff using TBN

Because B is not calculated as a cross-product, the shearing should be correct. However, the normalization obviously takes out the scaling. I'm wondering if I simply omit the normalization, if that will give me the correct scaling, or there's some other factor needed here. Then there's the issue of the scaling of the normal itself--do I cross the un-normalized T and B or whatever.

Any ideas?

Share this post

Link to post
Share on other sites
Sign in to follow this  

  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!