2013-04-08 34 views
5

Tôi đang cố gắng để tạo ra một tam giác như hình ở bên phải trong hình sau:Triangle gradient trên OpenGL

triangles

Vấn đề là những gì tôi muốn đạt được là một gradient màu từ vertexes 1 và 2 proyected from C.

Theo như tôi biết điều này là không thể vì đỉnh C phải có màu riêng của nó, cũng sẽ hòa trộn thành màu 1 và 2, như trong tam giác bên trái của ảnh . Nếu tôi đặt C thành màu điểm giữa, điều này sẽ tạo ra kết quả không mong muốn, vì hình tam giác cao hơn được thực hiện, ít màu sắc hơn là các đỉnh của các đỉnh khác.

Dòng C1 phải có màu đen và dòng C2 phải có màu trắng.

Có cách nào để đạt được điều này trong OpenGL không?

Trả lời

6

Có hai cách, nhưng tôi không biết điều nào có ý nghĩa nhất đối với ứng dụng của bạn. Ở cấp độ rất cao:

  1. Ánh xạ họa tiết đến hình tam giác. Khi gradient rất mượt mà, nó không cần độ phân giải rất cao và bạn có thể cho phép lọc tuyến tính thực hiện công việc cho bạn.

  2. Sử dụng trình đổ bóng. Nhiều công việc hơn để thiết lập, nhưng cũng linh hoạt hơn và mang đến cho bạn kết quả 'hoàn hảo' ở mọi tỷ lệ/độ phân giải.


Update: nếu bạn đang sử dụng một Shader, ý tưởng là như sau.

Vượt qua một varying vec2 coords từ trình đổ bóng đỉnh đến trình đổ bóng phân đoạn. Đặt giá trị cho điểm 1 thành 0,0, cho điểm 2 đến 1,0 và cho điểm C đến 0,1. Để nhận các giá trị này vào bóng đổ đỉnh, hãy sử dụng attribute. Các giá trị thay đổi sẽ được nội suy xuyên qua tam giác, giống như tọa độ kết cấu và màu sắc. Vì vậy, các biến coords được ánh xạ tới tam giác của bạn như thế này:

y 
1 +-----+ 
    |\ | 
    |#\ | 
    |##\ | 
    |###\ | 
    |####\| 
0 +-----+ x 
    0  1 

Các shader đoạn nhận một giá trị coords đâu đó trong khu vực băm. Để tìm ra số lượng của từng màu bạn cần pha trộn, hãy tính toán đường thẳng qua coords0,1 và tìm giao điểm của nó với trục x. Nhờ hệ tọa độ của coords, đây là thao tác đơn giản: chỉ cần chia coords.x theo coords.y. Gọi số này f. (Lưu ý rằng điều này sẽ cung cấp cho phép chia cho không tại điểm C, nhưng điều này được dự kiến ​​như bạn không bao giờ được xác định màu sắc đó. Bạn có thể kiểm tra cho rằng rõ ràng trong shader nếu bạn muốn).

Indicating coords với c và đại diện cho phù hợp với . ký tự, f kết thúc ở đâu đó giữa 0 và 1:

y 
1 +-----+ 
    |\ | 
    |.\ | 
    |#c\ | 
    |#.#\ | 
    |##.#\| 
0 +--f--+ x 
    0  1 

Bây giờ giả sử bạn có uniform vec4 colour1uniform vec4 colour2 để xác định màu sắc tại điểm 1 và 2, tương ứng.Sau đó, một vấn đề đơn giản là pha trộn các phần này: lấy một phần của các phần colour21-f của colour1 và thêm chúng lại với nhau. Hàm GLSL mix thực hiện chính xác điều này.

+0

Vì hình tam giác sẽ thay đổi động, dường như tùy chọn đầu tiên có thể không phù hợp. Đối với các trình đổ bóng, tôi có nên sử dụng trình đổ bóng đỉnh để chuyển một giá trị khác nhau đến đỉnh phân đoạn không? Tôi đã chỉ sử dụng đổ bóng đỉnh cho đến nay, và sau khi tìm kiếm một số hướng dẫn tôi vẫn không thể tìm ra cách vượt qua các giá trị khác nhau từ các công cụ đổ bóng đỉnh. – Leo

+0

Nó vẫn có thể: kết cấu sẽ kéo dài cùng với hình học của bạn. – Thomas

+0

Xin lỗi vì đã chỉnh sửa nhanh. Không nhận ra nhấn enter sẽ tải lên nhận xét. – Leo