討論區快速選單
知識庫快速選單
網路投保旅行平安險 政府補助!學嵌入式+物聯網 CSSLP認證,將資安落實在軟體開發中
[ 回上頁 ] [ 討論區發言規則 ]
OpenGL GLSL 如何依序使用多個shade
更改我的閱讀文章字型大小
作者 : loinjoe80(竹風)
[ 貼文 12 | 人氣 0 | 評價 10 | 評價/貼文 0.83 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/12/15 下午 02:49:19
目前想使用兩個不同的vertex shader和兩個不同的fragment shader去做影像得處理
但在實作上,兩個shade會平行處理,不會依據第一個shade(S1)執行完後,在執行第二個shade(S2)
有參考過GPUImage的寫法,研究了一個月,還是完全不知為何能做到shade依序處理的效果

在網路上也找不出類似關鍵字,有無參考網站或是簡單的Sample之類的嗎?
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2146 | 人氣 89850 | 評價 10080 | 評價/貼文 4.7 | 送出評價 78 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/12/15 下午 04:02:56

>目前想使用兩個不同的vertex shader和兩個不同的fragment shader去做影像得處理
>但在實作上,兩個shade會平行處理,不會依據第一個shade(S1)執行完後,在執行第二個shade(S2)
>有參考過GPUImage的寫法,研究了一個月,還是完全不知為何能做到shade依序處理的效果
>
>在網路上也找不出類似關鍵字,有無參考網站或是簡單的Sample之類的嗎?


不太看得懂你在問什麼. 如果你是想要進行一些 image processing, 你大概需要打開一個 framebuffer 用來輸出的畫面, 然後再把 framebuffer 作為 texture 作為輸入 (又或是古代的做法, 繪畫到backbuffer, 然後複制 backbuffer 到 texture, 然後再在繪畫時引用).

請具體一點說一下你想要做的事吧.
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2146 | 人氣 89850 | 評價 10080 | 評價/貼文 4.7 | 送出評價 78 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/12/15 下午 09:00:19
>OpenGL應該是國防部在管理的吧!
>以前教我OpenGL的老師是國防部的,
> ...

Arr... 建中網友, 你的回應似乎有點那過. 恕我把它刪了.
作者 : gmailjoey(建中) 貼文超過200則
[ 貼文 206 | 人氣 0 | 評價 190 | 評價/貼文 0.92 | 送出評價 13 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/12/15 下午 09:48:26
>Arr... 建中網友, 你的回應似乎有點那過. 恕我把它刪了.

哦哦! 不要緊,GARY大大你好。
如果可以的話也請說明一下shade是啥咪啊,多謝你。
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2146 | 人氣 89850 | 評價 10080 | 評價/貼文 4.7 | 送出評價 78 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/12/15 下午 10:09:13
>>Arr... 建中網友, 你的回應似乎有點那過. 恕我把它刪了.
>
>哦哦! 不要緊,GARY大大你好。
>如果可以的話也請說明一下shade是啥咪啊,多謝你。

不是 shade, 是 shader. 所謂 shader, 是一種程式的別名. 功用是上載到顯示卡, 讓多個小處理器, 同步執行多個 shader. shader 這個沒什麼特別的, 不過就是限制特別多的程式. 因為限制特別多, 早期是用 assembly 寫, 當然, 後來就出現了shader專用的 編譯器 和 程式語言.

樓主所說的 GLSL 正正就是 shader 程式語言 的其中一種. 除了 GLSL, 還有 Nvidia 的 Cg, Microsoft DirectX 的 HLSL, ...

^^" 問一問 Google大神吧, 上述的關鍵字, 足夠你閱讀後久了.
作者 : gmailjoey(建中) 貼文超過200則
[ 貼文 206 | 人氣 0 | 評價 190 | 評價/貼文 0.92 | 送出評價 13 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/12/15 下午 10:58:11
>不是 shade, 是 shader. 所謂 shader, 是一種程式的別名. 功用是上載到顯示卡, 讓多個小處理器, 同步執行多個 shader. shader 這個沒什麼特別的, 不過就是限制特別多的
>程式. 因為限制特別多, 早期是用 assembly 寫, 當然, 後來就出現了shader專用的 編譯器 和 程式語言.

>樓主所說的 GLSL 正正就是 shader 程式語言 的其中一種. 除了 GLSL, 還有 Nvidia 的 Cg, Microsoft DirectX 的 HLSL, ...

>^^" 問一問 Google大神吧, 上述的關鍵字, 足夠你閱讀後久了.

我以前上大學的時候有學過DirectX和OpenGL,
那個時候台灣沒有硬體加速器產業,
這兩個領域的程式都很少人會。

我知道shader可以運用到繪圖軟體,
3dsmax MAYA這些軟體有自己規格的shader,
而且有專門的訓練課程可以參加。

OpenGL裡面新的shader我就沒有學過了,
以前只有舊版的OpenGL檔案所以沒有跑過OpenGL。
作者 : loinjoe80(竹風)
[ 貼文 12 | 人氣 0 | 評價 10 | 評價/貼文 0.83 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/12/15 下午 11:06:28
主要是做 image processing,主要是想做完灰階化後再進行其他演算法
所以想要達成多個shader依序處理的部份
以下為初始話shader code
    grayTest = BuildProgram(@"vertexHARRIS", @"fragmentGray");
    glUseProgram(grayTest);
    grayPositionAttribute = glGetAttribLocation(grayTest, "position");
    grayTextureCoordinateAttribute = glGetAttribLocation(grayTest, "inputTextureCoordinate");
    grayInputImageTextureUniform = glGetUniformLocation(grayTest, "inputImageTexture");
    graySensitivityUniform = glGetUniformLocation(grayTest, "sensitivity");
    glEnableVertexAttribArray(grayPositionAttribute);
    glEnableVertexAttribArray(grayTextureCoordinateAttribute);
    
    glVertexAttribPointer( grayPositionAttribute, 2, GL_FLOAT, 0, 0, imageVertices);
    glVertexAttribPointer( grayTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, noRotationTextureCoordinates);

以下為將相機畫面綁定於texture之城碼
    GLuint textureId=self.backdropModel.textureId;
    if( !textureId ){
     glGenFramebuffers(1, &fbo);
     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
     glGenTextures(1, &textureId);
     glBindTexture(GL_TEXTURE_2D, textureId);
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA , GL_UNSIGNED_BYTE, frameData);
     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureId, 0);
    }else{
     glBindTexture(GL_TEXTURE_2D, textureId);
     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, frameData);
    }
    
    self.backdropModel.textureId = textureId;
取完畫面之後調用shader
    glUseProgram(grayTest);
    glBindTexture(GL_TEXTURE_2D, self.backdropModel.textureId);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

不知這流程有無錯誤
作者 : loinjoe80(竹風)
[ 貼文 12 | 人氣 0 | 評價 10 | 評價/貼文 0.83 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/12/15 下午 11:06:53
主要是做 image processing,主要是想做完灰階化後再進行其他演算法
所以想要達成多個shader依序處理的部份
以下為初始話shader code
    grayTest = BuildProgram(@"vertexHARRIS", @"fragmentGray");
    glUseProgram(grayTest);
    grayPositionAttribute = glGetAttribLocation(grayTest, "position");
    grayTextureCoordinateAttribute = glGetAttribLocation(grayTest, "inputTextureCoordinate");
    grayInputImageTextureUniform = glGetUniformLocation(grayTest, "inputImageTexture");
    graySensitivityUniform = glGetUniformLocation(grayTest, "sensitivity");
    glEnableVertexAttribArray(grayPositionAttribute);
    glEnableVertexAttribArray(grayTextureCoordinateAttribute);
    
    glVertexAttribPointer( grayPositionAttribute, 2, GL_FLOAT, 0, 0, imageVertices);
    glVertexAttribPointer( grayTextureCoordinateAttribute, 2, GL_FLOAT, 0, 0, noRotationTextureCoordinates);

以下為將相機畫面綁定於texture之城碼
    GLuint textureId=self.backdropModel.textureId;
    if( !textureId ){
     glGenFramebuffers(1, &fbo);
     glBindFramebuffer(GL_FRAMEBUFFER, fbo);
     glGenTextures(1, &textureId);
     glBindTexture(GL_TEXTURE_2D, textureId);
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA , GL_UNSIGNED_BYTE, frameData);
     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureId, 0);
    }else{
     glBindTexture(GL_TEXTURE_2D, textureId);
     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, frameData);
    }
    
    self.backdropModel.textureId = textureId;
