Шукати в цьому блозі

Normal map шейдер для кількох джерел світла


було

стало


ps.glsl
-------------------------------------------------------------------------------------------
uniform lowp sampler2D g_Texture;
uniform lowp vec4 g_Color;
// вказати кількість джерел
#define NUM_LIGHTS 2
uniform mediump vec4 lightPos[NUM_LIGHTS];

varying highp vec2 texCoord;
varying mediump vec2 position;




void main()
{

// Візьміть основний піксельний колір із класичної текстури
lowp vec3 color0 = texture2D(g_Texture, texCoord).rgb;

//Встановіть specular (тобто 'блиск') 30% сірий
lowp vec3 color1 = vec3(0.3, 0.3, 0.3);

//-Convert RGB (range 0->1) to XYZ (range -1 -> 1)
// Візьміть звичайний вектор з правої частини текстури:
// - Відставити на 0.5 праворуч у нормалізованих координатах (1 = повна ширина текстури)
// - Перетворити RGB (діапазон 0-> 1) у XYZ (діапазон -1 -> 1)
mediump vec3 normal = texture2D(g_Texture, texCoord + vec2(0.5, 0.0)).rgb * 2.0 - 1;

lowp vec3 lightContributions=vec3(0,0,0);
int index;
for (index = 0; index < NUM_LIGHTS; index++) // вказати кількість джерел світла
{
//Обчисліть напрямок світла, припускаючи відстань світла 150 одиниць
mediump vec3 lightDir = normalize(vec3(lightPos[index].xy, 150) - vec3(position.xy, 0));


/// Обчисліть напрямок світла так, ніби світло було в два рази далі (for specular)
mediump vec3 halfdir = normalize(normalize(lightDir) + vec3(0, 0, 1));

//Обчисліть дифузний коефіцієнт: normal і lightDir colinear -> 1, perpendicular -> 0
lowp float diff = max(0.0, dot(normal, lightDir));

//Оцініть specular фактор так само, але з експоненціальною шкалою
mediump float nh = max(0.0, dot(normal, halfdir));
mediump float spec = pow(nh, 10.0);


lightContributions=lightContributions+ (color0 * diff + color1 * spec);
}
gl_FragColor = g_Color * vec4(lightContributions.rgb, 1);

}

//-=========================================================
--Lua код


local effect = Shader.new("vs","ps",0,
{
{name="g_MVPMatrix",type=Shader.CMATRIX,sys=Shader.SYS_WVP, vertex=true},
{name="g_Color",type=Shader.CFLOAT4,mult=1,sys=Shader.SYS_COLOR},
{name="lightPos",type=Shader.CFLOAT4,mult=2,vertex=false}, --Two lights
{name="g_Texture",type=Shader.CTEXTURE,mult=1,vertex=false}
},
{
{name="POSITION0",type=Shader.DFLOAT,mult=3,slot=0,offset=0},
{name="vColor",type=Shader.DUBYTE,mult=0,slot=1,offset=0},
{name="TEXCOORD0",type=Shader.DFLOAT,mult=2,slot=2,offset=0}
})

effect:setConstant("lightPos", Shader.CFLOAT4, 2, x, y,0,0,y, x,0,0) --// 2 джерела і їх координати