GLSL ES更新对象位置

问题描述:

最近我一直在研究每像素点光源着色器。这一切都是完美的,因为例外情况是,如果我改变模型的位置,位置本身似乎不会在着色器中更新。GLSL ES更新对象位置

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

顶点着色器代码:

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。因为当位置的球不在零点上,它仍然会有照明,就像它在零点一样。

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

+0

对不起,磕碰,但我真的需要知道如何做到这一点 – Lolslayer

+0

你需要告诉我们你*如何改变位置*你的模型,你是否更新顶点位置(也许你忘了上传更新后的位置),或者设置模型变换矩阵(也许你忘了改变你的模型视图投影矩阵)? – BeyelerStudios

+0

@BeyelerStudios我已经修复了,谢谢你提供帮助:) – Lolslayer

你的顶点着色器设置v_vPosition到的位置模型空间中的顶点。最有可能的是,你的目标是在世界空间中使用顶点的位置。

顶点着色器需要使用世界矩阵变换位置。因此该行:

v_vPosition = in_Position; 

可能变成类似:

v_vPosition = gm_Matrices[MATRIX_WORLD] * object_space_pos; 
+0

是的,它现在已经修复了,谢谢! :) 结果如下: https://forum.yoyogames.com/index.php?threads/real-time-3d-light-and-shadows.4182/#post-38414 – Lolslayer