2011-06-17 27 views
7

Tôi đang cố tạo một bóng đổ tùy chỉnh và đang thử nhiều thứ khác nhau theo thời gian. Một số giải pháp tôi đã tìm thấy hiệu quả hơn, những người khác lại tệ hơn. Đối với câu hỏi này tôi đang sử dụng các giải pháp mà làm việc tốt nhất cho đến nay.Tại sao mã chiếu sáng GLSL thay đổi điểm sáng bằng máy ảnh?

Vấn đề của tôi là, nếu tôi di chuyển "camera" xung quanh, các vị trí ánh sáng dường như cũng di chuyển xung quanh. Giải pháp này có chuyển động rất nhỏ nhưng đáng chú ý trong đó và vị trí ánh sáng dường như ở trên vị trí cần thiết.

Mặc định OpenGL lighting (w/o shaders) hoạt động tốt (ổn định vị trí ánh sáng) nhưng tôi cần đổ bóng cho multitexturing và tôi đang lập kế hoạch sử dụng một phần của nó cho hiệu ứng ánh sáng khi nó làm việc.

Vertex Nguồn:

varying vec3 vlp, vn; 

void main(void) 
{ 
    gl_Position = ftransform(); 

    vn = normalize(gl_NormalMatrix * -gl_Normal); 
    vlp = normalize(vec3(gl_LightSource[0].position.xyz) - vec3(gl_ModelViewMatrix * -gl_Vertex)); 

    gl_TexCoord[0] = gl_MultiTexCoord0; 
} 

Fragment Nguồn:

uniform sampler2D baseTexture; 
uniform sampler2D teamTexture; 
uniform vec4 teamColor; 

varying vec3 vlp, vn; 

void main(void) 
{ 
    vec4 newColor = texture2D(teamTexture, vec2(gl_TexCoord[0])); 
    newColor = newColor * teamColor; 
    float teamBlend = newColor.a; 

    // mixing the textures and colorizing them. this works, I tested it w/o lighting! 
    vec4 outColor = mix(texture2D(baseTexture, vec2(gl_TexCoord[0])), newColor, teamBlend); 

    // apply lighting 
    outColor *= max(dot(vn, vlp), 0.0); 
    outColor.a = texture2D(baseTexture, vec2(gl_TexCoord[0])).a; 

    gl_FragColor = outColor; 
} 

Tôi đang làm gì sai?

+1

Một vài hình ảnh hoặc thậm chí là liên kết tới video trên Youtube của sự cố, sẽ giúp chúng tôi chẩn đoán sự cố. –

Trả lời

5

Tôi không thể chắc chắn bất kỳ vấn đề nào trong số này là vấn đề, nhưng chúng có thể gây ra vấn đề.

Trước tiên, bạn cần phải bình thường hóa của bạn mỗi đỉnh vnvlp (BTW, cố gắng sử dụng tên biến mô tả nhiều hơn. viewLightPosition là dễ dàng hơn nhiều để hiểu hơn vlp). Tôi biết bạn đã chuẩn hóa chúng trong shader vertex, nhưng nội suy đổ bóng sẽ làm mất chuẩn hóa chúng.

Thứ hai, điều này không đặc biệt sai nhiều như dự phòng. vec3(gl_LightSource[0].position.xyz). Các "position.xyz" đã là một vec3, kể từ khi mặt nạ swizzle (".xyz") chỉ có 3 thành phần. Bạn không cần phải chuyển nó vào vec3 một lần nữa.

+1

Wow. Đã chuẩn hóa lại hai biến trong shader fragment một lần nữa, lấy ra sự phủ định cho 'gl_Normal' và' gl_Vertex' trong vertex shader và nó hoạt động. Cảm ơn rất nhiều! –

Các vấn đề liên quan