2012-10-16 27 views
16

Trong OpenGL, tôi có thể phác thảo các đối tượng bằng cách vẽ đối tượng bình thường, sau đó vẽ lại thành khung dây, sử dụng bộ đệm stencil để đối tượng gốc không được vẽ lên. Tuy nhiên, kết quả này được vạch ra bằng một màu đồng nhất.Các hiệu ứng phác thảo trong OpenGL

enter image description here

Trong hình ảnh này, các điểm ảnh của phác thảo của con vật dường như được minh bạch hơn hơn nữa họ đến từ các sinh vật họ phác thảo. Làm thế nào tôi có thể đạt được một hiệu ứng tương tự với OpenGL?

Trả lời

6

Họ không sử dụng wireframe cho việc này. Tôi đoán nó là nặng nề đổ bóng có liên quan và đòi hỏi này:

  1. Rendering đối tượng để một stencil buffer
  2. Rendering đệm stencil với màu của sự lựa chọn trong khi áp dụng blur
  3. mô hình Rendering trên đầu trang của nó
+0

Vì vậy, chúng tôi vẽ đối tượng bằng màu đồng nhất vào kết cấu, sau đó vẽ kết cấu đó lên màn hình bằng trình đổ bóng mờ? – dupersuper

+0

Có, nhưng nó có lẽ không phải là cách duy nhất để làm điều đó. – weltensturm

+1

Đây thực chất là cách nó được thực hiện trên tiêu đề tôi đã làm việc, mặc dù nó đã có vấn đề chậm đối với chúng tôi. Hãy xem xét bao nhiêu màn hình sẽ chứa phác thảo của bạn trước khi cam kết với cách tiếp cận này - có những hiệu ứng rẻ hơn có sẵn để giao tiếp rằng "mô hình này được đánh dấu". Trên một tiêu đề hiện đại, bạn có thể không có tỷ lệ lấp đầy để phụ tùng. – Philip

1

Theo như tôi thấy nó hiệu ứng trên màn hình ngắn và nhiều "cạnh" hiệu ứng không phải là cạnh tinh khiết, như trong phác thảo truyện tranh. Những gì chủ yếu được thực hiện, bạn có một pass là bạn render đối tượng thông thường sau đó một pass chỉ với hình học (không có texture) và shader GLSL. Trong shader fragment bình thường được lấy và bình thường vuông góc với vector camera, bạn tô màu đối tượng. Hiệu ứng này sau đó được làm nhẵn bằng cách bao gồm khu vực gần vuông góc hoàn hảo.

Tôi sẽ phải tra cứu phép toán chính xác nhưng tôi nghĩ nếu bạn lấy sản phẩm dấu chấm của vectơ camera và bình thường bạn sẽ nhận được số lượng "vuông góc". Đó là sau đó bạn có thể chạy qua một chức năng như exp để có được một sự thiên vị về phía 1.

Vì vậy (không có sự đảm bảo rằng nó là chính xác):

exp(dot(vec3(0, 0, 1), normal)); 

(Lưu ý:. Mọi thứ đều trong screenspace)

4

Tôi trễ câu trả lời nhưng tôi đã cố gắng để đạt được điều tương tự và nghĩ rằng tôi muốn chia sẻ các giải pháp tôi đang sử dụng.

Một hiệu ứng tương tự có thể đạt được trong một thao tác vẽ đơn với bóng đổ không phức tạp.

Trong trình đổ bóng đoạn, bạn sẽ tính toán màu của đoạn dựa trên sét và kết cấu cho bạn màu chưa được đánh dấu 'colorA'.

Màu thứ hai của bạn là màu viền, 'colorB'.

Bạn nên lấy mảnh vỡ cho vectơ của máy ảnh, chuẩn hóa nó, sau đó lấy sản phẩm dấu chấm của vectơ này với bình thường của đoạn.

Vectơ thành vector camera đơn giản là nghịch đảo vị trí của mảnh trong không gian mắt.

Màu sắc của đoạn là sau đó:

float CameraFacingPercentage = dot(v_fragmentToCamera, v_Normal); 
gl_FragColor = ColorA * CameraFacingPercentage + ColorB * (1 - FacingCameraPercentage); 

Đây là ý tưởng cơ bản nhưng bạn sẽ phải chơi xung quanh để có nhiều hơn hoặc ít hơn của màu phác thảo. Ngoài ra, các phần lõm của mô hình của bạn cũng sẽ được đánh dấu nhưng đó cũng là trường hợp trong hình ảnh được đăng trong câu hỏi.

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