OpenGL(八)使用 subroutine 切换可编程管线
生活随笔
收集整理的這篇文章主要介紹了
OpenGL(八)使用 subroutine 切换可编程管线
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Subroutine 功能是在OpenGL 4.0 版本里才增加的,因此對于各種Android手機,這個功能基本跪了。如果你發(fā)現(xiàn)你的程序報錯:ARB_shader_subroutine,那就說明當(dāng)前顯卡不支持。不過大體思路可以了解一下,因為思路類似的功能有其他的實現(xiàn)方式。
原理
在shader中聲明一個函數(shù)變量,然后定義它的指針,并將其作為一個uniform變量公開出去。最后定義很多復(fù)寫函數(shù)即可。
實現(xiàn)
由于版本限制,使用 subroutine 要注意在shader中加入版本的編譯宏:
#version 400 core在shader中編寫:
subroutine vec4 SurfaceColor(); subroutine uniform SurfaceColor U_SurfaceColor;subroutine (SurfaceColor) vec4 Ambient() {//... }subroutine (SurfaceColor) vec4 Diffuse() {//... }subroutine (SurfaceColor) vec4 Specular() {//... }void main() {gl_FragColor = U_SurfaceColor(); }在shader中,每一個函數(shù)中的代碼段代表一種處理函數(shù)。另一方面在GL指令中,綁定這個函數(shù)指針,并為其指定實現(xiàn)函數(shù)的索引值,即可實現(xiàn)效果的控制。
surfaceColorLocation = glGetSubroutineUniformLocation(program,GL_FRAGMENT_SHADER,"U_SurfaceColor");GLuint ambientLightIndex = glGetSubroutineIndex(program,GL_FRAGMENT_SHADER,"Ambient"); GLuint diffuseLightIndex = glGetSubroutineIndex(program,GL_FRAGMENT_SHADER,"Diffuse"); GLuint specularLightIndex = glGetSubroutineIndex(program,GL_FRAGMENT_SHADER,"Specular");//draw glUniformMatrix4fv(MLocation, 1, GL_FALSE, glm::value_ptr(model)); glUniformSubroutinesuiv(GL_FRAGMENT_SHADER,1,&ambientLightIndex); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,ibo); glDrawElements(GL_TRIANGLES,indexCount,GL_UNSIGNED_INT,0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);總結(jié)
本文介紹了OpenGL中的 subroutine 機制,通過它可以切換shader的內(nèi)容。在Unity3d中使用Shader.maximumLOD技術(shù)可以達到類似的效果,相關(guān)內(nèi)容可以參考官方文檔
關(guān)注我的微信公眾號,獲取更多優(yōu)質(zhì)內(nèi)容
總結(jié)
以上是生活随笔為你收集整理的OpenGL(八)使用 subroutine 切换可编程管线的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个大二前端的2017自我总结
- 下一篇: 安徽大学大学生创新项目报销流程