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!


Shader Management for Lighting?


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
4 replies to this topic

#1 mychii   Members   -  Reputation: 425

Like
0Likes
Like

Posted 01 January 2014 - 09:28 AM

Hi,

 

I am currently learning to apply lighting to my application, but then I got confused on how I should scale it. I'm using WebGL and I'm learning from learningwebgl.com (which they say the same as NeHe OpenGL tutorial), and it only shows simple shader programs that every sample have one program with embedded lighting on it.

 

Say I have multiple lighting setup, like some point lights/spot lights, and I have multiple meshes with different materials. What should I do? make individual shader programs where you put colors/textures to meshes and then switch to lighting program? or always have every shader texts with those lights as default in it and simply make variable passes to enable them?

 

Also I am focusing on per-fragment lighting.

 

Thanks for the help!



Sponsor:

#2 Dawoodoz   Members   -  Reputation: 331

Like
1Likes
Like

Posted 02 January 2014 - 09:42 AM

In DirectX, I pasted some generic light sampling functions at the top of each shader before compiling them. An array from the CPU stored up to 64 light sources that passed the culling test. Having more lights than that would be too slow to render anyway. They same thing should be possible in OpenGL and works without dynamic shader linking.

 

For depth based shadow mapping, I made a 2D allocation argorithm that is 100% free from fragmentation because the only way to free an allocation is to free every light source. Start with a whole square in bucket 0 and let the remaining buckets be empty. Each bucket can at most have 4 unallocated slots and that is only right before one of them is use or divided again. When there is no unused square of the right resolution, divide a larger square until you have something. The only case where you can't get more memory is when the total amount of pixels is not enough because no matter how many smaller sizes that use 3/4, their sum is always smaller than one larger square.

https://code.google.com/p/david-piuvas-graphics-engine/source/browse/trunk/Engine/QuadAllocator.cpp


Edited by Dawoodoz, 02 January 2014 - 09:56 AM.

My open source DirectX 10/11 graphics engine. https://sites.google.com/site/dawoodoz

"My design pattern is the simplest to understand. Everyone else is just too stupid to understand it."


#3 mychii   Members   -  Reputation: 425

Like
0Likes
Like

Posted 02 January 2014 - 10:19 AM

In DirectX, I pasted some generic light sampling functions at the top of each shader before compiling them.

 

Pasted as in you paste in on every shader files, or you have some sort of a function that contains light texts in strings and combine it with every shader files to be linked during the first load?

 
I haven't got into shadow mapping yet, but thank you for your extra information, I'm pretty sure I'm getting there after this.


#4 Dawoodoz   Members   -  Reputation: 331

Like
1Likes
Like

Posted 02 January 2014 - 10:46 AM

 

In DirectX, I pasted some generic light sampling functions at the top of each shader before compiling them.

 

Pasted as in you paste in on every shader files, or you have some sort of a function that contains light texts in strings and combine it with every shader files to be linked during the first load?

 
I haven't got into shadow mapping yet, but thank you for your extra information, I'm pretty sure I'm getting there after this.

 

 

Pasted as text into every shader that is used for materials. I made it fast by saving pre-compiled shaders with check sums that tell if the shader has changed since the last compilation. The hard thing was to maintain backward compability without bloating the code to insert so try to have a powerful interface from the start that is compatible with, amibient, diffuse and specular light for solid, thin and fog materials. Fog will sample the light without caring much about the direction of the light. Thin materials like fabric will sample the light on 2 sides of the surface. I did not implement anisotropic light but think about how you can implement it later on top of the old interface just in case.

 

For sampling the depth maps, I sampled with both bilinear interpolation and the percentage closer method. I took the maximum intensity of both to remove acne from the percentage closer method. The depth bias was calculated dynamically, based on depth map resolution and dimensions of the light source. For a spot light, the bias must be multiplied by the depth (not distance) from the light source.


Edited by Dawoodoz, 02 January 2014 - 10:51 AM.

My open source DirectX 10/11 graphics engine. https://sites.google.com/site/dawoodoz

"My design pattern is the simplest to understand. Everyone else is just too stupid to understand it."


#5 mychii   Members   -  Reputation: 425

Like
0Likes
Like

Posted 02 January 2014 - 11:04 AM

Cool, thanks for the info Dawoodoz!






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