LWJGL OpenGL 2D照明问题与GLSL

时间:2014-03-04 05:37:42

标签: java opengl glsl lwjgl lighting

我遇到了照明问题。我正在使用GLSL来实现这一目标。一切似乎都很好,但是我有一个问题,我认为它被称为“条带”。从本质上讲,它为我的灯光提供了渐变效果。也许我做错了什么,这是我的代码,我用了很长时间的问题图像。我是GLSL的初学者,不知道我的代码是否是最有效的方法。

主要代码

import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL15.*;
import static org.lwjgl.opengl.GL20.glUseProgram;
import java.util.ArrayList;
import org.lwjgl.LWJGLException;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.util.vector.Vector2f;
import org.lwjgl.util.vector.Vector3f;

public class Main {
public final int width = 1280;
public final int height = 720;

public ArrayList<Light> lights = new ArrayList<Light>();
private Shader shader;
private int bufferIndex;
private float[] vertices;
private Light lighter;
private Vector2f lightPos;
private boolean lockedIn = false;

private void render() {
    glClear(GL_COLOR_BUFFER_BIT);
    for (Light light : lights) {
        shader.bind();
        shader.setUniformf("lightLocation", light.getLocation().x,
                light.getLocation().y);
        shader.setUniform("lightColor", new Vector3f(light.getColors()));
        shader.setUniform("ambientLight", new Vector3f(0.1f, 0.1f, 0.1f));
        shader.setUniform("baseColor", new Vector3f(0.2f, 0.2f, 0.2f));

        glEnable(GL_BLEND);
        glBlendFunc(GL_ONE, GL_ONE);
        VertexBufferObject.GetInstance().render();
        glDisable(GL_BLEND);
        glUseProgram(0);
    }

    Display.update();
    Display.sync(60);
}

private void input() {
    if (Input.getMouse(0))
        lockedIn = true;
    else if (Input.getMouse(1))
        lockedIn = false;

    if (lockedIn) {
        Mouse.setGrabbed(true);
        lightPos.set(Input.getMousePosition().x, Input.getMousePosition().y);

        if (Input.getKey(Input.KEY_UP)) {
            lighter.setBlue((float) (lighter.getBlue() + 1));
            lighter.setRed(lighter.getRed() + 1);
            lighter.setGreen(lighter.getGreen() + 1);
        }

        if (Input.getKey(Input.KEY_DOWN)) {
            lighter.setBlue((float) (lighter.getBlue() - 1));
            lighter.setRed(lighter.getRed() - 1);
            lighter.setGreen(lighter.getGreen() - 1);
        }

        if (Input.getKey(Input.KEY_L)) {
            lights.add(new Light(new Vector2f(Input.getMousePosition().x,
                    Input.getMousePosition().y), lighter.getRed(), lighter
                    .getGreen(), lighter.getBlue()));
            lighter.setBlue((float) Math.random() * 10);
            lighter.setGreen((float) Math.random() * 10);
            lighter.setRed((float) Math.random() * 10);
        }
    } else {
        Mouse.setGrabbed(false);
    }
}

private void setUpObjects() {
    lightPos = new Vector2f(50, 50);
    lighter = new Light(lightPos, 0, 5, 10);
    lights.add(lighter);
    lights.add(new Light(new Vector2f(60, 60), 120, 0, 120));
}

private void initialize() {
    try {
        Display.setDisplayMode(new DisplayMode(width, height));
        Display.setTitle("2D Lighting");
        Display.create();
    } catch (LWJGLException e) {
        e.printStackTrace();
    }

    vertices = new float[] { 0, 0, 0, width, 0, 0, 0, height, 0, width,
            height, 0, 0, height, 0, width, 0, 0 };

    bufferIndex = glGenBuffers();

    int b2 = glGenBuffers();
    VertexBufferObject.GetInstance().addObject(bufferIndex, vertices);
    VertexBufferObject.GetInstance().addObject(
            b2, new float[] { 100, 100, 0, 200, 100, 0, 100, 200, 0, 200, 200,
                    0, 100, 200, 0, 200, 100, 0 });
    VertexBufferObject.GetInstance().initObjects();

    shader = new Shader();
    shader.addFragmentShader(Shader.loadShader("shader.frag"));
            shader.addVertexShader(Shader.loadShader("shader.vertex"));
    shader.compileShader();

    shader.addUniform("ambientLight");
    shader.addUniform("baseColor");
    shader.addUniform("lightLocation");
    shader.addUniform("lightColor");

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, width, height, 0, 1, -1);
    glMatrixMode(GL_MODELVIEW);
}

private void cleanup() {
    shader.unbind();
    Display.destroy();
}

public static void main(String[] args) {
    Main main = new Main();

    main.setUpObjects();
    main.initialize();

    while (!Display.isCloseRequested()) {
        if (Input.getKey(Input.KEY_ESCAPE))
            System.exit(1);

        main.input();
        main.render();
    }
    main.cleanup();
}
}

GLSL代码

#verson 120
uniform vec2 lightLocation;
uniform vec3 lightColor;
uniform vec3 ambientLight;
uniform vec3 baseColor;

void main() { 
vec4 light = vec4(ambientLight, 1);
vec4 color = vec4(baseColor,1);

float distance = length(lightLocation - gl_FragCoord.xy);
float attenuation = 1 / distance;
vec4 lColor = vec4(attenuation, attenuation, attenuation, pow(attenuation, 3)) * vec4(lightColor, 1);
color += lColor;

gl_FragColor = color * light;
}

顶点着色器

#version 120

void main() { 
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

代码的结果:Seems there are gradient like borders surrounding the lights

0 个答案:

没有答案