2013-07-24 23 views
7

Khi sử dụng UBO, chúng tôi liên kết một khối đồng nhất với một điểm liên kết. Sau đó, chúng tôi cũng ràng buộc UBO đến điểm ràng buộc tương tự: cái gì đó như:Đặt hàng giữa glUniformBlockBinding và glBindBufferBase có quan trọng không?

glUseProgram(ProgramName); 
glUniformBlockBinding(ProgramName, uniformLocation, bindingPoint); 
glBindBufferBase(GL_UNIFORM_BUFFER, bindingPoint, bufId); 

Tôi có 2 câu hỏi về vấn đề này:

  1. tôi nên xác định glUniformBlockBinding đầu tiên hoặc glBindBufferBase hoặc thứ tự không quan trọng ?
  2. Nếu hiểu biết của tôi là chính xác, thì glBindBufferBase phải được gọi chỉ sau khi chúng tôi đã cập nhật UBO với dữ liệu. Nếu điều này đúng thì điều này sẽ trả lời câu hỏi đầu tiên của tôi.
+1

'uniformLocation' Đó không phải là vị trí thống nhất. Đó là một chỉ số khối thống nhất. Nó không giống nhau. –

+1

* "Nếu điều này đúng thì điều này trả lời câu hỏi đầu tiên của tôi." * - Không, nó không (đề cập đến câu trả lời * "" * không phải * "là chính xác" *). Tại sao nên làm thế? –

Trả lời

9

glUniformBlockBinding đặt trạng thái trong chương trình (đó là lý do bạn không nên gọi cho mỗi khung). glBindBufferRange đặt trạng thái trong ngữ cảnh OpenGL. Không ảnh hưởng đến nhau cho đến khi bạn render, vì vậy không, nó không quan trọng.

Và có, bạn không thể gọi glBindBufferRange (hoặc Cơ sở, được xác định theo Phạm vi) trừ khi bạn đã cấp phát bộ nhớ cho đối tượng bộ đệm.

+0

Cảm ơn Nicol. Điều đó trả lời câu hỏi của tôi. – viktorzeid

+0

btw, bạn có thể vui lòng giải thích sự khác biệt giữa thiết lập nhà nước trong chương trình vs thiết lập nhà nước trong bối cảnh GL? – viktorzeid

+0

@kvikram: Có lẽ bạn nên dành chút thời gian để tìm hiểu thêm về OpenGL (http://www.opengl.org/wiki/Portal:OpenGL_Concepts). –

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