2012-06-25 56 views
8

Tôi khá mới với lập trình đồ họa và tôi vừa mới đọc một số sách và đã quét qua các hướng dẫn, vì vậy hãy tha thứ cho tôi nếu điều này có vẻ là một câu hỏi ngớ ngẩn.Trình tạo pixel thực sự làm gì?

Tôi đã có các khái niệm cơ bản về directx11 và đang chạy, đồng thời tôi đang tìm một số điều thú vị. vì vậy tự nhiên tôi đã đọc rất nhiều vào các đường ống đổ bóng, và tôi đã bị cuốn hút. Ý tưởng viết một đoạn mã đơn giản, nhỏ gọn, đủ hiệu quả để chạy hàng chục nghìn lần mỗi giây mà không lãng phí tài nguyên khiến tôi vội vã nắm bắt khái niệm trước khi tiếp tục và có thể làm một mớ hỗn độn của mọi thứ. Những gì tôi gặp khó khăn là nắm bắt những gì các pixel shader thực sự đang làm.

Vertex shaders rất đơn giản, bạn tổ chức các đỉnh của đối tượng trong cấu trúc dữ liệu đồng nhất liên quan đến thông tin về vị trí và tọa độ kết cấu, sau đó chuyển từng đỉnh vào bóng đổ được chuyển đổi từ 3d sang 2d cách của ma trận trasformation. Miễn là tôi hiểu nó, tôi có thể làm việc ra làm thế nào để mã nó.

Nhưng tôi không nhận được trình tạo pixel. Những gì tôi nhận được là đầu ra của vertex shader là đầu vào của pixel shader. Vì vậy, sẽ không chỉ được giao các pixel shader tọa độ 2d của các đỉnh của đa giác? Điều tôi đã hiểu là pixel shader nhận các pixel riêng lẻ và thực hiện các phép tính trên chúng để xác định những thứ như màu sắc và ánh sáng. Nhưng nếu đó là sự thật, thì pixel nào? toàn bộ màn hình hoặc chỉ các pixel nằm trong đa giác 2d đã được chuyển đổi?

hoặc tôi đã hiểu nhầm điều gì đó hoàn toàn?

Trả lời

10

Dò bóng Vertex đơn giản để hiểu, bạn sắp xếp các đỉnh của đối tượng trong cấu trúc dữ liệu đồng nhất liên quan đến thông tin về vị trí và tọa độ kết cấu, sau đó chuyển từng đỉnh vào bóng đổ được chuyển đổi từ 3d sang 2d bằng cách sử dụng ma trận trasformation.

Sau này, nguyên thủy (tam giác hoặc bội số của tam giác) được tạo ra và cắt bớt (trong Direct3D 11, nó thực sự là một chút nhờ phức tạp hơn để chuyển đổi thông tin phản hồi, shaders hình học, tesselation, bạn đặt tên cho nó ... nhưng bất kể nó là gì, cuối cùng bạn có hình tam giác).

Bây giờ, các mảnh được tạo ra, nghĩa là một tam giác được chia thành các ô nhỏ với lưới thường, các thuộc tính đầu ra của trình đổ bóng đỉnh được nội suy theo vị trí tương đối của mỗi ô lưới tới ba đỉnh và một " nhiệm vụ "được thiết lập cho mỗi ô lưới nhỏ. Mỗi ô trong số các ô này là một "đoạn" (nếu sử dụng multisampling, một số đoạn có thể có mặt cho một pixel).

Cuối cùng, một chương trình nhỏ được thực hiện trên tất cả các "tác vụ" này, đây là trình tạo pixel (hoặc trình đổ đoạn phân đoạn).

