GLSL ES更新对象位置

时间:2016-08-09 18:32:26

标签: shader fragment-shader vertex-shader pixel-shader glsles

最近我一直在研究每像素点光源着色器。这一切都完美无缺,但如果我改变模型的位置,那么位置本身似乎不会在着色器中更新。

有助于解决问题的一些信息:模型本身未在着色器中绘制,我导入绘制模型的数据。

着色器顶点代码:

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;
}

着色器片段代码:

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总是像模型在xyz等于0.因为当球的位置不在零点时,它仍然会像它在零点一样点亮它。 / p>

这是一个着色器的GIF做的工作(你可以看到,因为这个原因我没有改变球的位置): http://imgur.com/fRVcfiR

1 个答案:

答案 0 :(得分:0)

您的顶点着色器正在将v_vPosition设置为模型空间中的顶点的位置。最有可能的是,您打算在世界空间中使用顶点的位置

您的顶点着色器需要使用世界矩阵变换位置。这一行:

v_vPosition = in_Position;

可能会变成:

v_vPosition = gm_Matrices[MATRIX_WORLD] * object_space_pos;