Cố gắng hiểu ánh sáng trên Opengl, làm thế nào để mô phỏng ánh sáng mặt trời thực tế?


13

Tôi không biết mình đang làm gì sai hay thiếu thứ gì nhưng tôi muốn mô phỏng ánh sáng mặt trời, như trong một ngày nắng.

Khi vật thể đối diện với ánh sáng định hướng, nó sẽ sáng và không có vấn đề gì ở đó. Nếu tôi đi xung quanh vật thể và nhìn nó trở lại, trời tối. Trời không quá tối vì tôi đang sử dụng GL_AMBIENTnhưng trời vẫn quá tối cho một ngày nắng. Nếu tôi tăng giá trị, nó sẽ không bao giờ trông đẹp hơn vì mặt của vật thể đối diện với ánh sáng sẽ quá sáng.

Và có một vấn đề khó chịu khác với ánh sáng xung quanh, khi nhìn vào mặt sau của vật thể, tôi không thể thấy bất kỳ hình dạng nào, chỉ có một màu đơn giản. Khó giải thích, đây là một số hình ảnh:

Mặt trước đối tượng: http://i.stack.imgur.com/YW53X.png
Quay lại đối tượng: http://i.stack.imgur.com/Qufha.png

Như bạn có thể dễ dàng nhìn thấy, mặt trước trông rất đẹp, bạn có thể thấy hình dạng của thứ màu đỏ đó. Ở mặt sau, nó đơn giản, bạn không thể thấy hình dạng tương tự.

Bây giờ, tôi biết rằng tôi đang nhìn vào mặt sau của một vật thể và tôi đang nhìn theo hướng ánh sáng và nó sẽ tối hơn mặt trước. Nhưng nó không nên trông đơn giản như thế này. Đó không phải là những gì chúng ta thấy khi đi ngược lại ánh sáng mặt trời nhìn vào một vật thể nào đó, chúng ta thấy rằng các vật thể đó hình thành một số hình dạng.

Làm cách nào tôi có thể có hiệu ứng tương tự (hoặc tương tự) trên OpenGL?

Ánh sáng của tôi hiện được định nghĩa như thế này:

float posLight0[4] = {-1.0f, 1.0f, 1.0f, 0.0f};
float ambLight0[4] = {0.5f, 0.5f, 0.5f, 0.5f};

glLightfv(GL_LIGHT0, GL_POSITION, posLight0);
glLightfv(GL_LIGHT0, GL_AMBIENT, ambLight0);

Tôi đề nghị bạn nên cân nhắc sử dụng shader, nếu có thể. Đường ống chức năng cố định OpenGL sử dụng mô hình chiếu sáng khá đơn giản, trong khi các bóng đổ cho bạn toàn quyền kiểm soát toán học.
Nhà sư tuyệt vời

Câu trả lời:


11

Với ánh sáng xung quanh, các vật thể của bạn có vẻ quá sáng vì ánh sáng khuếch tán được thêm vào ánh sáng xung quanh và ánh sáng khuếch tán mặc định là 1.0. Điều này thêm tới 1,5 và mọi thứ trên 1.0 được kẹp lại. Đặt ánh sáng khuếch tán thành 0,5:

float difLight0[4] = {0.5f, 0.5f, 0.5f, 1.0f};
glLightfv(GL_LIGHT0, GL_DIFFUSE, difLight0);

Vấn đề thứ hai khó giải quyết hơn. Bạn có thể thử thêm một số chi tiết tốt vào bề mặt, chẳng hạn như kết cấu hoặc bản đồ. Trong OpenGL, ánh sáng xung quanh là không đổi, nhưng trong thế giới thực thì không bao giờ như vậy. Để mô phỏng thế giới thực, một số hình thức giải pháp chiếu sáng toàn cầu là cần thiết. Việc che giấu môi trường xung quanh giúp ích rất nhiều ở đây, nhưng khó thực hiện hơn là chỉ thiết lập trạng thái OpenGL. Bạn có thể nướng sự che khuất môi trường xung quanh các đỉnh của mô hình trong phần mềm mô hình 3D của bạn hoặc sử dụng SSAO , nhưng tôi sẽ không đi vào chi tiết.

