2010-09-26 27 views
8

Tôi đang học cách sử dụng bản đồ bình thường (trên mỗi pixel)? Trong đồ họa 2D với OpenGL.Làm thế nào để áp dụng một bản đồ bình thường trong OpenGL?

Bản đồ mới để lập bản đồ bình thường, tôi xoay quanh đầu toán tử Sobel và tạo bản đồ bình thường (chủ yếu là nhờ this), tạo mảng (2D) các chuẩn từ một mảng pixel (2D) dữ liệu.

(Hầu hết các hướng dẫn và đề diễn đàn mà tôi đã tìm thấy được cụ thể sang 3D sử dụng và phần mềm mô phỏng. Tôi đặt mục tiêu thực hiện chức năng này bản thân mình, trong C++.)

  • Tôi phải làm gì khi tôi đã có bản đồ bình thường ?
  • Tôi có cần đăng ký với OpenGL không?
  • Bạn có cần phải liên kết với kết cấu không, nếu có, cách thực hiện ?
  • Làm cách nào để ánh xạ tới hình tứ giác 2D ?
  • (Liệu đó có phải tôi có thể làm mà không shaders/GLSL?)

Trả lời

6

tôi khuyên bạn nên xem xét:

This nvidia presentation on bumb mapping

tôi đã không nhìn này một thời gian, nhưng tôi nhớ nó đi qua hầu hết các chi tiết trong việc thực hiện một Shader bump map, sẽ nhận được một vài ý tưởng đang chạy.

This other nvidia tutorial for implementing bump mapping in the cg shader langauge

This bump mapping tutorial might also be helpful.

Tôi biết tất cả những điều này không dành cho việc lập bản đồ bình thường hoàn toàn nhưng chúng là một khởi đầu tốt.

Ngoài ra, trong khi có sự khác biệt về ngôn ngữ đổ bóng, cũng không khó để chuyển đổi các trình định dạng giữa chúng nếu bạn muốn sử dụng GLSL. Vì bạn có thể làm điều đó mà không có shader nhưng trừ khi bạn đang làm việc trên một dự án giáo dục (cho giáo dục) hoặc thiết bị nhúng cụ thể, tôi không biết tại sao địa ngục bạn muốn - nhưng nếu bạn cần phải this là nơi bạn muốn xem, nó được viết trước khi đổ bóng và cập nhật để tham khảo chúng sau này.

+0

Cảm ơn, bản trình bày nVidia và 3DKingdoms rất tuyệt. Tôi đã nhìn thấy paulsprojects một, nhưng tôi đã bị mất khi nó bắt đầu trên bản đồ khối lập phương. – zyndor

5
  • Tôi phải làm gì khi tôi đã có bản đồ bình thường không?
  • Tôi có cần đăng ký với OpenGL không?

Có, bạn cần tải nó dưới dạng kết cấu.

  • Cần phải liên kết với kết cấu, nếu có, làm thế nào là xong?

Nếu bạn muốn kết hợp với kết cấu màu thì không. Bạn cần phải tạo ra một kết cấu giữ bản đồ bình thường để sử dụng nó sau này với OpenGl.

  • Làm thế nào để ánh xạ tới tứ giác 2D?

Bản đồ bình thường của bạn chỉ là một kết cấu khác, bạn ràng buộc nó và bản đồ như bất kỳ kết cấu nào khác.

Bản đồ bình thường lưu trữ các chuẩn trong tọa độ không gian tiếp tuyến, do đó để tính toán ánh sáng trên mỗi pixel, bạn cần biết vị trí tương đối của nguồn sáng trong hệ tọa độ tiếp tuyến không gian. Điều này được thực hiện bằng cách thiết lập các tham số bổ sung cho mỗi đỉnh (bình thường, tiếp tuyến, nhị phân), tính toán vị trí nguồn sáng trong tọa độ không gian tiếp tuyến và nội suy vị trí này dọc theo các tam giác. Trong shader fragment bạn tra cứu bình thường trong bản đồ bình thường và thực hiện phép tính ánh sáng mong muốn dựa trên các tham số nội suy.

  • (Đây có phải là điều mà tôi có thể làm mà không có trình đổ bóng/GLSL không?)