取完畫面之後調用shader
    glUseProgram(grayTest);
    glBindTexture(GL_TEXTURE_2D, self.backdropModel.textureId);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

不知這流程有無錯誤
作者 : gmailjoey(建中) 貼文超過200則
[ 貼文 206 | 人氣 0 | 評價 190 | 評價/貼文 0.92 | 送出評價 13 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/12/18 下午 06:49:12
我認為要看懂OpenGL的程式碼,
口袋還是要夠深才行。
OpenGL程式碼包含了int,handle,
還有COM元件等等不同的類型,
需要設計很多複雜的呼叫,
在寫碼以前就可以預測出他的複雜度是很高的,
你可以試試看把程式碼貼在討論區來討論。
如果程式設計俱樂部討論區的空間不夠貼,
沒辦法貼滿全文的話,
你可以把程式碼貼在藍色小舖的網站,
藍色小舖的程式人員比較多,
而且有空間讓你貼上全部的程式碼。
如果還是找不到人,
就把程式碼轉成英文日文再貼到美國日本討論區都是可以的。
請大家多多參與討論,
歡迎其他網友在這裡留下你的意見,謝謝。
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2146 | 人氣 89850 | 評價 10080 | 評價/貼文 4.7 | 送出評價 78 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/12/27 下午 05:16:40
你的程式錯太多, 再寫了一下...

GLuint GL_fbo;
GLuint GL_scn, GL_src;
GLuint grayTest, tex0;

void main()
{
  //...
char *vertex_shader_source =
"varying vec2 texture_coordinate; \n"
"void main() \n"
"{ \n"
" gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; \n"
" texture_coordinate = vec2(gl_MultiTexCoord0); \n"
"} \n";
  char *fragment_shader_source =
  "uniform sampler2D tex1; \n"
  "uniform vec2 sensitivity; \n"
  "varying vec2 texture_coordinate; \n"
  "void main() \n"
  "{ \n"
  " gl_FragColor = (texture2D(tex1, texture_coordinate-sensitivity)+texture2D(tex1, texture_coordinate+sensitivity))/2; \n"
  "} \n";

  int width = 640;
  int height = 480;

  grayTest = glCreateProgram();
  {
    GLuint VShaderID = glCreateShader( GL_VERTEX_SHADER );
    glShaderSource( VShaderID, 1, (const char**) &vertex_shader_source, NULL );
    glCompileShader( VShaderID );
    glAttachShader( grayTest, VShaderID );

    GLuint FShaderID = glCreateShader( GL_FRAGMENT_SHADER );
    glShaderSource( FShaderID, 1, (const char**) &fragment_shader_source, NULL );
    glCompileShader( FShaderID );
    glAttachShader( grayTest, FShaderID );

    glLinkProgram( grayTest );
  }

  glGenTextures( 1, &GL_src );
    glBindTexture( GL_TEXTURE_2D, GL_src );
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0 );
    
  glGenTextures( 1, &tex0 );
    glBindTexture( GL_TEXTURE_2D, tex0 );
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0 );
  
  glGenTextures( 1, &GL_scn );
    glBindTexture( GL_TEXTURE_2D, GL_scn );
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0 );


  glGenFramebuffers( 1, &GL_fbo );
    glBindFramebuffer( GL_FRAMEBUFFER, GL_fbo );
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, GL_scn, 0);
    glBindFramebuffer( GL_FRAMEBUFFER, 0 );

  //...
}
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2146 | 人氣 89850 | 評價 10080 | 評價/貼文 4.7 | 送出評價 78 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/12/27 下午 05:27:44
void display()
{
  if( textureId2_updated )
  {
    glBindTexture(GL_TEXTURE_2D, GL_src );
    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 640, 480, GL_RGB, GL_UNSIGNED_BYTE, buf0 );
    textureId2_updated = false;
 }

  glClearColor( .1, .2, .3, 1 );
  glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

  glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
  
  GLint viewport[4];
  glGetIntegerv( GL_VIEWPORT, viewport );
  glViewport( 0,0,640,480 );

  glBindFramebuffer( GL_FRAMEBUFFER, GL_fbo );
  glEnable( GL_TEXTURE_2D );
  glUniform1i(glGetUniformLocation(grayTest, "inputImageTexture"), 0);


  static int xxx = 0;
  double a = 16.0/640;
  double b = 16.0/480;
  xxx++;


  glUniform2f(glGetUniformLocation(grayTest, "sensitivity"), a, b );
  glUseProgram(grayTest);
  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, GL_scn, 0);
  glBindTexture( GL_TEXTURE_2D, GL_src );
  glBegin( GL_QUADS );
    glTexCoord2d( 0,0 ); glVertex3f( -1, -1, 0 );
    glTexCoord2d( 1,0 ); glVertex3f( 1, -1, 0 );
    glTexCoord2d( 1,1 ); glVertex3f( 1, 1, 0 );
    glTexCoord2d( 0,1 ); glVertex3f( -1, 1, 0 );
  glEnd();
  swap( GL_scn, tex0 );

  int i;
  for( i=0; i<4; i++ )
  {
  glUniform2f(glGetUniformLocation(grayTest, "sensitivity"), a, b );
  glUseProgram(grayTest);
  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, GL_scn, 0);
  glBindTexture( GL_TEXTURE_2D, tex0 );
  glBegin( GL_QUADS );
    glTexCoord2d( 0,0 ); glVertex3f( -1, -1, 0 );
    glTexCoord2d( 1,0 ); glVertex3f( 1, -1, 0 );
    glTexCoord2d( 1,1 ); glVertex3f( 1, 1, 0 );
    glTexCoord2d( 0,1 ); glVertex3f( -1, 1, 0 );
  glEnd();
  swap( GL_scn, tex0 );
  }

  glViewport( viewport[0], viewport[1], viewport[2], viewport[3] );
  glUseProgram(grayTest);
  glBindFramebuffer( GL_FRAMEBUFFER, 0 );
  glBindTexture( GL_TEXTURE_2D, tex0 );
  glBegin( GL_QUADS );
    glTexCoord2d( 0,0 ); glVertex3f( -1, -1, 0 );
    glTexCoord2d( 1,0 ); glVertex3f( 1, -1, 0 );
    glTexCoord2d( 1,1 ); glVertex3f( 1, 1, 0 );
    glTexCoord2d( 0,1 ); glVertex3f( -1, 1, 0 );
  glEnd();
  swap( GL_scn, tex0 );


  // ...

}
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2146 | 人氣 89850 | 評價 10080 | 評價/貼文 4.7 | 送出評價 78 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/12/27 下午 05:36:56
上面 void main() 之內的, 就是你需要初始化的變數. 總共是 1個FBO, 3個texture 和 1個shader.

