2012-09-18 70 views
5

Tôi muốn viết một chức năng tiện ích chung sẽ sử dụng đối tượng Framebuffer OpenGL để tạo kết cấu có thể được sử dụng bởi một số chương trình OpenGL cho bất kỳ mục đích nào mà một lập trình viên bên thứ ba muốn.Khôi phục trạng thái OpenGL

Hãy nói cho lập luận cổ phần chức năng trông giống như

void createSpecialTexture(GLuint textureID) 
{ 
    MyOpenGLState state; 
    saveOpenGLState(state); 
    setStateToDefault(); 
    doMyDrawing(); 
    restoreOpenGLState(state); 
} 

gì nên MyOpenGLState, saveOpenGLState(state), setStateToDefault()restoreOpenGLState(state) trông giống như để đảm bảo rằng doMyDrawing sẽ cư xử một cách chính xác và rằng không có gì mà tôi làm trong doMyDrawing sẽ ảnh hưởng đến bất cứ điều gì khác mà một nhà phát triển bên thứ ba có thể đang làm?

Vấn đề đã cắn tôi là OpenGL có rất nhiều trạng thái tiềm ẩn và tôi không chắc chắn tôi đang nắm bắt tất cả.

Cập nhật: mối quan tâm chính của tôi là OpenGL ES 2.0 nhưng tôi nghĩ tôi sẽ đặt câu hỏi thường

Trả lời

1

Không sử dụng đối tượng khung hình để hiển thị kết cấu của bạn. Thay vào đó tạo ra một EGLContext mới và EGLSurface. Sau đó, bạn có thể sử dụng eglBindTexImage để biến EGLSurface của bạn thành một kết cấu. Bằng cách này, bạn được đảm bảo rằng tiểu bang từ doMyDrawing sẽ không gây ô nhiễm bối cảnh gl chính và ngược lại.

0

hơn Đối với tiết kiệm và khôi phục, glPushAttribglPopAttrib sẽ giúp bạn có được rất xa.

Bạn không thể, tuy nhiên, khôi phục GL về trạng thái mặc định. Tuy nhiên, kể từ khi sử dụng doMyDrawing() và/hoặc sửa đổi trạng thái chỉ nên được bạn biết, bạn chỉ có thể đặt giá trị đó thành giá trị bạn cần.

+2

không phải là những thứ không được dùng nữa? – KillianDS

+0

Câu hỏi chủ yếu liên quan đến OpenGL ES 2.0, không phải 'glPushAttrib' hoặc' glPopAttrib' là một phần của (xem http://www.khronos.org/opengles/sdk/docs/man/). – Caterpillar

0

Điều đó phụ thuộc rất nhiều vào những gì bạn làm trên doMyDrawing();, nhưng về cơ bản bạn phải khôi phục mọi thứ (tất cả các trạng thái) mà bạn thay đổi trong chức năng này. Nếu không có một cái nhìn vào những gì đang xảy ra bên trong doMyDrawing(); nó là không thể đoán những gì bạn phải khôi phục lại.

Nếu sửa đổi trên chiếu hoặc modelview ma trận được thực hiện bên trong doMyDrawing(), hãy nhớ đi ban đầu đẩy cả GL_PROJECTIONGL_MODELVIEW ma trận thông qua glPushMatrix và khôi phục chúng sau khi vẽ qua glPopMatrix. Bất kỳ trạng thái nào khác mà bạn sửa đổi có thể được đẩy và bật mặc dù glPushAttrib và thuộc tính phù hợp. Hãy nhớ cũng để unbind bất kỳ kết cấu, FBO, PBO, vv .. mà bạn có thể ràng buộc bên trong doMyDrawing();

+1

Lưu ý rằng glPush/Pop * không tồn tại trong OpenGLES 2.0 – Tim

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