Có, bạn có thể sử dụng một số tiện ích mở rộng cũ để lập trình các chức năng kết hợp đa môi trường kết cấu. Không bao giờ thực hiện nó bản thân mình nhưng nó trông giống như địa ngục.

+0

tuyệt vời, đa nhiệm là những gì tôi đã có trong tâm trí của tôi (và có, tôi sẽ đi với shaders =)). cảm ơn! – zyndor

1

chủ đề khá cũ, nhưng tôi sẽ trả lời nó cho bất kỳ người mới vào nghề có thể tìm kiếm bất kỳ sự giúp đỡ ở đây:

1) & 2)

bản đồ bình thường của bạn cũng giống như một kết cấu khuếch tán thường xuyên, bạn cần phải tải nó từ đĩa, tạo texture2D của bạn như bạn sẽ làm với kết cấu khuếch tán, và khóa nó với các kết cấu khác để gửi nó đến các shaders. Vì vậy, để tổng hợp nó, bản đồ bình thường, bản đồ chiều cao, vv không khác nhau khi bạn đối phó với họ bên CPU ... nó luôn luôn tải chúng, tạo ra các kết cấu, và khóa chúng.

3)

Bản đồ bình thường chỉ là cách lưu trữ các chuẩn của mọi đoạn trong kết cấu. Tốt hơn nên sử dụng chúng với kết cấu khuếch tán tương ứng, vì đó là cách bạn có thể giả mạo các chi tiết nhỏ. Tuy nhiên, không phải lúc nào cũng cần thiết trong một số trường hợp ... ví dụ, lần cuối tôi làm việc trên một cách để làm cho nước ... Tôi sử dụng bản đồ dudv và bản đồ bình thường, nhưng không phải bản đồ khuếch tán tương ứng, như tôi được sử dụng để đưa vào kết cấu để đạt được sự phản ánh.

4)

bản đồ bình thường được ánh xạ với kết cấu tương tự như phối kết cấu khuếch tán ... nó có nghĩa là nếu bạn có một quad tọa độ tính năng này đều 0; 0, 0, 1, 1; 0, 1; 1 đây là các tọa độ bạn sử dụng để lập bản đồ cả hai hoạ tiết.

5)

bạn có thể làm điều đó mà không shaders, tôi đoán ... thậm chí bạn có thể làm điều đó mà không cần OpenGL nếu bạn muốn ... shaders được thiết kế cho các loại hoạt động, và nó sẽ được dễ dàng hơn để làm điều đó với shaders.

Vì vậy, các bản đồ thông thường là các hoạ tiết mã hóa vectơ bình thường thành màu ... vectơ bình thường là vector 3D, và màu sắc cũng là vector 3D. Khi bạn sử dụng ánh sáng, bạn thường gửi các chỉ tiêu của mình từ trình đổ bóng tới trình đổ bóng phân đoạn ... trình đổ bóng phân đoạn sẽ nội suy giá trị của đỉnh bình thường để tìm ra xấp xỉ vectơ thông thường của pixel. điều này được thực hiện theo mặc định ...

Với bản đồ bình thường, bạn không sử dụng vectơ bình thường đỉnh, nhưng vector thông thường được mã hóa trong kết cấu.

Trước tiên, bạn sẽ phải chuyển đổi phép tính ánh sáng từ không gian thế giới thành không gian tiếp tuyến.được thực hiện trong trình đổ bóng đỉnh.

sau đó, bạn sẽ lấy mẫu bản đồ bình thường của bạn trong trình đổ bóng phân đoạn như một texture thông thường.Bạn sẽ nhận được màu RGB của pixel. bạn sẽ phải chuyển đổi giá trị đó thành một vector bình thường, nghĩa là nhân nó với 2 và trừ 1, tức là rgb * 2 - 1, sau đó sử dụng nó làm vector bình thường của bạn trong tính toán ánh sáng.

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