Java-Gaming.org    
Featured games (81)
games approved by the League of Dukes
Games in Showcase (483)
Games in Android Showcase (110)
games submitted by our members
Games in WIP (550)
games currently in development
News: Read the Java Gaming Resources, or peek at the official Java tutorials
 
    Home     Help   Search   Login   Register   
Pages: [1]
  ignore  |  Print  
  2D ray casting lighting problem  (Read 1427 times)
0 Members and 1 Guest are viewing this topic.
Offline PandaMoniumHUN
« Posted 2013-01-05 20:23:02 »

Hey guys, I'm lurking around for a while now but this is my first post, so big hello to you all! Smiley
I'm just getting started with OpenGL and game development so please bear with me guys.
So I've come to the point that I can create all the shapes what I want to, I can handle transformations, and know how to use textures.
I thought that the next step will be 2D lights and shadows but I just can't get it working.
I've read the articles and visited links featured on this forum about it, and I do understand that I should cast "rays" from my lighting spot to all the vertices and then mask away the non visible parts, my only problem is that I don't know how should I do that? Also I don't really understand how to make a lighting source which attenuates with distance.
My thoughts about that is that I just render multiple circles with different opacity, but this sounds like a horrible idea.
For my other problem (lighting and shadows) I've came up with my own crappy solution:
What I do is that I render a light yellow circle with the radius of the light source and low alpha value, then I go through my vertices stored in an ArrayList and check if they're in the radius of the circle and if so then I do extend the vector with "remaining" length (which is getting calculated like this: I calculate the distance between the center of the rendered circle and the vertex and and I substract my radius with it) and I create a vertex at the casted spot (the crossing point of my ray and the vertex) and at the end of the extended vector. I do this with all of the vertices (per object) so I get a black polygon at the end.  Roll Eyes
I know this is really bad solution, altough I've spent a lot of time to make it.
Here's a picture presentating my method (and it's fault when I move light source too close):






I would really appreciate any help.
Thank you all guys, have a nice day Wink

Jumpbutton Studio - INOP Programmer
Can't stress enough: Don't start game development until you haven't got the basics of programming down! Pointing
Offline matheus23

JGO Kernel


Medals: 106
Projects: 3


You think about my Avatar right now!


« Reply #1 - Posted 2013-01-05 20:31:16 »

I guess the best solution is:
float distanceToLight = [...];
float pseudoRadius = Math.sqrt(radius + radius);
float extrusion = pseudoRadius-distanceToLight;

See my:
    My development Blog:     | Or look at my RPG | Or simply my coding
http://matheusdev.tumblr.comRuins of Revenge  |      On Github
Offline PandaMoniumHUN
« Reply #2 - Posted 2013-01-05 20:53:54 »

I guess the best solution is:
float distanceToLight = [...];
float pseudoRadius = Math.sqrt(radius + radius);
float extrusion = pseudoRadius-distanceToLight;

Well, if I understand the code what you gave me correctly then this is exactly what I do right now:
I have a radius to light up, calculate the dark areas and fill them in with polygons.
My only problem is that as you can see on my second picture it's not perfect since the polygon doesn't have as much vertexes as my circle do, and even if it would work I wouldn't be really happy about the result (I kinda want that attenuation).
Maybe I've messed up something, here's my code (it's getting runned for every vertex as you can see):
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
public void render(){
   glColor4f(0.976f, 0.972f, 0.772f, 0.8f);
   glCircle3i(x, y, radius);
   glColor4f(0f, 0f, 0f, 1f);
   glBegin(GL_TRIANGLE_STRIP);
   {
      for(int i = 0; i < vertexes.size(); i++){
         Vector2f[] object_vertexes = vertexes.get(i);
         for(int n = 0; n < object_vertexes.length; n++){
            Vector2f p1 = new Vector2f(x+(debugWidth/2), y+(debugHeight/2));
            Vector2f p2 = object_vertexes[n];
            float distance = (float) Math.sqrt((Math.pow(p2.x-p1.x, 2) + Math.pow(p2.y-p1.y, 2)));
            float remaining = radius-distance;
            Vector2f extendedPoint = new Vector2f(p2.x+(p2.x-p1.x) / distance * remaining, p2.y+(p2.y-p1.y) / distance * remaining);
            glVertex2f(p2.x, p2.y);
            glVertex2f(extendedPoint.x, extendedPoint.y);
         }
      }
   }
   glEnd();
}

Jumpbutton Studio - INOP Programmer
Can't stress enough: Don't start game development until you haven't got the basics of programming down! Pointing
Games published by our own members! Check 'em out!
Legends of Yore - The Casual Retro Roguelike
Offline matheus23

JGO Kernel


Medals: 106
Projects: 3


You think about my Avatar right now!


« Reply #3 - Posted 2013-01-05 20:58:46 »

See the line about the "
pseudoRadius
". It makes the vertices you create extend out even a bit further. (See
Math.sqrt(radius + radius)
, which is the distance from the center of the circle to one of the corners of the surrounding bounding box of the circle)

