【问题标题】:How to improve a look of a 2d light?如何改善二维光的外观?
【发布时间】:2019-12-24 22:23:13
【问题描述】:

我想要一盏漂亮的灯。我不确定我应该如何称呼它,但是当我实际展示一些示例时,您会看到。

我所说的nice就像这样的场景:

看起来光有一些区域,它在某个地方结束。

我试图做的是计算从当前像素到灯光位置的距离并将距离用作灯光,它看起来一点也不好看

我的最后一个镜头是尝试 3d 闪电技术。我为场景定义了一个法线 vec3(0.0f, 0.0f, 1.0f) 并计算了一个点光源

struct PointLight
{
    vec3 position;

    float constant;
    float linear;
    float quadratic;  

    vec3 ambient;
    vec3 diffuse;
};

vec3 CalcPointLight(PointLight light, vec3 fragPos)
{
    vec3 normal = normalize(vec3(0.0f, 0.0f, 1.0f));

    vec3 lightDir = normalize(light.position - fragPos);
    float diff = max(dot(normal, lightDir), 0.0);

    float distance = length(light.position - fragPos);
    float attenuation = 1.0 / (light.constant + light.linear * distance + 
                 light.quadratic * (distance * distance));    

    vec3 ambient = light.ambient;
    vec3 diffuse = light.diffuse * diff;

    ambient *= attenuation;
    diffuse *= attenuation;

    return ambient + diffuse;
} 

像这样轻装上阵:

    PointLight light;
    light.position = vec3(0.0f, 0.0f, 0.005f);
    light.constant = 0.5f;
    light.linear = 0.09f;
    light.quadratic = 0.032f;
    light.ambient = vec3(0.1f);
    light.diffuse = vec3(0.8f);

    vec3 result = CalcPointLight(light, vec3(v_position, 0.0f));

    f_color = vec4(result, 1.0) * texture(u_texture, v_uv);

它在我讨厌的光中间有一个点! (当z 光的位置是0 [也并非总是如此,有时光不起作用],它看起来很奇怪),我的场景变得越来越暗,当第一个屏幕截图有这个“最大”黑暗值,总体而言,我的灯光看起来并不像上面的屏幕那么酷。

整个着色器

#version 460 core

out vec2 v_uv;
out vec2 v_position;

vec4 position[4] = {
    vec4(-1.0f, 1.0f, 0.0f, 1.0f),
    vec4(-1.0f, -1.0f, 0.0f, 0.0f),
    vec4(1.0f, -1.0f, 1.0f, 0.0f),
    vec4(1.0f, 1.0f, 1.0f, 1.0f)
};

void main()
{
    v_uv = position[gl_VertexID].zw;
    v_position = position[gl_VertexID].xy;
    gl_Position = vec4(position[gl_VertexID].xy, 0.0f, 1.0f);
}
#version 460 core

layout (location = 0) out vec4 f_color;

in vec2 v_uv;
in vec2 v_position;

uniform sampler2D u_texture;

struct PointLight
{
    vec3 position;

    float constant;
    float linear;
    float quadratic;  

    vec3 ambient;
    vec3 diffuse;
};

PointLight pointLights[4];

vec3 CalcPointLight(PointLight light, vec3 fragPos)
{
    vec3 normal = normalize(vec3(0.0f, 0.0f, 1.0f));

    vec3 lightDir = normalize(light.position - fragPos);
    float diff = max(dot(normal, lightDir), 0.0);

    float distance = length(light.position - fragPos);
    float attenuation = 1.0 / (light.constant + light.linear * distance + 
                 light.quadratic * (distance * distance));    

    vec3 ambient = light.ambient;
    vec3 diffuse = light.diffuse * diff;

    ambient *= attenuation;
    diffuse *= attenuation;

    return ambient + diffuse;
} 

void main()
{        
    PointLight light;
    light.position = vec3(0.0f, 0.0f, 0.005f);
    light.constant = 1.0f;
    light.linear = 0.09f;
    light.quadratic = 0.032f;
    light.ambient = vec3(0.1f);
    light.diffuse = vec3(0.8f);

    vec3 result = CalcPointLight(light, vec3(v_position, 0.0f));

    light.position = vec3(-0.5f, 0.7f, 0.005f);
    light.constant = 0.5f;
    light.linear = 0.09f;
    light.quadratic = 0.032f;
    light.ambient = vec3(0.1f);
    light.diffuse = vec3(0.8f);

   // result += CalcPointLight(light, vec3(v_position, 0.0f));

    light.position = vec3(0.5f, 0.5f, 0.00f);
    light.constant = 1.0f;
    light.linear = 0.09f;
    light.quadratic = 0.032f;
    light.ambient = vec3(0.1f);
    light.diffuse = vec3(0.8f);

   // result += CalcPointLight(light, vec3(v_position, 0.0f));

    f_color = vec4(result, 1.0) * texture(u_texture, v_uv);
}

如何实现第一张照片中的效果?

【问题讨论】:

  • 你能解释一下“它看起来一点也不好看”是什么意思吗?它有什么问题?
  • 我确实解释过了。看看第一张照片和我的照片。这是第一点。第二点是THE DOT!,第三点,我的光线越来越暗,第一张照片有一些最大范围。乍一看,第一个场景的灯光看起来好多了。

标签: opengl glsl 2d light


【解决方案1】:

你可以做一个smoothstep,比如:

gl_FragColor = smoothstep( yourFinalColour, vec3( 0 ), length( yourLight, uv );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    相关资源
    最近更新 更多