Na FreeHostingu Endora běží desítky tisíc webů. Přidejte se ještě dnes!

Vytvořit web zdarma

Na FreeHostingu Endora běží desítky tisíc webů. Přidejte se ještě dnes!

Vytvořit web zdarma

This website is still under construction.


To create good shield effect, we need to combine 2 effects.
We will use a sphere for the shield but it should be applicable on other shapes too.

Active Effect

This effect should emulate the solidity of the shield.
We will need a normal vector (vector up from face) and vector from the point to camera. Angle between those two vectors is our transparency.
The angle ranges from 0° to 90°. 0° is full transparency (no color, middle of the sphere), 90° is no transparency (full color, edges of the sphere).
The angle is calculated using Dot product (dot() in shader).


//FIXME rotate normals
//TODO compare to Shield on Unity3D wiki

Color

//THINK calculate angleToCamera in fragment shader? #version 330 core layout(location = 0) in vec3 vPosition; layout(location = 1) in vec3 vNormal; uniform mat4 M; uniform mat4 V; uniform mat4 P; uniform mat4 MV; uniform mat4 VP; uniform mat4 MVP; uniform vec3 Camera_world; out float angleToCamera; void main() { gl_Position = MVP * vPosition; vec3 cameraNormal = Camera_world - (M * vec4(vPosition)).xyz; angleToCamera = dot(cameraNormal, vNormal); }
#version 330 core in float angleToCamera; uniform vec3 OverallColor; out vec4 color; void main() { color = vec4(OverallColor, angleToCamera); }

Texture

#version 330 core layout(location = 0) in vec3 vPosition; layout(location = 1) in vec3 vNormal; layout(location = 2) in vec2 vUV; uniform mat4 M; uniform mat4 V; uniform mat4 P; uniform mat4 MV; uniform mat4 VP; uniform mat4 MVP; uniform vec3 Camera_world; out float angleToCamera; out vec2 uv; void main() { gl_Position = MVP * vPosition; vec3 cameraNormal = Camera_world - (M * vec4(vPosition)).xyz; angleToCamera = dot(cameraNormal, vNormal); }
#version 330 core in float angleToCamera; in vec22 uv; uniform sampler2D MainTexture; out vec4 color; void main() { color = vec4(texture(MainTexture, uv).xyz, angleToCamera); }

Hit Effect

This effect is rendered for every hit (for few ticks with different transparency).
The effect may have problems with overlapping too many effects. To limit the problem, I recommend you to order the effects by its remaining duration (earliest hit to be rendered first).