Triển khai kết cấu hình ảnh bị nhiễu từ ngôn ngữ rendererman


8

Tôi đang cố gắng thực hiện (trong C #) một thuật toán nhiễu loạn hình ảnh được trình bày trong cuốn sách "Hoạ tiết và mô hình hóa - K. Perlin et al" (trang 91 nếu có ai đó), làm biến dạng hình ảnh. Đoạn mã sau đây bằng ngôn ngữ Renderman: Truy cập kết cấu

Ct = texture("example.tx", s, t);

được thay thế bởi

point Psh;
float ss, tt;
Psh = transform("shader", P);
ss = s + 0.2 * snoise(Psh);
tt = t + 0.2 * snoise(Psh+(l.5,6.7,3.4));
Ct = texture("example.tx", ss, tt);

biến đổi hình ảnh bên trái sang bên phải. nhập mô tả hình ảnh ở đây

(S,t)[0,1](SS,tt)(S,t)

SnoTôiSe(x)(noTôiSe(x)*2)-1[0,1][-1,1]noTôiSe(P)http://renderman.pixar.com/resource/civerse/RenderMan/noiseFiances.html )

Điều tôi không hiểu là hàm biến đổi làm gì, được cho là ánh xạ điểm 3d P vào không gian "shader" và làm thế nào để thực hiện nó. Ngoài ra, tôi không chắc liệu nhiễu (x) có trả về điểm 3d hay không, float (sẽ có ý nghĩa hơn) và nếu tôi có thể sử dụng cách thực hiện 2d đơn giản của nhiễu Perlin để đạt được hiệu ứng mong muốn tương tự.

Câu trả lời:


6

Như bạn đã phỏng đoán, transform()hàm sẽ biến đổi các điểm từ không gian phối hợp này sang không gian phối hợp khác. (Cũng có vtransform()ntransform()để chuyển đổi các vectơ chỉ hướng và vectơ bình thường, tương ứng.) Đối số chuỗi đặt tên cho không gian tọa độ để chuyển đổi thành.

Các Hướng dẫn Shading Renderman có điều này để nói về nó:

Khi bắt đầu thực hiện shader, tất cả các biến điểm, vectơ, bình thường và ma trận được thể hiện trong hệ tọa độ "hiện tại". Chính xác thì hệ tọa độ nào là "hiện tại" phụ thuộc vào việc thực hiện. Thực tế là "hiện tại" là "máy ảnh" cho PRMan *, nhưng bạn không bao giờ nên tin vào hành vi này - hoàn toàn có khả năng các trình kết xuất tương thích RenderMan khác (bao gồm các trình kết xuất trong tương lai từ Pixar) có thể sử dụng một số không gian khác (như "thế giới") là không gian "hiện tại".

Nó tiếp tục đưa ra một trường hợp như thế này làm ví dụ. Hầu hết các tính toán ánh sáng nên được thực hiện trong không gian máy ảnh, nhưng việc đánh giá chức năng nhiễu phải nằm trong hệ thống phối hợp của đối tượng, bởi vì bạn muốn tiếng ồn giữ nguyên khi đối tượng di chuyển trong không gian thế giới.

Khi triển khai C #, bạn cũng cần chuyển đổi điểm được tô bóng từ không gian camera sang hệ thống phối hợp của đối tượng. Có lẽ bạn đã thực hiện điều này trước khi tính toán tọa độ kết cấu. Nếu không, bạn sẽ cần nhân với ma trận biến đổi của đối tượng. Hãy nhớ rằng việc sử dụng duy nhất điểm chuyển đổi này là làm đầu vào (như hạt giống) cho bộ tạo nhiễu Perlin. Nó đặt miền mà tiếng ồn thay đổi: không gian thế giới tọa độ.

Trong RSL, noise()hàm có thể trả về bất kỳ loại nào bạn thích: a float, a color, a pointhoặc a vector. Khi bạn thêm nó vào một float( uhoặc v) khác, bạn sẽ nhận được một floatmã này. Thực sự, hai noise()cuộc gọi, được thêm vào st, đang hành động để tạo ra một vectơ nhiễu 2D duy nhất. Trong mã của riêng bạn, nếu bạn đang sử dụng vectơ 2D để lưu trữ tọa độ kết cấu của mình, bạn có thể sử dụng một hàm nhiễu duy nhất trả về vectơ 2D, để có được hiệu ứng tương tự trong một dòng mã.


Nếu bạn quan tâm đến việc tạo ra một bộ tạo tiếng ồn tốt, Shadertoy có rất nhiều bộ khử nhiễu có các biến thể khác nhau của nhiễu Perlin với các tính chất khác nhau (đẳng hướng hoặc không, độ mịn và băng thông có thể định cấu hình) và đáng để tìm cảm hứng cũng như gợi ý thực hiệ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.