2014-12-20 15 views
5

Vì vậy, tôi đã đọc "Hướng dẫn OpenGL chính thức" và trong một phần nơi họ dạy ánh sáng vật chất, họ đột nhiên sử dụng vòng loại "phẳng" cho biến đầu vào trong trình đổ bóng phân đoạn. Tôi google'd vấn đề và tất cả tôi đã đưa ra là "phẳng bóng" và "mịn bóng" và sự khác biệt giữa chúng, mà tôi không thể hiểu làm thế nào nó có liên quan đến một biến "MatIndex" đơn giản. đây là mã ví dụ từ sách:"phẳng" vòng loại trong glsl?

struct MaterialProperties { 
vec3 emission; 
vec3 ambient; 
vec3 diffuse; 
vec3 specular; 
float shininess; 
}; 
// a set of materials to select between, per shader invocation 
const int NumMaterials = 14; 
uniform MaterialProperties Material[NumMaterials]; 
flat in int MatIndex; // input material index from vertex shader 

Đây là gì?

Trả lời

16

Trong trường hợp chung, không có ánh xạ 1: 1 giữa một đỉnh và một đoạn. Theo mặc định, dữ liệu được liên kết trên mỗi đỉnh được nội suy trên toàn bộ nguyên thủy để tạo ra dữ liệu được liên kết tương ứng trên mỗi đoạn, đó là những gì tô bóng mịn.

Sử dụng từ khóa flat, không có nội suy được thực hiện, do đó, mọi đoạn được tạo trong quá trình rasterization của nguyên thủy cụ thể đó sẽ nhận được cùng một dữ liệu. Vì nguyên thủy thường được xác định bởi nhiều hơn một đỉnh, điều này có nghĩa là dữ liệu từ chỉ một đỉnh được sử dụng trong trường hợp đó. Đây được gọi là provoking vertex trong OpenGL.

Cũng lưu ý rằng các loại số nguyên không bao giờ được nội suy. Bạn phải khai báo chúng là flat trong mọi trường hợp.

Trong ví dụ cụ thể của bạn, mã có nghĩa là mỗi nguyên thủy chỉ có thể có một tài liệu, được xác định bằng ID tài liệu của đỉnh kích thích của mỗi nguyên thủy.

+0

Xin lỗi nhưng "nội suy" có ý nghĩa gì trong ngữ cảnh của chúng ta? Tiếng Anh không phải là ngôn ngữ mẹ đẻ của tôi và khi tôi cố gắng dịch nó bằng ngôn ngữ của tôi, tôi nhận được "interpolatsia", đó là cùng một từ. = [ – Pilpel

+3

@Pilpel: [nội suy] (https://en.wikipedia.org/wiki/Interpolation) là một khái niệm chung bạn nên làm cho mình quen thuộc khi bạn muốn làm đồ họa. Với nội suy, người ta thường có một tập hợp các điểm dữ liệu và cố gắng tạo ra các giá trị cho inbetween các điểm dữ liệu đã cho. Trong bối cảnh này, chúng tôi có dữ liệu trên mỗi đỉnh và phải nội suy nó theo từng đoạn. Hãy tưởng tượng một hình tam giác có màu trên mỗi đỉnh.Đối với đỉnh A, chúng ta chỉ định màu đỏ, cho đỉnh B, chúng ta chỉ định màu xanh lá cây và cho đỉnh C, chúng ta chỉ định màu xanh. Nội suy sẽ tạo ra các gradient màu mịn trên toàn bộ tam giác. – derhass

3

Đó là một phần của cách thuộc tính được nội suy cho trình đổ bóng phân đoạn, mặc định là nội suy chính xác của phối cảnh.

trong GLSL spec section 4.5

Một biến có trình độ như phẳng sẽ không được suy. Thay vào đó, nó sẽ có cùng giá trị cho mọi đoạn trong một tam giác. Giá trị này sẽ đến từ một đỉnh kích thích duy nhất, như được mô tả trong Thông số kỹ thuật hệ thống đồ họa OpenGL . Một biến thể bị coi là phẳng cũng có thể bị coi là trọng tâm hoặc mẫu, có nghĩa là điều tương tự như hội đủ điều kiện nó chỉ như là phẳng

thuộc tính Integral cần phải bằng phẳng.

Bạn có thể tìm bảng trong đó đỉnh là đỉnh kích thích trong bảng openGL spec 13.2 trong phần 13.4.