使用着色器绘制2d灯光?

时间:2015-09-29 18:44:25

标签: java opengl glsl lwjgl

我想知道如何像这里一样创建2D灯:

https://www.youtube.com/watch?v=mVlYsGOkkyM

在这里:

https://www.youtube.com/watch?v=nSf1MpsWKig

阴影目前不符合我的兴趣。 我尝试了一些东西,但它们似乎没有用。所以我目前所拥有的只是片段和顶点着色器,其中几乎没有任何东西。

2 个答案:

答案 0 :(得分:2)

照明几乎是计算机图形学的主要问题,有几种常用的实现灯光的方法:

更简单但有限的方式称为“foward着色”,一般的想法是将所有关于光照(环境光,光线位置和颜色等)的信息提供给着色器,该着色器渲染几何体并计算光照直接在您渲染的每个表面上。限制是您只能将固定数量的灯光传递到着色器。

另一种方式称为“延迟着色”,它通常用于现代游戏引擎中。渲染时不是点亮几何体,而是仅收集几何体的每个像素(位置,颜色,法线等)的相关数据,并将其存储在帧缓冲区中。然后,您可以使用数据渲染任意数量的灯光。 OGLdev有一个很好的延迟着色教程,但是如果你是初学者,你可能想要避免它,因为它很难设置并且在旧硬件上很慢。 http://ogldev.atspace.co.uk/www/tutorial35/tutorial35.html

GLSL中的一般照明配方也是:

// Vector from the current pixel to the light
vec3 toLight = (lightpos - pixelpos);

// This computes how much is the pixel lit based on where it faces
float brightness = clamp(dot(normalize(toLight), pixelnormal), 0.0, 1.0);

// If it faces towards the light it is lit fully, if it is perpendicular
// to the direction towards the light then it is not lit at all.

// This reduces the brightness based on the distance form the light and the light's radius
brightness *= clamp(1.0 - (length(toLight) / lightradius), 0.0, 1.0);
// The final color of the pixel.
vec3 finalcolor = pixelcolor * lightcolor * brightness;
// If you have multiple lights multiply the pixel's color by the combined color of all lights
// like:
finalcolor = pixelcolor * (lightcolor1 * brightness1 + lightcolor2 * brightness2);

// Note that some things are clamped to avoid going into negative values

答案 1 :(得分:0)

有两种方法可以使用LWJGL提供的构建方法,可能是最简单的方法。首先,您需要启用灯光,然后您可以调用方法glLight()来放置指定灯光。

例如:

FloatBuffer position = BufferUtils.createFloatBuffer(4);
float[] posArray = {0f, 0f, 0f, 1f};
position.put(posArray);
position.flip();

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightModel(GL_LIGHT_MODEL_AMBIENT, position));
glLight(GL_LIGHT0, GL_DIFFUSE, position2)); // position2's definition not shown

修改:忘记添加实际灯光