2012-05-05 21 views
5

Ngắn:GLSL có thể sử dụng lại/chia sẻ chức năng, chia sẻ hằng số (OpenGL ES 2.0)?

Tôi có thể xác định chức năng mà mọi trình đổ bóng có thể sử dụng không? Hoặc tôi phải xác định nó cho mỗi bóng đổ?


Toàn bộ câu chuyện:

  • Tôi muốn tạo ra nhiều bóng đổ có ý định để tô màu cho những mảnh đầu vào với dốc dốc được xác định trước (một cái gì đó như thế này - http://www.thinkboxsoftware.com/storage/krakatoa-support-images/krakatoa15_kcm_densitybyage_gradientrampmap.png).

  • Tôi muốn xác định một gradient ramp liên tục cho mỗi shader (một loạt các mẫu màu vec4, trong đó giá trị alpha giữ chức gradient, thấy Pos trong hình trên)

  • Và tôi cần một hàm có thể trả về mẫu màu từ đoạn đường dốc cho sẵn cho một vị trí tọa độ kết cấu cụ thể.

Vì vậy, các đường dốc cần phải định nghĩa một lần mỗi shader, và chức năng nên định nghĩa tất cả cùng một lúc rằng mỗi Shader có thể sử dụng một cách an toàn.

Tôi có các thuật toán, câu hỏi dành cho chức năng chia sẻ và xác định các hằng số trong GLSL.

Điều này có khả thi không? Hoặc tôi phải sao chép chức năng vào mọi trình đổ bóng? Có một số tùy chọn biên dịch trước ít nhất?

Trả lời

9

Bạn có thể làm điều đó tương tự như trong C - bạn khai báo hàm trong tiêu đề và xác định hàm trong tệp C chung.

Trong GLSL bạn sẽ cần phải làm như sau:

  1. trong một số đổ bóng (string), bạn xác định chức năng (cho phép gọi nó là phổ biến):

    float getCommonValue() { return 42; } 
    
  2. trong tất cả các shaders bạn muốn để sử dụng chức năng này, bạn chỉ khai báo và sử dụng chức năng này (hãy gọi nó là SHADER1):

    float getCommonValue(); 
    void main() { gl_Color = vec4(getCommonValue(), 0, 0, 0); } 
    
  3. khi biên dịch shaders với glCompileShader bạn biên dịch shader CHUNG chỉ một lần và lưu trữ shader GLuint đâu đó

  4. khi bạn liên kết chương trình với glLinkProgram cho SHADER1 bạn gắn vào chương trình với glAttachShader cả shaders - CHUNG và SHADER1. Do đó, bạn có thể gọi hàm getCommonValue từ trình đổ bóng này sang trình đổ bóng khác.

  5. bạn có thể sử dụng lại giá trị GLON shader GLuint nhiều lần cho các chương trình sahder khác nhau (SHADER1, SHADER2, ...).

+0

Whoa, nghe hay quá, tôi sẽ thử. – Geri