然後, 後面的 display() 裡, 你應該如下 去更新來自相機的像素資料.
  if( textureId2_updated )
  {
    glBindTexture(GL_TEXTURE_2D, GL_src );
    glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 640, 480, GL_RGB, GL_UNSIGNED_BYTE, buf0 );
    textureId2_updated = false;
  }
貼了文才發現這裡跟你的變收命名不同了. 你自己對應一下吧, buf0 是你的 frameData. textureId2_updated 是個 bool, 初始 false, buf0 收到新資料改成 true...

作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2146 | 人氣 89850 | 評價 10080 | 評價/貼文 4.7 | 送出評價 78 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/12/27 下午 05:42:24
void display()
{
  // ...

  GLint viewport[4];
  glGetIntegerv( GL_VIEWPORT, viewport );
  glViewport( 0,0,640,480 );

  // ...

  glViewport( viewport[0], viewport[1], viewport[2], viewport[3] );

  // ...
}

注意了, 對著 texture 做 image processing, 當前畫面的解像度會需要改變, 因為 視窗 和 texture 的解像度不同呀.
上面關於 viewport 的幾句, 就是處理這個情況的.
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2146 | 人氣 89850 | 評價 10080 | 評價/貼文 4.7 | 送出評價 78 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人loinjoe80註記此篇回應為最佳解答 2016/12/27 下午 05:50:09
最後真正地進行繪畫時, 原碼需分為三組.
第一組, 是把 GL_src 畫上 GL_scn, 然後 GL_scn 和 tex0 的 texture id 交換;
第二組, 重複把 tex0 畫上 GL_scn, 然後 GL_scn 和 tex0 的 texture id 交換;
第三組, 關掉 FBO; 還原視窗 viewport; 直接繪畫到視窗去.

