2013-06-13 13 views
9

Theo http://www.opengl.org/sdk/docs/man/xhtml/glFramebufferTexture.xml, một cuộc gọi đến glFramebufferTexture sẽ trông giống như:Điểm của tham số mục tiêu văn bản cho glFramebufferTexture là gì?

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureId, 0);

Nếu API đã biết textureId tại sao nó cần phải biết mục tiêu (GL_TEXTURE_2D) quá? Điều này có nghĩa là kết cấu sẽ bị ràng buộc trước cuộc gọi này? tức là tôi cần gọi:

glBindTexture(GL_TEXTURE_2D, textureId); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureId, 0); 
glBindTexture(GL_TEXTURE_2D, 0); 

Hoặc sẽ glFramebufferTexture2D xử lý mọi thứ?

Trả lời

13

Nó ở đó vì sự ngu xuẩn.

Xem, cách bạn đính kèm face of a cubemap vào FBO là sử dụng một trong các mục tiêu kết cấu khuôn mặt cubemap. Vì vậy, nếu bạn muốn ràng buộc mặt + X của hình lập phương, bạn sử dụng mục tiêu GL_TEXTURE_CUBE_MAP_POSITIVE_X​. Mục tiêu liên kết của kết cấu (nếu bạn đã ràng buộc) sẽ là GL_TEXTURE_CUBE_MAP, nhưng đó là không những gì bạn chuyển đến textarget khi bạn muốn đính kèm khuôn mặt vào FBO.

Điều này thật ngu ngốc vì OpenGL cũng cung cấp chức năng glFramebufferTextureLayer, không tham số textarget. Nó xác định chính xác kiểu của texture từ chỉ đối tượng. Nó hoạt động trên kết cấu 3D, mảng 1D và 2D, và thậm chí cubemap array textures. Nhưng nó không hoạt động trên các hình khối không phải mảng; bạn vẫn phải sử dụng ngớ ngẩn glFramebufferTexture2D với thông số ngớ ngẩn textarget.

Bằng mọi quyền, các chức năng duy nhất bạn nên sử dụng là glFramebufferTextureLayerglFramebufferTexture. Nhưng vì cách glFramebufferTextureLayer không hoạt động trên khuôn mặt cubemap không phải mảng, bạn phải sử dụng glFramebufferTexture2D cho các khuôn mặt của một sơ đồ khối không phải mảng.


Nhờ ARB_direct_state_access (và do đó OpenGL 4.5), idiocy này không còn áp dụng nữa. glFramebufferTextureLayer bây giờ có thể được sử dụng trên khuôn mặt cubemap không mảng, do đó, bây giờ không có điểm đến bất kỳ chức năng FramebufferTexture dựa trên kích thước. Và do đó, không có điểm đến textarget.

+0

Vì vậy, bạn có nói rằng tôi nên ngừng sử dụng 'glFramebufferTexture2D' và bắt đầu sử dụng' glFramebufferTextureLayer' thay thế không? Và tôi không cần phải lo lắng về việc ràng buộc các kết cấu trước và sau khi các cuộc gọi? –

+0

@MarkIngram: Tôi đã thay đổi câu cuối cùng để làm rõ hơn. Và giải thích của tôi về lý do tại sao mục tiêu là có nên làm cho nó rõ ràng rằng bạn không cần phải ràng buộc các kết cấu; Tôi không có ý tưởng làm thế nào bạn thậm chí có ý tưởng đó. –

+1

Cảm ơn Nicol, tôi đang sử dụng một kết cấu như đầu ra của một hoạt động GPGPU, vì vậy sẽ không được xử lý với các hình khối. Tôi đã có ý tưởng từ một số mã mẫu Apple, nhưng có thể là chúng không thể hủy kết cấu khi chúng được thực hiện với nó. –