2013-08-15 48 views
20

Trong chương trình OpenGL đơn giản chào thế giới, đơn giản vẽ một hình tam giác tĩnh trên cửa sổ, khi tôi đặt 3 đỉnh của tam giác thành màu đỏ, xanh lá cây và xanh dương, hình tam giác được tô đầy gradient.Làm cách nào để trình đổ bóng vertex chuyển thông tin màu vào trình đổ bóng phân đoạn?

Nhưng khi tôi sử dụng bóng đổ như thế này:

Vertex Shader:

attribute vec4 aVertex; 
attribute vec4 aColor; 

varying vec4 vColor; 

void main(void) { 
    gl_Position = gl_ModelViewMatrix * gl_ProjectionMatrix * aVertex; 
    vColor = aColor; 
} 

nơi các thuộc tính aVertexaColor xuất phát từ một bộ đệm đỉnh, trải qua một cuộc gọi của glVertexAttribPointer.

Fragment Shader:

varying vec4 vColor; 
void main(void) { 
    gl_FragColor = vColor; 
} 

Các tam giác vẫn còn đầy gradient, và ở đây có các câu hỏi:

Nếu đỉnh-shader được tính cho mỗi đỉnh, sau đó mỗi thể hiện của vColor nên được gán với màu của một đỉnh. Và màu đỉnh phải là màu đỏ, xanh lục hoặc xanh dương, như được đặt trong bộ đệm đỉnh.

Vậy độ dốc đến từ đâu?

Hoặc, nói cách khác, khi nào nó xảy ra trong trình đổ bóng, thì vColor hóa ra là màu nội suy thay vì đỉnh?

+0

Dưới đây là thông tin thêm về các trường hợp thay đổi trên các giá trị vec hoặc mat: https: //gamedev.stackexchange.com/questions/139720/glsl-biến đổi-nội suy-thành phần-khôn ngoan-tham khảo-in-the-spec – trusktr

Trả lời

13

Biến "biến đổi" trong trình đổ bóng phân đoạn có kết quả nội suy tuyến tính giữa các giá trị được đưa ra ở giai đoạn đổ bóng đỉnh (dựa trên vị trí tương đối của đoạn giữa các đỉnh).

Tức là khi rasterizer phun ra một mảnh tại điểm ảnh, vị trí của nó cũng được đưa ra tương ứng với các đỉnh tam giác trong các tọa độ barycentric. Các tọa độ này sau đó được sử dụng để nội suy tất cả các biến khác nhau từ trình đổ bóng đỉnh. Trong hầu hết trường hợp, đây là những gì bạn muốn và tốc độ đạt được từ không nội suy là khá không đáng kể những ngày này.

Sử dụng từ khóa "phẳng" sẽ vô hiệu nội suy và thay vào đó sử dụng giá trị của đỉnh đầu tiên (tôi không chắc chắn 100% "phẳng" hoạt động khác nhau như tôi đã chuyển sang sử dụng trong/ra từ khóa với newer versions of GLSL).

Một lưu ý phụ, tôi thấy đặc biệt hữu ích nếu đoạn cần một số giá trị từ mỗi đỉnh. Trong trường hợp này, tôi sử dụng flat out myVertexValue[3] trong trình đổ bóng hình học (for example here).

+3

Tôi đột nhiên nhận ra rằng nó không cần phải biết rằng biến là về màu sắc trước khi áp dụng nội suy. Trên thực tế, coords, normals, TexCoords và tất cả mọi thứ là một nội suy giữa các đỉnh. – RnMss

1

Độ dốc xuất phát từ nội suy giữa các màu đỉnh xảy ra khi đường truyền khác nhau thành hình cầu fragment. Nếu bạn không muốn nội suy sử dụng từ khóa "phẳng" khi bắt đầu thay đổi. Sự hiểu lầm của bạn có thể xuất phát từ sự thiếu kiến ​​thức về cách thức hoạt động của các giai đoạn đỉnh và đoạn. Chúng hoạt động khác nhau. Trình đổ bóng đổ được gọi trên mỗi đỉnh trong khi phân đoạn -per-pixel. Nội suy xảy ra theo mặc định vì cần phải bao gồm các đoạn được tạo trong giai đoạn rasterization trên khu vực được xác định bởi hội đồng nguyên thủy. Và như tôi đã nói bạn có thể vô hiệu hóa nội suy bằng "phẳng". Trong trường hợp này màu của thuộc tính đỉnh đầu tiên sẽ xác định màu tổng thể của hình dạng.

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