2013-03-13 37 views
5

Tôi đã vật lộn với điều này trong nhiều ngày. Tôi nghĩ rằng cuối cùng tôi đã thu hẹp nó xuống một vấn đề với mỗi tang đỉnh, nhưng tôi không chắc chắn cách tốt nhất để sửa chữa nó.Các vấn đề về đổ bóng của Opengl - hiện vật phản chiếu ánh sáng kỳ lạ

Bối cảnh là ứng dụng iPhone, sử dụng công cụ của riêng tôi. Trình đổ bóng của tôi là một bản đồ vết sưng (bản đồ thông thường) bằng cách sử dụng tiếp tuyến trên mỗi đỉnh để tạo ma trận TBN. Trình đổ bóng đỉnh biến đổi các vectơ ánh sáng và vec-tơ mắt thành không gian tiếp tuyến, chuyển chúng đến trình đổ bóng phân đoạn và tính toán các ánh sáng. Nhưng một số hình học trong hai mô hình thử nghiệm đầu tiên của tôi cho thấy hiện vật lạ trong ánh sáng. Nó là dễ nhất để xem trong thành phần specular.

Khi cố gắng gỡ lỗi, tôi đã thay thế bản đồ bình thường bằng png bình thường bằng phẳng .. tất cả các pixel là 128,128,255. Tôi cũng cứng mã hóa màu sắc.

Mô hình đầu tiên của tôi là hình dạng nút. Nó cho thấy các tạo tác như là một mô phỏng vỏ sò trên vòng ngoài. Điều quan trọng cần lưu ý là phương pháp ánh xạ tia cực tím ở đây là 'phẳng' để làm cho các cạnh vuông góc với bản đồ về cơ bản làm sọc kết cấu ở đó. Tôi sẽ nghĩ rằng điều này sẽ làm cho tangents khó tính toán cho hình học đó vì hai trong số các điểm sẽ có tọa độ kết cấu chính xác giống nhau.

Tôi đã thử gỡ lỗi hiển thị thiết lập gl_FragColor thành các biến khác nhau. Khi thiết lập nó theo tiêu chuẩn mỗi đỉnh, chúng ta thấy scalloping đã biến mất, chỉ ra rằng các normals là chính xác. Nhưng khi đặt nó vào mỗi tang đỉnh, bạn có thể thấy sò điệp.

enter image description here

Hình dạng tiếp theo là hình cầu đơn giản. Với nó, đầu và cuối của mô hình là nơi tạo tác. Trong wireframe bạn sẽ thấy rằng đây là nơi mà một số hình tam giác đang gặp nhau tại một đỉnh. Tôi không thể quấn đầu của tôi xung quanh những gì có nghĩa là cho tangents như mỗi tam giác có bản đồ UV hoàn toàn khác nhau ở đó.

Tôi cho rằng tôi sẽ nhận được rất nhiều Flack nếu tôi không hiển thị mã shader ...

Vertex Shader:

v_fragmentTexCoord0 = a_vertexTexCoord0; 

gl_Position = u_modelViewProjectionMatrix * vec4(a_vertexPosition,1.0); 

vec3 normal = normalize(u_normalMatrix * a_vertexNormal); 
vec3 tangent = normalize(u_normalMatrix * a_vertexTangent); 
vec3 bitangent = cross(normal, tangent); 
mat3 TBNMatrix = mat3(tangent, bitangent, normal); 

v_eyeVec = -a_vertexPosition.xyz; 
v_eyeVec *= TBNMatrix; 

v_lightVec = u_lightPosition - a_vertexPosition.xyz; 
v_lightVec *= TBNMatrix; 

v_normal = a_vertexTangent; 

Fragment Shader:

vec3 norm = texture2D(u_normalSampler, v_fragmentTexCoord0).rgb * 2.0 - 1.0; 
vec4 baseColor = vec4(0.6015625,0.0,0.0,1.0); // is normally texture2D(u_textureSampler,v_fragmentTexCoord0); 

float dist = length(v_lightVec); 
vec3 lightVector = normalize(v_lightVec); 
float nxDir = max(0.0, dot(norm, lightVector)); 
vec4 diffuse = u_lightColorDiffuse * nxDir; 
float specularPower = 0.0; 
if(nxDir != 0.0) 
{ 
    vec3 cameraVector = v_eyeVec; 
    vec3 halfVector = normalize(v_lightVec + cameraVector); 
    float nxHalf = max(0.0,dot(norm, halfVector)); 
    specularPower = pow(nxHalf, u_shininess); 
} 
vec4 specular = u_lightColorSpecular * specularPower; 

