2013-04-10 32 views
10

Tôi đang cố gắng tạo một trình đổ bóng đoạn OpenGL ES 2.0 cho ra nhiều điểm dừng dọc theo một trục. Nó phải nội suy giữa nhiều màu tại các điểm được xác định bằng phần trăm.Làm thế nào để tạo ra nhiều đổ bóng đổ gradient?

tôi đã đạt được điều này bằng cách sử dụng if s đổ bóng mảnh, như thế này:

float y = gl_FragCoord.y; 
float step1 = resolution.y * 0.20; 
float step2 = resolution.y * 0.50; 

if (y < step1) { 
    color = white; 
} else if (y < step2) { 
    float x = smoothstep(step1, step2, y); 
    color = mix(white, red, x); 
} else { 
    float x = smoothstep(step2, resolution.y, y); 
    color = mix(red, green, x); 
} 

Họ nói rằng sự phân nhánh trong đoạn đổ bóng có thể giết chết hiệu suất. Có một số thủ đoạn thông minh có thể được sử dụng để nội suy giữa nhiều giá trị mà không sử dụng if s không? Có thực sự đáng giá không (điều này có tính chủ quan cao, tôi biết, nhưng theo quy tắc của ngón tay cái)?

Để minh họa cho vấn đề của tôi, nguồn đầy đủ (vẫn ngắn mặc dù) trong liên kết này GLSL Sandbox: http://glsl.heroku.com/e#8035.0

+0

Như tôi đã hiểu, tất cả lõi trên GPU mong muốn thực hiện cùng một thao tác cùng một lúc. Nếu bạn có các nhánh, thì có một nguy cơ mà các lõi khác nhau sẽ cần phải thực hiện các hoạt động khác nhau và do đó một số lõi có hiệu quả bị chặn. Đây là những gì giết chết hiệu suất. Nó thực sự là thực hành tốt để tránh các chi nhánh trong shaders. –

Trả lời

6

Nếu bạn muốn loại bỏ các chi nhánh bạn có thể làm như sau (lấy từ Heroku);

color = mix(white, red, smoothstep(step1, step2, y)); 
color = mix(color, blue, smoothstep(step2, step3, y)); 
color = mix(color, green, smoothstep(step3, resolution.y, y)); 

Nhưng tôi không chắc chắn liệu điều này có nhanh hơn if/elses hay không.

+0

Loại câu trả lời này tôi thực sự đang tìm kiếm! Nếu tôi gặp vấn đề về hiệu suất, tôi sẽ đánh giá hiệu suất của các phương thức sau đó. – murgo

+1

Ví dụ hoạt động của mã này: http://glslsandbox.com/e#39992.0 – neave

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