Phải mất các thuộc tính đỉnh được nội suy, và tùy ý đọc giá trị đồng nhất hoặc kết cấu, và tạo ra một đầu ra (nó có thể tùy chọn tạo ra một số kết quả đầu ra). Đầu ra của pixel shader này chỉ một mảnh, và sau đó được loại bỏ (ví dụ do kiểm tra độ sâu) hoặc được trộn với bộ đệm khung. Thông thường, nhiều phiên bản của cùng một trình đổ bóng pixel chạy song song cùng một lúc. Điều này là do nó hiệu quả hơn và tiết kiệm năng lượng để chạy GPU như thế này. Trình đổ bóng một pixel không biết về bất kỳ trình duyệt nào khác đang chạy cùng một lúc.
Trình tạo pixel thường chạy trong một nhóm (còn gọi là "dọc" hoặc "wavefront") và tất cả các pixel shader trong một nhóm thực thi cùng một lệnh cùng một lúc (trên dữ liệu khác nhau). Một lần nữa, điều này cho phép xây dựng những con chip mạnh mẽ hơn, sử dụng ít năng lượng hơn và rẻ hơn.




Lưu ý rằng trong trường hợp này, đoạn đổ bóng vẫn chỉ chạy một lần cho mỗi "tế bào". Multisampling chỉ quyết định có lưu trữ giá trị được tính toán ở một trong các "khe" có độ phân giải cao hơn (subsamples) theo thử nghiệm độ sâu (độ phân giải cao hơn) hay không. Đối với hầu hết các pixel trên màn hình, tất cả các mẫu phụ đều giống nhau. Tuy nhiên, trên các cạnh, chỉ một số mẫu phụ sẽ được lấp đầy bằng hình học cận cảnh trong khi một số sẽ giữ giá trị của chúng khỏi hình học "nền" xa hơn. Khi hình ảnh multisampled được giải quyết (có nghĩa là, được chuyển thành hình ảnh "bình thường"), card đồ họa sẽ tạo ra "mix" (trong trường hợp đơn giản nhất, đơn giản là trung bình số học) của các subsamples này, kết quả là mọi thứ ngoại trừ các cạnh giống như thường lệ, và các cạnh được "làm mịn".

+0

okay, tôi nghĩ tôi đã hiểu ngay bây giờ. Bởi vì tôi là một người học thị giác mặc dù, tôi đã thực hiện một sơ đồ của những gì tôi nghĩ rằng bạn đã mô tả, vì vậy xin vui lòng cho tôi biết nếu tôi đang thiếu bất cứ điều gì. http://postimage.org/image/9oy2nroqr/ – FatalCatharsis

+1

Một sai lầm: tọa độ post-vertexshader là ** không ** tọa độ pixel, nhưng _normalized_. Đối với Direct3D, điều này có nghĩa là chúng nằm trong khoảng từ 0.0 đến 1.0 (-1.0 và 1.0 trong OpenGL). Đây không phải là rất trực quan lúc đầu, bởi vì màn hình thường không vuông, nhưng nó "chỉ hoạt động" (không phải lo lắng, không có gì đặc biệt để bạn làm!) Và nó hiệu quả hơn cho phần cứng để làm tính toán (ví dụ cắt) trong không gian. Phần còn lại có vẻ tốt (shader geom, tesselation, và clipping được gọi là "công cụ xảy ra ở giữa"). – Damon

+0

ah gotcha, tôi thích tọa độ chuẩn hóa thực sự, vì mọi thứ sẽ ở trên cùng một tỷ lệ bất kể độ phân giải màn hình đã chọn của bạn, (opengl có vẻ hơi kỳ lạ một chút, -1 đến 1). Vì vậy, các shader hình học và các giai đoạn tesselation xảy ra ở giữa? tôi đã có thể tìm thấy họ đến đầu tiên như các đỉnh mới sau đó có thể được đưa vào đổ bóng và chuyển đổi thành hợp âm màn hình. là các đỉnh mới được tạo tự động quay 2d? – FatalCatharsis

2

Hiểu biết của bạn về trình tạo pixel là chính xác ở chỗ nó "nhận các pixel riêng lẻ và thực hiện các phép tính trên chúng để xác định những thứ như màu sắc và ánh sáng".

Các pixel mà trình đổ bóng nhận được là các pixel riêng lẻ được tính trong quá trình rasterization của đa giác 2d đã chuyển đổi (hình tam giác là cụ thể). Vì vậy, trong khi trình đổ bóng đỉnh xử lý 3 điểm của tam giác, trình đổ bóng pixel xử lý các pixel, mỗi lần một điểm ảnh, "điền vào" hình tam giác.

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