В последнее время я работаю над пиксельным светом Shader. И все это работает отлично, как и должно быть, за исключением того, что если я изменяю положение модели, сама позиция, похоже, не обновляется в шейдере.GLSL ES обновляет позиции объектов
Некоторая информация, которая может помочь устранить проблему: сама модель не нарисована в шейдере, я импортирую данные нарисованной модели.
Shader код вершинного:
attribute vec3 in_Position; // (x,y,z)
attribute vec3 in_Normal; // (x,y,z) unused in this shader.
attribute vec4 in_Colour; // (r,g,b,a)
attribute vec2 in_TextureCoord; // (u,v)
varying vec2 v_vTexcoord;
varying vec3 v_vPosition;
varying vec3 v_vNormal;
varying vec4 v_vColour;
void main()
{
vec4 object_space_pos = vec4(in_Position.x, in_Position.y, in_Position.z, 1.0);
gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * object_space_pos;
v_vColour = in_Colour;
v_vPosition = in_Position;
v_vNormal = in_Normal;
v_vTexcoord = in_TextureCoord;
}
Shader фрагмент кода:
varying vec2 v_vTexcoord;
varying vec3 v_vPosition;
varying vec3 v_vNormal;
varying vec4 v_vColour;
uniform vec3 Light_Pos;
uniform vec3 Ball_Pos;
vec4 lightIntensity(vec3 ploc,vec3 plig,vec3 col,float rad,vec3 norm){
float dist = distance(ploc,plig);
float intens = max((rad-dist)/rad*0.8,0.0);
vec3 l = vec3(normalize(plig - ploc));
intens = intens*max(dot(norm,l), 0.0);
vec4 res = vec4(col.x,col.y,col.z,intens);
return res;
}
void main()
{
vec3 pos = v_vPosition;
vec3 norm = normalize(v_vNormal);
vec4 col = v_vColour * texture2D(gm_BaseTexture, v_vTexcoord);
vec4 lcol = vec4(col.r,col.g,col.b,0.0);
vec4 intens;
intens = lightIntensity(pos,Light_Pos,vec3(1.0,0.0,0.0),40.0, v_vNormal);
lcol = vec4((lcol.x+intens.x*(intens.w+0.2))/(1.2+intens.w)
,(lcol.y+intens.y*(intens.w+0.2))/(1.2+intens.w)
,(lcol.z+intens.z*(intens.w+0.2))/(1.2+intens.w),lcol.w+intens.w);
intens = lightIntensity(pos,vec3(10.0,-10.0,10.0),vec3(0.0,0.0,1.0),40.0, v_vNormal);
lcol = vec4((lcol.x+intens.x*(intens.w+0.2))/(1.2+intens.w)
,(lcol.y+intens.y*(intens.w+0.2))/(1.2+intens.w)
,(lcol.z+intens.z*(intens.w+0.2))/(1.2+intens.w),lcol.w+intens.w);
gl_FragColor = vec4(lcol.x*lcol.w,lcol.y*lcol.w,lcol.z*lcol.w,col.a);
}
Похоже, что v_vPosition всегда как модель находится в АБВ равен 0. Потому что, когда местоположение шара не находится в нулевой точке, на нем все еще будет освещение, как в нулевой точке.
Вот GIF шейдера делает его работу (как вы можете видеть, я не изменил расположение шара по этой причине): http://imgur.com/fRVcfiR
Извините за шишка, но мне действительно нужно знать, как сделать это – Lolslayer
вам нужно, чтобы показать нам, как вы * изменить положение * из вашей модели, вы обновляете позиции вершин (возможно, вы забыли загрузить обновленные позиции), или установите матрицу трансформации модели (возможно, вы забыли преобразовать матрицу проекции модели)? – BeyelerStudios
@BeyelerStudios Я исправил его уже, спасибо за помощь! :) – Lolslayer