Jump to content
  • Advertisement
Sign in to follow this  
Chris Graphics

OpenGL Bump Reflection Mapping

This topic is 4479 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

Hi, my plan is to use the shader source code out of the CG toolkit user manual for bump reflection mapping to render a sphere in OpenGL. The goal is to achieve the same effect as shown in the user manual. Has anyone already tried to use the same code unchanged? The reflections I'm experiencing at the moment are quite wrong, and I'm assuming that this has to do with a wrong eye vector. Perhaps I understood the shader source wrongly, thus I'm asking some questions about that. First, here is the complete source code from the toolkit: VERTEX SHADER: -------------------------------------------------------------------------------------------- struct a2v { float4 Position : POSITION; // in object space float2 TexCoord : TEXCOORD0; float3 T : TEXCOORD1; // in object space float3 B : TEXCOORD2; // in object space float3 N : TEXCOORD3; // in object space }; struct v2f { float4 Position : POSITION; // in projection space float4 TexCoord : TEXCOORD0; // first row of the 3x3 transform // from tangent to cube space float4 TangentToCubeSpace0 : TEXCOORD1; // second row of the 3x3 transform // from tangent to cube space float4 TangentToCubeSpace1 : TEXCOORD2; // third row of the 3x3 transform // from tangent to cube space float4 TangentToCubeSpace2 : TEXCOORD3; }; v2f main(a2v IN, uniform float4x4 WorldViewProj, uniform float3x4 ObjToCubeSpace, uniform float3 EyePosition, // in cube space uniform float BumpScale) { v2f OUT; // pass texture coordinates for // fetching the normal map OUT.TexCoord.xy = IN.TexCoord.xy; // compute 3x3 transform from tangent to object space float3x3 objToTangentSpace; // first rows are the tangent and binormal // scaled by the bump scale objToTangentSpace[0] = BumpScale * IN.T; objToTangentSpace[1] = BumpScale * IN.B; objToTangentSpace[2] = IN.N; // compute the 3x3 transform from // tangent space to cube space: // TangentToCubeSpace // = object2cube * tangent2object // = object2cube * transpose(objToTangentSpace) // (since the inverse of a rotation is its transpose) // // So a row of TangentToCubeSpace is the transform by // objToTangentSpace of the corresponding row of // ObjToCubeSpace OUT.TangentToCubeSpace0.xyz = mul(objToTangentSpace, ObjToCubeSpace[0].xyz); OUT.TangentToCubeSpace1.xyz = mul(objToTangentSpace, ObjToCubeSpace[1].xyz); OUT.TangentToCubeSpace2.xyz = mul(objToTangentSpace, ObjToCubeSpace[2].xyz); // compute the eye vector // (going from eye to shaded point) in cube space float3 eyeVector = mul(ObjToCubeSpace, IN.Position) - EyePosition; OUT.TangentToCubeSpace0.w = eyeVector.x; OUT.TangentToCubeSpace1.w = eyeVector.y; OUT.TangentToCubeSpace2.w = eyeVector.z; // transform position to projection space OUT.Position = mul(WorldViewProj, IN.Position); return OUT; } -------------------------------------------------------------------------------------------- PIXEL SHADER: -------------------------------------------------------------------------------------------- struct v2f { float4 Position : POSITION; //in projection space float4 TexCoord : TEXCOORD0; // first row of the 3x3 transform // from tangent to cube space float4 TangentToCubeSpace0 : TEXCOORD1; // second row of the 3x3 transform // from tangent to cube space float4 TangentToCubeSpace1 : TEXCOORD2; // third row of the 3x3 transform // from tangent to cube space float4 TangentToCubeSpace2 : TEXCOORD3; }; float4 main(v2f IN, uniform sampler2D NormalMap, uniform samplerCUBE EnvironmentMap, uniform float3 EyeVector) : COLOR { // fetch the bump normal from the normal map float4 normal = tex2D(NormalMap, IN.TexCoord.xy); // transform the bump normal into cube space // then use the transformed normal and eye vector // to compute the reflection vector that is // used to fetch the cube map return texCUBE_reflect_eye_dp3x3(EnvironmentMap, IN.TangentToCubeSpace2.xyz, IN.TangentToCubeSpace0, IN.TangentToCubeSpace1, normal, EyeVector); } Well, now my questions: 1.) In the VS, there is the input "uniform float3 EyePosition, // in cubespace", and AIK cube space is mostly the same as world space. What I have to do to setup the eye vector so this will be cube space? Will be (0/0/1) enough? 2.) Furthermore, there is the input "uniform float3x4 ObjToCubeSpace". How do I get a transformation matrix from object space to world space and/or cube space in OpenGL? What I have to hand over to the shader? AIK, such a matrix does not exist, and I don't know how to calc it. 3.) At the end of the VS: // compute the eye vector // (going from eye to shaded point) in cube space float3 eyeVector = mul(ObjToCubeSpace, IN.Position) - EyePosition; OUT.TangentToCubeSpace0.w = eyeVector.x; OUT.TangentToCubeSpace1.w = eyeVector.y; OUT.TangentToCubeSpace2.w = eyeVector.z; The eye vector is stored and handed over to the PS. In the PS, the eye vector is specified as uniform, and due to that handed over once by the application. So what is right now? And does that mean that one has to use the per vertex eye vector? 4.) At the end of the PS, there is the mysterious method return texCUBE_reflect_eye_dp3x3(EnvironmentMap, IN.TangentToCubeSpace2.xyz, IN.TangentToCubeSpace0, IN.TangentToCubeSpace1, normal, EyeVector); Does anyone know what exactly I have to do here? Maybe this is my main problem. Of course, the parameters and the name give some hints about that. But I'm not really sure how to realize it. Here is my solution: float4x4 T; T[0] = TangentToCubeSpace2; T[1] = TangentToCubeSpace0; T[2] = TangentToCubeSpace1; float3 N = mul(T, normal); N = normalize(N); Then I'm fetching the eye vector which was previously stored in the TangentToCubeSpace matrix: float3 EyeVector; EyeVector.x = TangentToCubeSpace0.w; EyeVector.y = TangentToCubeSpace1.w; EyeVector.z = TangentToCubeSpace2.w; float3 R = reflect(EyeVector, N); color = rexCUBE(environmentMap, R); I hope some of you can help me. It would be great if the effect looks like the sphere shown in the manual. Thx, Chris

Share this post


Link to post
Share on other sites
Advertisement
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!