Những gì bạn có thể dễ dàng làm là thêm một nguồn sáng mờ hơn từ một số hướng khác (ví dụ: hướng ngược lại). Điều này sẽ không thực tế, nhưng ít nhất nó cũng sẽ mang lại một số hình dạng cho mặt sau của các đối tượng của bạn.

Cũng xem xét thêm các điểm nổi bật cụ thể vào ứng dụng của bạn. Nó sẽ làm cho đồ vật sáng bóng.

float specLight0[4] = {0.5f, 0.5f, 0.5f, 1.0f};
glLightfv(GL_LIGHT0, GL_SPECULAR, specLight0);
glMaterialfv(GL_FRONT, GL_SHININESS, 10.0f); // Shininess between 0 and 128

Bạn cũng có thể chỉ định màu sắc ánh sáng và vật liệu riêng biệt, đặc biệt nếu mặc định không phù hợp với bạn.


Vì vậy, không có cách đơn giản và trực tiếp nào để làm những gì tôi muốn trong OpengGL ... Quá tệ. Có lẽ tôi sẽ thử thêm một nguồn sáng khác, nhưng chính xác làm thế nào để tôi chỉ định cường độ ánh sáng?
Ricardo Amaral

Các GL_SPECULARGL_SHININESSdường như không tạo ra bất kỳ tác dụng mặc dù ... Tôi đã thay đổi glMaterialfvđến glMaterialivì nó không được biên dịch. Và cũng đã thử một giá trị lớn hơn như 128. Nó trông giống như tôi ... Có lẽ vấn đề nằm ở mô hình được tải của tôi (obj / mtl), sẽ phải xem xét.
Ricardo Amaral

1
@Nazgulled Chỉ cần kiểm tra xem spec0 của spec0 mặc định là 1.0, nhưng đặc tính vật liệu mặc định là 0.0. Vì vậy, thay đổi glLightfv (GL_LIGHT0, GLinksECULAR, specLight0); đến glM vật liệu (GL_FRONT, GLinksECULAR, specLight0); Cũng tốt khi đặt glLightModeli (GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE); hoặc thông số kỹ thuật có thể được tính toán không chính xác khi máy ảnh đang quay.
msell

1
@Nazgulled Đối với ánh sáng thứ cấp, đặt môi trường xung quanh và đặc trưng thành 0 và một số giá trị nhỏ như 0,2 cho khuếch tán. Bạn cũng có thể đặt môi trường xung quanh của tất cả các đèn thành 0 và sử dụng môi trường toàn cầu với GL_LIGHT_MODEL_AMBIENT thay thế.
msell

2

Ánh sáng xung quanh của OpenGL là một màu duy nhất, nhưng ánh sáng xung quanh trong thế giới thực thường sáng hơn từ trên cao và tối hơn từ bên dưới. Bạn có thể ước chừng điều này trong OpenGL bằng cách đặt ánh sáng xung quanh thành màu xanh lam rất đậm và thêm ánh sáng hướng màu xanh đậm hướng xuống dưới. Điều đó, cộng với ánh sáng định hướng màu trắng sáng đến từ bất cứ nơi nào có mặt trời, có thể xấp xỉ ánh sáng ngoài trời khá tốt.

Những gì bạn thực sự nên làm là viết một shader tính toán ánh sáng trên mỗi pixel, nhưng đến đó từ nơi bạn sẽ mất một ít thời gian.


1

Câu trả lời bạn có ở đây là khá tốt. Chỉ cần một bổ sung. Một khi bạn sẽ muốn nó đẹp hơn, hãy thử thực hiện tán xạ khí quyển

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.