2016-08-09 19 views
0

요즘 나는 픽셀 포인트 라이트 쉐이더 당 작업을하고 있습니다. 그리고 모델의 위치를 ​​변경하면 위치 자체가 쉐이더에서 업데이트되지 않는 것처럼 보이기 때문에 완벽하게 작동합니다.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 같을 때 위치 때문에 공이 0 점에 있지 않으면 영점에있는 것처럼 점등됩니다. http://imgur.com/fRVcfiR

+0

미안하지만, 당신이 *의 위치 *를 변경하는 방법 난 정말 당신이 우리를 보여줄 필요가이 – Lolslayer

+0

을 수행하는 방법을 알 필요가 (아마도 업데이트 된 위치를 업로드하는 것을 잊었을 것입니다.) 모델 변형 행렬을 설정합니다 (아마도 모델 뷰 투영 행렬을 변환하는 것을 잊었을 것입니다)? – BeyelerStudios

+0

@BeyelerStudios 나는 이미 도움을 주셔서 감사합니다. :) – Lolslayer

답변

0

귀하의 버텍스 쉐이더가 설정되어 v_vPosition을의 위치에 : 여기

는 (나는 이런 이유로 공의 위치를 ​​변경하지 않은, 당신이 볼 수있는)이 작업의 수행 쉐이더의 GIF입니다 모형 공간에있는 정점 . 대부분의 경우 사용자가 의도 한 바는 세계 공간에서 정점 의 위치를 ​​사용하는 것입니다.

정점 셰이더는 월드 매트릭스를 사용하여 위치를 변환해야합니다. 그래서 라인 :

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