// 第一組
  glUniform2f(glGetUniformLocation(grayTest, "sensitivity"), a, b );
  glUseProgram(grayTest);
  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, GL_scn, 0);
  glBindTexture( GL_TEXTURE_2D, GL_src );
  glBegin( GL_QUADS );
    glTexCoord2d( 0,0 ); glVertex3f( -1, -1, 0 );
    glTexCoord2d( 1,0 ); glVertex3f( 1, -1, 0 );
    glTexCoord2d( 1,1 ); glVertex3f( 1, 1, 0 );
    glTexCoord2d( 0,1 ); glVertex3f( -1, 1, 0 );
  glEnd();
  swap( GL_scn, tex0 );

// 第二組
  int i;
  for( i=0; i<4; i++ )
  {
  glUniform2f(glGetUniformLocation(grayTest, "sensitivity"), a, b );
  glUseProgram(grayTest);
  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, GL_scn, 0);
  glBindTexture( GL_TEXTURE_2D, tex0 );
  glBegin( GL_QUADS );
    glTexCoord2d( 0,0 ); glVertex3f( -1, -1, 0 );
    glTexCoord2d( 1,0 ); glVertex3f( 1, -1, 0 );
    glTexCoord2d( 1,1 ); glVertex3f( 1, 1, 0 );
    glTexCoord2d( 0,1 ); glVertex3f( -1, 1, 0 );
  glEnd();
  swap( GL_scn, tex0 );
  }

