Opengl 渲染时处理多个过程
我希望仅使用使用glsl的可编程管道(无固定管道)渲染卷。为了实现这一点,我需要多通道渲染器,这意味着以顺序使用不同的着色器渲染不同的场景。 我想到了三种方法:Opengl 渲染时处理多个过程,opengl,glsl,Opengl,Glsl,我希望仅使用使用glsl的可编程管道(无固定管道)渲染卷。为了实现这一点,我需要多通道渲染器,这意味着以顺序使用不同的着色器渲染不同的场景。 我想到了三种方法: 每当渲染新场景时,使用一个着色器程序和“分离着色器->附加着色器->重新编译程序” 每次使用一个着色器程序,则存在多个着色器程序 使用glsl中的子例程在渲染不同过程时选择不同的子例程 我想知道什么时候我应该使用第一种方法?2ed方法?等等。有经验的开发人员能帮上忙吗?许多问题都可以不经过多次解决。试着做一个没有它们的技术。 如果其他方
我想知道什么时候我应该使用第一种方法?2ed方法?等等。有经验的开发人员能帮上忙吗?许多问题都可以不经过多次解决。试着做一个没有它们的技术。 如果其他方法都无效,请使用方法3 我的想法是:
- 方法1非常缓慢,无法使用
- 方法2需要做很多工作,但如果 做得好,它是“快”
- 方法3简单而优雅,但有一个 额外的处理开销。可以多次渲染对象,并将当前的过程编号传递给着色器
uniformintcurrentpass;
/*其他制服*/
void main()
{
如果(currentPass==1)
{
/*做点什么*/
}
else if(currentPass==2)
{
/*做点什么*/
}
如果(…){…}
}
在我看来,最好的方法是只使用很少的着色器(可能是一个材质着色器、一个后期处理着色器等),因此方法3几乎是完美的
有没有想过uber着色器?他们有点像你的方法3。谷歌it:)
我也建议这样做
许多问题不需要多次解决即可解决。试着做一个没有它们的技术。 如果其他方法都无效,请使用方法3 我的想法是:
- 方法1非常缓慢,无法使用
- 方法2需要做很多工作,但如果 做得好,它是“快”
- 方法3简单而优雅,但有一个 额外的处理开销。可以多次渲染对象,并将当前的过程编号传递给着色器
uniformintcurrentpass;
/*其他制服*/
void main()
{
如果(currentPass==1)
{
/*做点什么*/
}
else if(currentPass==2)
{
/*做点什么*/
}
如果(…){…}
}
在我看来,最好的方法是只使用很少的着色器(可能是一个材质着色器、一个后期处理着色器等),因此方法3几乎是完美的
有没有想过uber着色器?他们有点像你的方法3。谷歌it:)
我也建议这样做
我搜索了uber着色器。但uber着色器似乎在着色器文件中使用类似于
#ifdef
和#endif
宏的内容。如何使用#ifdef
和#endif
在运行时的着色器文件中选择着色器文件的不同片段?我可以在我的OpenGL程序中的render()
函数中设置define宏吗?不,没有预处理器来执行类似的操作。必须先使用类似于预处理代码的工具/库。在那之后,你可以编译/执行着色器。但也许这会对你有所帮助:我在互联网上搜索,并通过使用glsl 4.0中的新功能子例程
找到了一个好的解决方案。这是一个非常棒的特性!谢谢分享……:)我搜索了优步着色器。但uber着色器似乎在着色器文件中使用类似于#ifdef
和#endif
宏的内容。如何使用#ifdef
和#endif
在运行时的着色器文件中选择着色器文件的不同片段?我可以在我的OpenGL程序中的render()
函数中设置define宏吗?不,没有预处理器来执行类似的操作。必须先使用类似于预处理代码的工具/库。在那之后,你可以编译/执行着色器。但也许这会对你有所帮助:我在互联网上搜索,并通过使用glsl 4.0中的新功能子例程
找到了一个好的解决方案。这是一个非常棒的特性!谢谢分享……:)