Jump to content
  • Advertisement
  • entries
  • comments
  • views

Third of the lighting models

Sign in to follow this  


First off a brief service announcement: >10000 hits on my journal. Yay! Many thanks to all of you who deemed my ramblings worth reading..


Another lighting model similar to Cook-Torrance in that it attempts to modify the lambertian model to compensate for a rough surface. The key difference to Cook-Torrance is that Oren-Nayar's doesn't include a specular component. Most implementations attach a standard Blinn-Phong specular term if it's needed.

So, the equation I'm using (which has been the hardest to comprehend so far [headshake]) is as follows:

  • Diffuse Texture
  • Roughness Texture
  • Normal Map Texture
  • Sin()Tan() Lookup Texture

  • Ambient Constant
  • Light Position
  • Light Range
  • Light Falloff

  • World Matrix
  • World * View * Proj Matrix

    Vertex Data:
  • Position
  • Normal
  • Tangent
  • TexCoord

    With regards to the generic base that I'm trying to derive, the following is noteworthy:
  • No specular texture. Implementation might add this via a Blinn-Phong component though.
  • Sin()Tan() lookup texture needs to be generated and provided
  • Uses a roughness texture, same as Cook-Torrance
  • No equation-specific constants

    And, as you should be expecting, a visio diagram to encapsulate the above steps:
  • Sign in to follow this  


    Recommended Comments

    The 10000th read was me :)

    I know because the counter was at 9999 when i clicked on your journal. I wanted to leave a comment stating "victory", but a collegue distracted me with a question, and when i was back 10 minutes later, i forgot to do it :)

    Share this comment

    Link to comment
    Hi, I like your posts about the lighting models and hope you make more of them (anisotropic stuff!), oh and some pretty pictures showing off each one :)

    I'm ending up with a different formula for Alpha/Beta though. You had
    Original post by jollyjeffers
    alpha = min( dot(Normal, Light), dot(Normal, View) )
    beta = max( dot(Normal, Light), dot(Normal, View) )

    and I'v got (I hope, in accordance with the original paper (p.22))

    theta_r = acos( dot(Normal, Light) )
    theta_i = acos( dot(Normal, View) ) )
    alpha = max( theta_r, theta_i )
    beta = min( theta_r, theta_i )

    So the difference is that you are using the cosine of the angles instead of the angles when you feed them into Sin/Tan. I guess you could probably skip the acos if your Sin/Tan are tweaked lookup tables though.

    Sorry about posting so far down you journal, hope you notice it :)

    Share this comment

    Link to comment

    Create an account or sign in to comment

    You need to be a member in order to leave a comment

    Create an account

    Sign up for a new account in our community. It's easy!

    Register a new account

    Sign in

    Already have an account? Sign in here.

    Sign In Now
    • 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!