// 第三組
  glViewport( viewport[0], viewport[1], viewport[2], viewport[3] );
  glUseProgram(grayTest);
  glBindFramebuffer( GL_FRAMEBUFFER, 0 );
  glBindTexture( GL_TEXTURE_2D, tex0 );
  glBegin( GL_QUADS );
    glTexCoord2d( 0,0 ); glVertex3f( -1, -1, 0 );
    glTexCoord2d( 1,0 ); glVertex3f( 1, -1, 0 );
    glTexCoord2d( 1,1 ); glVertex3f( 1, 1, 0 );
    glTexCoord2d( 0,1 ); glVertex3f( -1, 1, 0 );
  glEnd();
  swap( GL_scn, tex0 );
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2146 | 人氣 89850 | 評價 10080 | 評價/貼文 4.7 | 送出評價 78 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/12/27 下午 06:00:10
相機 配 OpenGL 做 image processing, 是一件我想完成了很久的事. FBO 的部份倒沒什麼, 自已來去讀鏡頭 然後再上載到 OpenGL texture, 原來功夫也真不少 (^^ 用 OpenCV 是可以的, 只可惜 我有潔癖, 要我放一大堆亂糟糟的外來原碼進來, 我會不成的).

上文的程式, 是由我能跑的範例裡截錄出來, 已沒有錯. 倒是原碼被移殖到你家之後, 結果如何, 難料.

