[問題] openGL獲得frame buffer資料

看板C_and_CPP (C/C++)作者 (東逼)時間13年前 (2013/03/21 19:26), 編輯推噓3(300)
留言3則, 1人參與, 最新討論串1/2 (看更多)
大家好 最近正在利用openGL 還有shader language 來處理畫圖相關的東西 想請問一下有沒有辦法利用shader來幫我做運算 但是最後結果不要顯示或是另外存在一個buffer裡就好? 爬網路文章有看到一些API 想說自己寫寫看,結果目前跑不出來 把程式流程大概列出來 想請教一下大家是哪裡錯了 原本利用openGL與shader language畫圖做法: int init(void) { //做一些連接shader的初始化設定、openGL的一些參數 //ex:glCreateProgram() 、 glEnable() 、 glDisable()... ... ... } void data_from_other(unsigned int X, unsigned int Y,char* buf, int num) { //當外部訊號進來時就會被呼叫 EGLint width = 0; EGLint height = 0; eglQuerySurface(egldisplay, eglsurface, EGL_WIDTH, &width); eglQuerySurface(egldisplay, eglsurface, EGL_HEIGHT, &height); load_texture(Xsize,Ysize,buffer); //讀取材質 render(width, height); //設定參數並利用shader來畫圖 eglSwapBuffers(egldisplay, eglsurface); } 以上的做法都是正常的,shader可以正常顯示 現在我希望可以只要知道shader運算後的資料內容,但不要畫出來 我的想法是,利用某種方式把我要算的東西畫在某個buffer上 然後可以利用像是glreadpixels的函式去取得我要的資料 爬了網路文章 發現openGL是有提供一些API,讓你可以新增framebuffer設定之類的 下面是我的作法 GLuint my_fbo = 2; //新增一個我想要在背景做事的framebuffer GLuint my_shader = 0; //新增一個我想要在背景運算的shader unsigned char my_buffer[800*480*4]; //背景運算完後想存的地方 void custom_framebuffer_init() { //新增一個render buffer glGenRenderbuffers(1, &my_shader); glBindRenderbuffer(GL_RENDERBUFFER, my_shader); glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA, 800, 480); glBindRenderbuffer(GL_RENDERBUFFER, 0); //設定要綁定的材質 glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 800, 480, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); ////新增一個frame buffer glGenFramebuffers(1, &my_fbo); glBindFramebuffer(GL_FRAMEBUFFER, my_fbo); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, my_shader); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); //設定運算後要存的buffer初始值 memset(my_buffer, 0, sizeof(my_buffer)); //確認framebuffer設定是否有誤 if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { printf("!!!!!!!!!!!!!!!!!!!!!!! ERROR !!!!!!!!!!!!!!!!!!!!!!!\n"); } else { printf("!!!!!!!!!!!!!!!!!!!!!!! SUCCESS !!!!!!!!!!!!!!!!!!!!!!!\n"); } } void get_custom_fb_data() { //想要利用以下的API來得到背景運算的資料 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, my_shader); glBufferData(GL_ARRAY_BUFFER, 800*480*4, my_buffer, GL_DYNAMIC_DRAW); } 問題來了 當我把custom_framebuffer_init()放在原本的init()裡最後面 編譯並執行 沒有錯誤,執行時Framebuffer似乎也有被成功設定 (有顯示!!SUCCESS !!!) 但結果原本應該要出現的圖反而就消失了 O_O 我甚至沒有呼叫 get_custom_fb_data (原本想在data_from_other裡呼叫,但發現即使沒呼叫圖也跑不出來) 花很多時間查資料好像也沒看到解決的方法 倒是看到不少人也有類似的問題 甚至我看到有人說 shader language只能顯示,不能直接對shader獲取運算後的資料 但是又看到這些相關的API好像可以用 現在整個很混亂 囧 能否請教一下是我哪裡搞錯了或是想法根本就錯了呢? 若有講的不完整的也請再跟我說一下 @@ 在此也先謝謝各位的熱心回答囉 -- ▍ ▍ ╯╰ ╯╰ ◢◣ ◢◣ 我最愛的 柏柏龍~ 柏柏龍~ ◢██◣ ╮╭ ▎▎╮╭ ▎▎ 柏柏龍~ 柏柏龍~ ⊙ ⊙ ⊙ ⊙ 人人心中都有柏柏龍~ ≡ ▼ ≡ ▲▲ ● ● ≡ ▼ ≡ ■ ■ ■ ■ 憤怒就永遠不會消失~ ⊙⊙ ≡皿 ≡ 炸是最美的擁有~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.120.179.30

03/21 20:51, , 1F
一般來說是用 FBO 啦 ... OpenGL ES 不熟 XD
03/21 20:51, 1F

03/21 21:02, , 2F
重看了你的 code,流程上有點問題
03/21 21:02, 2F

03/21 21:05, , 3F
像是你重複綁了 GL_COLOR_ATTACHMENT0
03/21 21:05, 3F
文章代碼(AID): #1HIkve8o (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1HIkve8o (C_and_CPP)