See my:
    My development Blog:     | Or look at my RPG | Or simply my coding
http://matheusdev.tumblr.comRuins of Revenge  |      On Github
Offline pitbuller
« Reply #4 - Posted 2013-01-05 21:15:32 »

Box2dLights use similar solution. Lights are casting bunch of rays circularly around world and from collision data I make mesh that is rendered with triangle strips. Maybe you could look that code a bit for pointers.
Offline PandaMoniumHUN
« Reply #5 - Posted 2013-01-09 17:38:52 »

Okay, so after some day I've come up with a solution for attenuation with a simple fragment shader. Cool
If anyone else thinking about creating 2D lighting check out my shader: http://glsl.heroku.com/e#5900.4
Also I have to mention that I'm really newbie when it comes to shaders, I've started to learn them 3 hours ago so I'm pretty sure this could be improved, however, it's seems like a nice starting point.  Roll Eyes

Jumpbutton Studio - INOP Programmer
Can't stress enough: Don't start game development until you haven't got the basics of programming down! Pointing
Offline davedes
« Reply #6 - Posted 2013-01-09 19:32:31 »

A slightly more flexible attenuation would be this:
1  
Attenuation = 1.0 / (ConstantAtt + (LinearAtt * Distance) + (QuadraticAtt * Distance * Distance))


Described here (5.5.1) and implemented here.

Extending it to a spotlight effect should not be too tough, either:
http://glsl.heroku.com/e#5700.4

Smiley

Offline PandaMoniumHUN
« Reply #7 - Posted 2013-01-09 20:58:23 »

A slightly more flexible attenuation would be this:
1  
Attenuation = 1.0 / (ConstantAtt + (LinearAtt * Distance) + (QuadraticAtt * Distance * Distance))


Described here (5.5.1) and implemented here.

Extending it to a spotlight effect should not be too tough, either:
http://glsl.heroku.com/e#5700.4

Smiley
I'll definietly try this out tomorrow, thanks for posting it!

Jumpbutton Studio - INOP Programmer
Can't stress enough: Don't start game development until you haven't got the basics of programming down! Pointing
Pages: [1]
  ignore  |  Print  
 
 
You cannot reply to this message, because it is very, very old.

 

Add your game by posting it in the WIP section,
or publish it in Showcase.

The first screenshot will be displayed as a thumbnail.

CopyableCougar4 (18 views)
2014-08-22 19:31:30

atombrot (28 views)
2014-08-19 09:29:53

Tekkerue (25 views)
2014-08-16 06:45:27

Tekkerue (23 views)
2014-08-16 06:22:17

Tekkerue (15 views)
2014-08-16 06:20:21

Tekkerue (22 views)
2014-08-16 06:12:11

Rayexar (63 views)
2014-08-11 02:49:23

BurntPizza (39 views)
2014-08-09 21:09:32

BurntPizza (31 views)
2014-08-08 02:01:56

Norakomi (38 views)
2014-08-06 19:49:38
List of Learning Resources
by Longor1996
2014-08-16 10:40:00

List of Learning Resources
by SilverTiger
2014-08-05 19:33:27

Resources for WIP games
by CogWheelz
2014-08-01 16:20:17

Resources for WIP games
by CogWheelz
2014-08-01 16:19:50

List of Learning Resources
by SilverTiger
2014-07-31 16:29:50

List of Learning Resources
by SilverTiger
2014-07-31 16:26:06

List of Learning Resources
by SilverTiger
2014-07-31 11:54:12

HotSpot Options
by dleskov
2014-07-08 01:59:08
java-gaming.org is not responsible for the content posted by its members, including references to external websites, and other references that may or may not have a relation with our primarily gaming and game production oriented community. inquiries and complaints can be sent via email to the info‑account of the company managing the website of java‑gaming.org
Powered by MySQL Powered by PHP Powered by SMF 1.1.18 | SMF © 2013, Simple Machines | Managed by Enhanced Four Valid XHTML 1.0! Valid CSS!