renanrosa

OpenGL [GLSL] Simple Deferred Shader with mult light

Recommended Posts

renanrosa    132

Hello, i would to have a simple deferred shader with many light source code.

I have read many tutorials but I could not understand.

I would like a tutorial that I could use as many lights as I want without declaring a constant with the amount of lights.

without 

I would like this effect (but without physical): 

 

maxresdefault.jpg

 

Thank :D

 

Share this post


Link to post
Share on other sites
SradKiller    107
On 06/09/2017 at 10:36 AM, renanrosa said:

Hello, i would to have a simple deferred shader with many light source code.

I have read many tutorials but I could not understand.

I would like a tutorial that I could use as many lights as I want without declaring a constant with the amount of lights.

without 

I would like this effect (but without physical): 

 

maxresdefault.jpg

 

Thank

 

 

up

Share this post


Link to post
Share on other sites

If you want an unlimited (well, not really, but still a LOT) number of lights, I'd look into shader storage buffers. You can specify an unsized array of light data, and just pass a uniform specifying the number of lights. Such as:

uniform int pointLightNumber;

struct PointLightData
{
	// blah blah blah lighting data
};

layout(std430, binding = 0) buffer pointLightArray
{
	PointLightData pointLights[];
};

It does require OpenGL 4.3, however. Also, if you are using a deferred renderer and really want to squeeze some performance out, I'd recommend also looking into tiled deferred lighting. It essentially splits the screen into a grid of tiles, and each tile does a frustum check to see if a point light is in visible in that portion of the screen. If it is, the shader will do the calculations for it, if not, it'll skip it. This way you don't calculate lighting for every light in the scene, even if it's not visible in that portion of the screen. Although if you're not looking for extreme performance, or just want to start out simple and get a lighting system going, I wouldn't worry about this for now.

Here's an article on storage buffers: https://www.khronos.org/opengl/wiki/Shader_Storage_Buffer_Object

Edited by DavidTheFighter
small correction

Share this post


Link to post
Share on other sites
renanrosa    132
On 09/09/2017 at 4:11 PM, DavidTheFighter said:

If you want an unlimited (well, not really, but still a LOT) number of lights, I'd look into shader storage buffers. You can specify an unsized array of light data, and just pass a uniform specifying the number of lights. Such as:


uniform int pointLightNumber;

struct PointLightData
{
	// blah blah blah lighting data
};

layout(std430, binding = 0) buffer pointLightArray
{
	PointLightData pointLights[];
};

It does require OpenGL 4.3, however. Also, if you are using a deferred renderer and really want to squeeze some performance out, I'd recommend also looking into tiled deferred lighting. It essentially splits the screen into a grid of tiles, and each tile does a frustum check to see if a point light is in visible in that portion of the screen. If it is, the shader will do the calculations for it, if not, it'll skip it. This way you don't calculate lighting for every light in the scene, even if it's not visible in that portion of the screen. Although if you're not looking for extreme performance, or just want to start out simple and get a lighting system going, I wouldn't worry about this for now.

Here's an article on storage buffers: https://www.khronos.org/opengl/wiki/Shader_Storage_Buffer_Object

Thank you for your reply.

but using this code, how would you do it in C ++ to set various lights?
I would not want to use an array of lights in GLSL:
PointLightData pointLights [];
it's possible ?

Share this post


Link to post
Share on other sites