Anyway, 有困難, 再求救吧.
作者 : kagaya(kagaya) VC++優秀好手C++優秀好手貼文超過1000則人氣指數超過30000點
[ 貼文 1599 | 人氣 38709 | 評價 4590 | 評價/貼文 2.87 | 送出評價 115 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/12/28 上午 10:19:22
>OpenGL應該是國防部在管理的吧!
>以前教我OpenGL的老師是國防部的,
> ...
>Arr... 建中網友, 你的回應似乎有點那過. 恕我把它刪了.


沒看到 可惜 想必很經典
反正刪也刪不完 不如留著吧
作者 : ozzy123(ozzy) 資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4464 | 人氣 37262 | 評價 10860 | 評價/貼文 2.43 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/12/28 上午 10:47:04
https://www.khronos.org/
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2146 | 人氣 89850 | 評價 10080 | 評價/貼文 4.7 | 送出評價 78 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2016/12/28 下午 12:12:25
>>OpenGL應該是國防部在管理的吧!
>>以前教我OpenGL的老師是國防部的,
>> ...
>>Arr... 建中網友, 你的回應似乎有點那過. 恕我把它刪了.
>
>
>沒看到 可惜 想必很經典
>反正刪也刪不完 不如留著吧

的確是很 "經典". 我最初也試著回的, 但是, 就算已極力克制 也火力太猛. 編程的討論區, 因技術較勁而火力猛, 好. 突兀謬論嘛... 輕輕帶過就算了.
作者 : loinjoe80(竹風)
[ 貼文 12 | 人氣 0 | 評價 10 | 評價/貼文 0.83 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2017/2/10 下午 05:35:13
感覺iOS的寫法又和PC的寫法不太一樣,在流程上有滿大的差異,有詢問過iPhone版,但目前沒人回應

目前主要參考GPUImage的GLSL寫法,達成影像處理加速的效果,
https://github.com/BradLarson/GPUImage

他是使用多個Shader program執行影像處理,也就是說,如果想做二值圖,他會先執行灰階化的Shader program(PS:Shader program包含Vertex Shader 及 Fragment Shader),之後再進行二值化的Shader program.

我的程式碼範例有push至github上,供大家參考
CVOpenGLESCamera
https://github.com/Bamboowand/CVOpenGLESCamera

我利用OpenCV內建的CvVideoCameraDelegate,取出相機一幀影像的data,並將它丟入OpenGL的texture裡,之後利用Shader program達成一些影像操作,

但問題來了,執行結果,手機上一半畫面是顛倒的影像處理結果,下一半畫面是正常的影像處理結果,因對OpemGLES for iOS還一知半解,也不知是流程的問題還是因為利用framebuffer的問題,或哪裡有OpenGL使用不當的情形,因情形滿特殊的,也不是如何從網路查詢問題點,有蒐過許多資料,鮮少網站有多個Shader program依序執行的範例,
目前只有搜到sift-gpu-iphone有用到類似效果
sift-gpu-iphone
https://github.com/Moodstocks/sift-gpu-iphone

不知有無網站有再討論類似的問題,如果有找到解法,我會馬上Push至github供大家研究.
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2146 | 人氣 89850 | 評價 10080 | 評價/貼文 4.7 | 送出評價 78 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2017/2/11 上午 02:18:58
Mmm... 上面不是已經說得很清楚了嗎? 說 shader程式, 輸入 不能同是 輸出, 所以才需要 用framebuffer 切換textures. 除此之外, OpenGL 就是 OpenGL, GLSL 還是 GLSL, 沒什麼可困擾吧.
作者 : loinjoe80(竹風)
[ 貼文 12 | 人氣 0 | 評價 10 | 評價/貼文 0.83 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2017/2/14 下午 05:37:22
在OpenGL ES 裡面,有些OpenGL不能用,例如 glBegin()和glEnd(),在OpenGL ES不支援.
作者 : ozzy123(ozzy) 資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4464 | 人氣 37262 | 評價 10860 | 評價/貼文 2.43 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2017/2/15 上午 08:05:35
also can do same effects , http://nehe.gamedev.net/tutorial/vertex_buffer_objects/22002/
作者 : ma_hty(白老鼠(Gary))討論區板主 OpenGL卓越專家DirectX優秀好手C++頂尖高手貼文超過2000則人氣指數超過70000點
[ 貼文 2146 | 人氣 89850 | 評價 10080 | 評價/貼文 4.7 | 送出評價 78 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2017/2/16 上午 03:03:40
> 在OpenGL ES 裡面,有些OpenGL不能用,例如 glBegin()和glEnd(),在OpenGL ES不支援.

OpenGL ES, 的確是把臨時編製繪畫資料的功能除去了. 但這只是出於效能的考慮... 實在, 臨時編製繪畫資料 是不必要的, 因為你可以預先把 繪畫資料 編製好, 不過就是要多花點功夫做前期準備而已. 正因為 臨時編製繪畫資料 是不必的, 所以才除掉去省執行時間. 但是, 這對 OpenGL 的編寫概念, 並無重大影響.

( @@! 是否我的文字謙遜過度了? 竟然被懷疑不知道 OpenGL ES... )
作者 : loinjoe80(竹風)
[ 貼文 12 | 人氣 0 | 評價 10 | 評價/貼文 0.83 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2017/4/14 下午 05:41:37
我沒有這意思.
只是初學OpenGL ES,又是從iPhone上執行的,所以有些流程轉不過來
作者 : loinjoe80(竹風)
[ 貼文 12 | 人氣 0 | 評價 10 | 評價/貼文 0.83 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2017/4/14 下午 05:41:51
我沒有這意思.
只是初學OpenGL ES,又是從iPhone上執行的,所以有些流程轉不過來
 板主 : 白老鼠(Gary)
 > OpenGL - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - OpenGL - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
OpenGL
1 白老鼠(Gary) 2710 
2 CROMAYEN2000 1530 
3 aming 500 
4 東昇 380 
5 PLAYER 120 
6 富伯 110 
7 qq 100 
8 NDark 80 
9 ozzy 60 
10 simula 60 
OpenGL
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2018 程式設計俱樂部 http://www.programmer-club.com.tw/
0.109375