台灣最大程式設計社群網站
∣
免費加入會員
∣登入
∣回首頁∣
您好
線上人數
1137
會員總數:
243991
討論主題:
188420
討論區
程式下載/上傳
科技新聞
專欄文章
會員中心
加值服務
外包接案
求職求才
登入
登出
歡迎您
免費
加入會員
討論區選單
新手必讀
我要提問!!
討論區
個人討論區
我的關注主題
我的黑名單
討論區EP英雄榜
專家等級說明
討論區常見問題
兌換發問點數QP
扣點申請加值服務
申請版主
開發工具
ASP
ASP.NET
C#
VB.NET
VB6
C/C++
PHP
Java
Java Script/ Node.js
AJAX / JSON / jQuery
其他語言
行動裝置開發
Android APP 開發
iOS APP/ swift 開發
Windows Phone APP
資料庫
ACCESS
MS SQL
MySQL
Oracle
其他DB
多媒體 / 網管
CSS/HTML5/Bootstarp
影像處理
office VBA / WinOS
Windows 伺服器
Linux / Unix
網管 / 資安 / VM
硬體 / 週邊 / 其他
綜合
求職求才
外包接案
心情甘苦談
網站經營 / 合夥 / 證照
建言 / 公告
文章區
專欄文章
科技新聞
Blog精華文章
討論區列表
>>
iOS APP/ swift 開發
>> OpenGL GLSL 如何依序使用多個shader
[]
[
我要回覆
]
OpenGL GLSL 如何依序使用多個shader
價值 : 20 QP
點閱數:1449 回應數:0
樓主
竹風
0
3
42
0
發送站內信
目前想使用兩個不同的vertex shader和兩個不同的fragment shader去做影像得處理
但在實作上,兩個shade會平行處理,不會依據第一個shade(S1)執行完後,在執行第二個shade(S2)
有參考過GPUImage的寫法,研究了一個月,還是完全不知為何能做到shade依序處理的效果
初始shade程碼
-(void)initGLSL{ 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); filterXYTest = BuildProgram(@"vertexNearbyTexelSampling", @"fragmentXYDerivativeFilter"); glUseProgram(filterXYTest); filterXYPositionAttribute = glGetAttribLocation(filterXYTest, "position"); filterXYTextureCoordinateAttribute = glGetAttribLocation(filterXYTest, "inputTextureCoordinate"); filterXYInputImageTextureUniform = glGetUniformLocation(filterXYTest, "inputImageTexture"); filterXYEdgeStrength = glGetUniformLocation(filterXYTest, "edgeStrength"); filterXYTexelWidth = glGetUniformLocation(filterXYTest, "texelWidth"); filterXYTexelHeight = glGetUniformLocation(filterXYTest, "texelHeight"); glEnableVertexAttribArray(filterXYPositionAttribute); glEnableVertexAttribArray(filterXYTextureCoordinateAttribute); glVertexAttribPointer( positionAttribute, 2, GL_FLOAT, 0, 0, imageVertices); glVertexAttribPointer( textureCoordinateAttribute, 2, GL_FLOAT, 0, 0, noRotationTextureCoordinates); }
以下為將相機畫面綁定於texture之code
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;
之後調用shade的程碼
-(void)detectGLSL{ glViewport(0, 0, self.view.frame.size.width, self.view.frame.size.height); glUseProgram(grayTest); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, self.backdropModel.textureId); glUniform1i(grayInputImageTextureUniform, 0); glUniform1f(graySensitivityUniform, 5.0); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glViewport(self.view.frame.size.width, self.view.frame.size.height, self.view.frame.size.width, self.view.frame.size.height); glUseProgram(filterXYTest); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, self.backdropModel.textureId); glUniform1i(filterXYInputImageTextureUniform, 0); glUniform1f(filterXYEdgeStrength, 0.9); glUniform1f(filterXYTexelHeight, self.view.frame.size.height); glUniform1f(filterXYTexelWidth, self.view.frame.size.width); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); }
不是這流程有無錯誤.
搜尋相關Tags的文章:
[ OpenGL ] ,
[ GLSL ] ,
[ 影像處理 ] ,
[ shader ] ,
本篇文章發表於2016-12-19 09:53
別忘捐VP感謝幫助你的人
新手會員瞧一瞧
目前尚無任何回覆
回覆
如要回應,請先
登入
.
|
網站導覽
|
網站介紹
|
4P點數說明
|
電子報
|
小舖活動
|
大事紀
|
廣告刊登
|
常見問題
|
聯絡我們
|
版權所有 ©copyright 2000 All Rights Reserved