If you're going for an "unlimited" number of lights, I'd set up a vector of point lights in C++. Something like std::vector<PointLightData>, with PointLightData being a struct holding the data for each light. You can add or remove lights from it, and update the contents whenever you want. You'd then pass the data of this vector to the shader storage buffer object each frame, with a glBufferData call. Because the array in GLSL is unsized, there's no hard limit to how many point lights you can add, except for hardware limitations (which I doubt you'll reach). As long as the SSBO is backed by data uploaded in C++ from glBufferData(), it's all valid. Some C++ pseudo-code would go something like this:

struct PointLight
{
	vec3 position;
	// whatever other data you want
};

std::vector<PointLight> scenePointLights;
  
void mainLoop()
{
	updatePointLights(); // do whatever logic like physics
	uploadPointLightData(); // call glBufferData() with the data from scenePointLights
	renderScene();
}

An the GLSL pseudo:

struct PointLight
{
	vec3 position;
	// whatever other data
};

 layout(std430, binding = 0) buffer pointLights
 {
     PointLight pointLightData[]; // scenePointLights.data()
 };

uniform int numPointLights; // scenePointLights.size()

void main()
{
	for (int i = 0; i < numPointLights; i ++)
    {
		PointLight p = pointLights.pointLightData[i];
      
    	// Do whatever lighting code
    }
}

This is obviously a little simplified, but it's the basic idea on how to do it. I'd suggest doing a bit of Googling to figure out exactly how all of these work, though. The link I posted earlier shows a few more examples, too.

Share this post


Link to post
Share on other sites

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


  • Similar Content

    • By Arulbabu Donbosco
      There are studios selling applications which is just copying any 3Dgraphic content and regenerating into another new window. especially for CAVE Virtual reality experience. so that the user opens REvite or CAD or any other 3D applications and opens a model. then when the user selects the rendered window the VR application copies the 3D model information from the OpenGL window. 
      I got the clue that the VR application replaces the windows opengl32.dll file. how this is possible ... how can we copy the 3d content from the current OpenGL window.
      anyone, please help me .. how to go further... to create an application like VR CAVE. 
       
      Thanks
    • By cebugdev
      hi all,

      i am trying to build an OpenGL 2D GUI system, (yeah yeah, i know i should not be re inventing the wheel, but this is for educational and some other purpose only),
      i have built GUI system before using 2D systems such as that of HTML/JS canvas, but in 2D system, i can directly match a mouse coordinates to the actual graphic coordinates with additional computation for screen size/ratio/scale ofcourse.
      now i want to port it to OpenGL, i know that to render a 2D object in OpenGL we specify coordiantes in Clip space or use the orthographic projection, now heres what i need help about.
      1. what is the right way of rendering the GUI? is it thru drawing in clip space or switching to ortho projection?
      2. from screen coordinates (top left is 0,0 nd bottom right is width height), how can i map the mouse coordinates to OpenGL 2D so that mouse events such as button click works? In consideration ofcourse to the current screen/size dimension.
      3. when let say if the screen size/dimension is different, how to handle this? in my previous javascript 2D engine using canvas, i just have my working coordinates and then just perform the bitblk or copying my working canvas to screen canvas and scale the mouse coordinates from there, in OpenGL how to work on a multiple screen sizes (more like an OpenGL ES question).
      lastly, if you guys know any books, resources, links or tutorials that handle or discuss this, i found one with marekknows opengl game engine website but its not free,
      Just let me know. Did not have any luck finding resource in google for writing our own OpenGL GUI framework.
      IF there are no any available online, just let me know, what things do i need to look into for OpenGL and i will study them one by one to make it work.
      thank you, and looking forward to positive replies.
    • By fllwr0491
      I have a few beginner questions about tesselation that I really have no clue.
      The opengl wiki doesn't seem to talk anything about the details.
       
      What is the relationship between TCS layout out and TES layout in?
      How does the tesselator know how control points are organized?
          e.g. If TES input requests triangles, but TCS can output N vertices.
             What happens in this case?
      In this article,
      http://www.informit.com/articles/article.aspx?p=2120983
      the isoline example TCS out=4, but TES in=isoline.
      And gl_TessCoord is only a single one.
      So which ones are the control points?
      How are tesselator building primitives?
    • By Orella
      I've been developing a 2D Engine using SFML + ImGui.
      Here you can see an image
      The editor is rendered using ImGui and the scene window is a sf::RenderTexture where I draw the GameObjects and then is converted to ImGui::Image to render it in the editor.
      Now I need to create a 3D Engine during this year in my Bachelor Degree but using SDL2 + ImGui and I want to recreate what I did with the 2D Engine. 
      I've managed to render the editor like I did in the 2D Engine using this example that comes with ImGui. 
      3D Editor preview
      But I don't know how to create an equivalent of sf::RenderTexture in SDL2, so I can draw the 3D scene there and convert it to ImGui::Image to show it in the editor.
      If you can provide code will be better. And if you want me to provide any specific code tell me.
      Thanks!
    • By Picpenguin
      Hi
      I'm new to learning OpenGL and still learning C. I'm using SDL2, glew, OpenGL 3.3, linmath and stb_image.
      I started following through learnopengl.com and got through it until I had to load models. The problem is, it uses Assimp for loading models. Assimp is C++ and uses things I don't want in my program (boost for example) and C support doesn't seem that good.
      Things like glVertexAttribPointer and shaders are still confusing to me, but I have to start somewhere right?
      I can't seem to find any good loading/rendering tutorials or source code that is simple to use and easy to understand.
      I have tried this for over a week by myself, searching for solutions but so far no luck. With tinyobjloader-c and project that uses it, FantasyGolfSimulator, I was able to actually load the model with plain color (always the same color no matter what I do) on screen and move it around, but cannot figure out how to use textures or use its multiple textures with it.
      I don't ask much: I just want to load models with textures in them, maybe have lights affect them (directional spotlight etc). Also, some models have multiple parts and multiple textures in them, how can I handle those?
      Are there solutions anywhere?
      Thank you for your time. Sorry if this is a bit confusing, English isn't my native language
  • Popular Now