Java-Gaming.org Hi !
 Featured games (91) games approved by the League of Dukes Games in Showcase (755) Games in Android Showcase (229) games submitted by our members Games in WIP (842) games currently in development
 News: Read the Java Gaming Resources, or peek at the official Java tutorials
Pages: [1]
 ignore  |  Print
 Per-pixel lighting (NO SHADERS!)  (Read 6086 times) 0 Members and 1 Guest are viewing this topic.
JonnyGingerKid

Junior Devvie

Medals: 1
Exp: 3 years

 « Posted 2014-04-11 02:31:59 »

Ok guys I recently had the urge to create a per-pixel lighting system. I don't know GLSL (though I want to learn it soon) but I still wanted to do some lighting stuff. I came up with this:

public void renderLight(Vector2f pos /*position of light */){
float transparency = 0, trans1, trans2, trans3, trans4, trans5; //5 levels of lumosity
trans1 = .1f;
trans2 = .2f;
trans3 = .4f;
trans4 = 7f;
trans5 = 1;

for(int x = 0; x < Display.getWidth(); x++){
for(int y = 0; y < Display.getHeight(); y++){

//get distance between current pixel and light source
Vector2f distance, currentPos = new Vector2f(x, y);
currentPos.sub(pos);
distance = new Vector2f(Math.abs(pos.getX() - currentPos.getX()), Math.abs(pos.getY() - currentPos.getY()));

if(distance.getLength() <= 5){
transparency = trans1; //current pixel is 5 pixels away from source

}else if(distance.getLength() <= 10){
transparency = trans2; //current pixel is 10 pixels away from source

}else if(distance.getLength() <= 20){
transparency = trans3; //current pixel is 20 pixels away from source

}else if(distance.getLength() <= 35){
transparency = trans4; //current pixel is 35 pixels away from source

}else if(distance.getLength() >= 50){
transparency = trans5; //current pixel is 50 or more pixels away from source

}

glColor4f(0, 0, 0, transparency);
glBegin(GL_POINTS);
glVertex2f(x, y);
glEnd();
}
}
}

Pretty simple I know. But I'm really proud of it because I've always thought smooth lighting was impossible without shaders. Now obviously the point of per-pixel lighting is for it to be smooth, and I only have 5 levels of lumosity for each pixel. Also you can't customize the strength of the light. Sure the light doesn't cast a shadow, and this system might be really slow. But what I'm asking here is how to make it more smooth (lumosity fades out gradually instead of having 5 levels) and how to customize the strength of the light. Thanks guys!!!!
HeroesGraveDev

JGO Kernel

Medals: 382
Projects: 11
Exp: 4 years

┬─┬ノ(ಠ_ಠノ)(╯°□°)╯︵ ┻━┻

 « Reply #1 - Posted 2014-04-11 02:40:42 »

Just learn GLSL. It's easier.

Drenius
 « Reply #2 - Posted 2014-04-11 03:05:01 »

Its easier for you and its a lot easier for the program.
JonnyGingerKid

Junior Devvie

Medals: 1
Exp: 3 years

 « Reply #3 - Posted 2014-04-11 04:22:34 »

Fine then.... Lol
Longarmx
 « Reply #4 - Posted 2014-04-11 04:29:28 »

 1  2 `float lightStrength = 1.2f;transparency = distance.getLength()/(50f * lightStrength);`

atombrot
 « Reply #5 - Posted 2014-04-11 08:43:23 »

A nice and easy way to do simple per pixel lighting is to create an offscreen texture, render the lights to the offscreen texture (using additive blending) and than multiply this texture with the screen.

Here is how it could look like: https://www.youtube.com/watch?v=0MiVrE5-IhE  You can see that the player pointer and each of the cells emit some light. If many light sources are at the same place, the scene gets lighter, as the light sources add up to eachother (why we use additive blending for the light texture).

I have the idea from a post here (and I think the explanation is much better with the example images as mine): http://www.java-gaming.org/topics/realistic-lighting-in-a-2d-game/20161/view.html

Slyth2727
 « Reply #6 - Posted 2014-04-12 14:11:34 »

When he says offscreen texture he most likely means an FBO. Just clarifying.
trollwarrior1
 « Reply #7 - Posted 2014-04-12 14:25:13 »

To people who say just use shaders, you're kinda wrong. The question he posed here is not whether or not to use shaders. If he used shaders, he would still be posting this question.

@OP
Use code tags [.code][./code](Without .) and that what longarmx said.

The way I did my lighting is divide distance by light strength, and then divide the number you get by some kind of constant ( i did 300)

 1 `float light=distance/light.strength/300.0;`
atombrot
 « Reply #8 - Posted 2014-04-12 14:30:59 »

When he says offscreen texture he most likely means an FBO. Just clarifying.

Yeah, that is correct, sir
Plutoniummatt

Senior Newbie

Medals: 1

 « Reply #9 - Posted 2014-04-17 21:02:32 »

I will echo the first two replies, just learn GLSL
Pages: [1]
 ignore  |  Print

 DesertCoockie (36 views) 2018-05-13 18:23:11 nelsongames (82 views) 2018-04-24 18:15:36 nelsongames (74 views) 2018-04-24 18:14:32 ivj94 (755 views) 2018-03-24 14:47:39 ivj94 (85 views) 2018-03-24 14:46:31 ivj94 (626 views) 2018-03-24 14:43:53 Solater (101 views) 2018-03-17 05:04:08 nelsongames (182 views) 2018-03-05 17:56:34 Gornova (408 views) 2018-03-02 22:15:33 buddyBro (1068 views) 2018-02-28 16:59:18
 Java Gaming Resourcesby philfrei2017-12-05 19:38:37Java Gaming Resourcesby philfrei2017-12-05 19:37:39Java Gaming Resourcesby philfrei2017-12-05 19:36:10Java Gaming Resourcesby philfrei2017-12-05 19:33:10List of Learning Resourcesby elect2017-03-13 14:05:44List of Learning Resourcesby elect2017-03-13 14:04:45SF/X Librariesby philfrei2017-03-02 08:45:19SF/X Librariesby philfrei2017-03-02 08:44:05
 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