[問題] openGL獲得frame buffer資料
大家好
最近正在利用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
03/21 20:51, 1F
推
03/21 21:02, , 2F
03/21 21:02, 2F
推
03/21 21:05, , 3F
03/21 21:05, 3F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章