gl_FragColor = (diffuse * vec4(baseColor.rgb,1.0)) + specular; 

Trong cố gắng tìm ra bóng đổ và xem tất cả các mẫu và hướng dẫn trực tuyến tôi có thể tìm thấy ... Tôi đã nhầm lẫn bởi lý do tại sao bản đồ đổ bóng sẽ không làm xáo trộn bản đồ bình thường do mô hình 3D cung cấp. Tôi đoán mà không có một số loại điểm tham chiếu như thế nào bạn biết LÀM THẾ NÀO để sửa đổi mô hình bình thường? Theo định hướng nào? Tôi đoán đó là ma trận TBN. Nhưng trong thử nghiệm của tôi trên các vector bình thường trong bản đồ bình thường là 0,0,1 - thẳng lên. Vì vậy, có vẻ như nó không nên sửa đổi nó cả. Bất cứ điều gì lần 1 vẫn còn 1. Nhưng phải có một cái gì đó hơi say đủ trong toán học hoặc trong ma trận TBN rằng nó không đến với cùng một bình thường như là một trong mô hình 3d. Sau đó ý tưởng đó xảy ra với tôi .. rằng trong shader đỉnh của tôi, tôi cũng lần đầu tiên nhân đỉnh bình thường của normalMatrix để có được nó vào mô hình không gian. Nhưng sau đó một lần nữa, những trình gỡ lỗi đó là của đỉnh bình thường trước khi nó được biến đổi.

Có phương pháp nào khác để làm nhiễu loạn mô hình bình thường mà không sử dụng ma trận TBN không? Hiển thị với trình đổ bóng phong mà không có bản đồ bình thường không hiển thị phần tạo tác.

CẬP NHẬT: Tôi gần như tích cực là vấn đề là các tang tiếp xúc được tạo bởi ứng dụng nhập.Sau khi thử các mô hình khác nhau với các Bản đồ UV khác nhau, tôi đang tìm các vấn đề tương tự, đôi khi nó là một bóng tối thay vì một điểm nhấn. Vì vậy, trừ khi tôi có thể áp dụng một bản đồ bình thường mà không có ma trận TBM hoặc chuyển đổi sang không gian tiếp tuyến, tôi sẽ cần phải tìm một nhà nhập khẩu khác.

CẬP NHẬT # 2: Tôi chỉ tìm thấy câu hỏi khác có vẻ như đó có thể là đầu mối cho vấn đề thực sự. 3d graphics, unit vectors and orthogonal matrices

Điều quan trọng cần lưu ý là các đèn lạ này không xảy ra trên đỉnh nhưng chỉ ở giữa chúng. Ngay cả trên hình cầu, chúng ta cũng thấy một chiếc nhẫn nằm giữa đỉnh đầu và những cái bên dưới nó. Tôi bắt đầu tin rằng đây là một vấn đề nội suy. Hãy chỉ là một trong những hình tam giác lên đó:

enter image description here

Bỏ qua bitangent xấu cho một nguyên nhân thứ hai tôi đang tính toán lại đó. Nhưng tangents có cực đối lập. Vì vậy, trong khi được nội suy giữa hai trạng thái của bạn, bạn sẽ nhận được các vectơ trỏ tới khắp nơi.

Câu hỏi mới là làm cách nào để giải quyết? Sửa chữa tangents? Sửa đổ bóng để xử lý nó?

+0

Tại sao không vượt qua các vectơ bình thường và tiếp tuyến (LERP'd) đến trình đổ bóng phân đoạn, và xử lý biến đổi TBN ở đó? Nếu các chỉ tiêu khác nhau ở mỗi đỉnh, bạn sẽ nhận được kết quả mượt mà hơn với các phép tính theo từng đoạn. –

+0

Tôi đoán tôi lo rằng nó sẽ quá chậm. Khi nó có bản đồ kết cấu trên nó và bản đồ vết sưng nó trông thực sự tốt và bạn không nhận thấy nó nhiều. Nếu nó sẽ khắc phục được vấn đề tôi sẽ làm. – badweasel

+0

Nó không có gì nhiều cho một shader, đặc biệt là so với hồ sơ của một cái gì đó giống như chức năng 'pow'. Như bạn nói mặc dù, nó có lẽ không phải là nguồn gốc của vấn đề. –

Trả lời

1

Đôi khi câu trả lời đơn giản nhất là câu trả lời đúng. Các tangents là xấu. Họ không trực giao với bình thường.

tôi tự tính lại tất cả các tiếp tuyến và bitangents bằng cách sử dụng phương pháp mô tả ở đây:

http://www.terathon.com/code/tangent.html

Và vấn đề đó ra đi.