2014-01-08 2 views
0

그래서 나는 범프 맵핑을 얼마 동안 구현하려고 노력 중이고 어떤 방식 으로든 작동하도록했습니다. 그래서 텍스쳐와 쉐도 잉은 올바르지 만 광원 주위가 움직이면서 바뀌지는 않습니다. 나는 광원이 세계 어디에 있는지가 아닌 소스 (0,0)에서 움직이는 광원을 적용한다고 결정했습니다. 셰이더에서 조각의 세계 위치를 어떻게 결정합니까? 나는 약간의 순간 붙어있어, 어떤 도움을 주시면 감사하겠습니다.glsl, JOGL의 정점 세계 위치

--vertex 쉐이더

void main() 
{ 
    gl_TexCoord[0] = gl_MultiTexCoord0; 

    // Set the position of the current vertex 
    gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex; 
} 

--fragment 쉐이더

uniform sampler2D color_texture; 
uniform sampler2D normal_texture; 
uniform vec4 lightColor; 
uniform vec3 falloff; 
uniform vec3 lightPos; 
uniform vec2 resolution; 
uniform float ambience; 
//uniform float lightDirection; 

void main() 
{ 
    // Extract the normal from the normal map 
    vec3 normal = normalize(texture2D(normal_texture, gl_TexCoord[0].st).rgb * 2.0 - 1.0); 

    // Determine where the light is positioned 
    vec3 light_pos = normalize(lightPos); 
    //vec3 light_pos = normalize(vec3(1.0, 1.0, 0.5)); 

    // Calculate the lighting diffuse value, the ambience is the darkness due to no light 
    float diffuse = max(dot(normal, light_pos), 0.0); 

    //direction 
    float lightDir = length(vec3(lightPos.xy - (gl_FragCoord.xy/resolution.xy), lightPos.z)); 

    //calculate attenuation 
    float attenuation = 1.0/(falloff.x + (falloff.y*lightDir) + (falloff.z*lightDir*lightDir)); 

    //calculate the final color 
    vec3 color = diffuse * texture2D(color_texture, gl_TexCoord[0].st).rgb; 

    // Set the output color of our current pixel 
    gl_FragColor = vec4(color, 1.0); 
} 

--jogl, 자바 코드는

int shaderProgram = ShaderControl.enableShader(gl, shaderName); 

     //apply vars 
     int diffuseTextureVariableLocation = gl.getGL2().glGetUniformLocation(shaderProgram, "color_texture"); 
     int normalColorVariableLocation = gl.getGL2().glGetUniformLocation(shaderProgram, "normal_texture"); 
     int lightPositionVariableLocation = gl.getGL2().glGetUniformLocation(shaderProgram, "lightPos"); 
     int lightColorVariableLocation = gl.getGL2().glGetUniformLocation(shaderProgram, "lightColor"); 
     int falloffVariableLocation = gl.getGL2().glGetUniformLocation(shaderProgram, "falloff"); 
     int resolutionVariableLocation = gl.getGL2().glGetUniformLocation(shaderProgram, "resolution"); 
     int ambienceVariableLocation = gl.getGL2().glGetUniformLocation(shaderProgram, "ambience"); 

     gl.getGL2().glUniform1i(diffuseTextureVariableLocation, 0); 
     gl.getGL2().glUniform1i(normalColorVariableLocation, 1); 
     gl.getGL2().glUniform3f(lightPositionVariableLocation, positionLight.x, positionLight.y, 1.5f); 
     gl.getGL2().glUniform4f(lightColorVariableLocation, 1f, 1.0f, 1.0f, 1f); 
     gl.getGL2().glUniform3f(falloffVariableLocation,.4f, 3f, 20f); 
     gl.getGL2().glUniform2f(resolutionVariableLocation, Game._viewPortDimension.width, Game._viewPortDimension.height); 
     gl.getGL2().glUniform1f(ambienceVariableLocation, 0.93f); 

     gl.getGL2().glActiveTexture(GL2.GL_TEXTURE1); 
     normalTexture.bind(gl); 

     //bind diffuse color to texture unit 0 
     gl.getGL2().glActiveTexture(GL2.GL_TEXTURE0); 
     texture.bind(gl); 

     //draw the texture and apply the bump mapping shader 
     drawTexture(gl, worldOffsetX, worldOffsetY, x, y, depth, rotation, percentageToDraw, width, height, texture); 

     ShaderControl.disableShader(gl); 

종류가 Johandre

답변

0
에 관하여 쉐이더를 접선

첫째, 정말로 필요로하는지 확인하십시오. 일단 당신이 세계 위치를 보유하고있는 버텍스 쉐이더로부터 보간 된 조각 쉐이더에 varying vec3을 생성 할 수 있습니다. 이를 수행하려면 모델 뷰 매트릭스와 프로젝션 매트릭스가 분리되어 있어야합니다. (나는 지금까지 만든 게임에 대해서만 투영 행렬을 선호한다). varying vec3에 대한 modelview 행렬의 출력을 사용하십시오.

관련 문제