栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

[Java] [OpenGL ES 3.2] 平面阴影

[Java] [OpenGL ES 3.2] 平面阴影

原理

影子可以让人判断距离,比如物理世界1.3中,没有影子就让我以为物体还要飞一会儿,然后成功地判断失误了…
其实实现原理很简单,就是把物体按照光方向拍成2维的,然后绘制在平面上就行了,只要用到一个有点复杂的公式(详见《OpenGL ES 3.x游戏开发(下卷)》P126 )

代码

shadow.vert

#version 320 es
precision mediump float;

layout(location=0)in vec3 a_position;
layout(location=1)in vec4 a_color;
layout(location=2)in vec3 a_normal;
layout(location=3)in vec3 a_texCoord;
out vec4 v_color;
out vec3 v_normal;
out vec3 v_texCoord;
out vec3 v_position;

uniform mat4 u_model;
uniform mat4 u_view;
uniform mat4 u_projection;

uniform bool u_enableShadow;
uniform vec3 u_lightdirection;

void main()
{
    if(u_enableShadow)
    {
        vec3 A = vec3(0.0,1.0,0.0);
        vec3 N = vec3(0.0,1.0,0.0);
        vec3 S = a_position - (100.0 * normalize(u_lightdirection));
        vec3 V = vec3(u_model * vec4(a_position,1.0));
        vec3 VL = S + (V - S) * (dot(N,(A - S)) / dot(N,(V - S)));
        gl_Position = u_projection * u_view * vec4(VL,1.0);
    }
    else
    {
        gl_Position = u_projection * u_view * u_model * vec4(a_position,1.0);
    }
    v_color = a_color;
    v_normal = normalize(vec3(u_model * vec4(a_normal,0.0)));
    v_texCoord = a_texCoord;
    v_position = normalize(vec3(u_model * vec4(a_position,0.0)));
}

lighting.frag

#version 320 es
precision mediump float;

in vec3 v_position;
in vec4 v_color;
in vec3 v_normal;
in vec3 v_texCoord;
out vec4 o_color;

uniform vec3 u_lightdirection;
uniform vec3 u_cameraposition;

uniform sampler2D sampler;
uniform bool u_enableTexture;
uniform vec4 u_color;

uniform bool u_enableShadow;

void main()
{
    if(u_enableShadow)
    {
        o_color = vec4(0.1,0.1,0.1,1.0);
    }
    else
    {
        vec3 lightdirection = normalize(u_lightdirection);
        float ambient = 0.5;
        float diffuse = max(dot(v_normal,-lightdirection),0.0);
        vec3 reflectdirection = normalize(reflect(lightdirection,v_normal));
        vec3 viewdirection = normalize(u_cameraposition - v_position);
        float specular = pow(max(dot(viewdirection,reflectdirection),0.0),32.0);
        
        vec4 color = vec4(0.0,0.0,0.0,0.0);
        if(u_enableTexture)
        {
            color = texture(sampler,vec2(v_texCoord));
        }
        else
        {
            color = u_color;
        }
        
        o_color = (ambient + diffuse + specular) * color;
    }
}
效果图

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/746568.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号