Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ GLSL问题:一个程序中有多个着色器_C++_Opengl_Glsl_Shader - Fatal编程技术网

C++ GLSL问题:一个程序中有多个着色器

C++ GLSL问题:一个程序中有多个着色器,c++,opengl,glsl,shader,C++,Opengl,Glsl,Shader,我一定是误解了着色器: 我认为,由于可以将多个着色器附加到一个程序,因此可以简单地附加多个片段着色器,例如:使用颜色调制和折射渲染的板条箱纹理 但显然情况并非如此,因为每个程序只能有一个主函数 我怎样才能绕过主函数限制,允许多个片段着色器在同一个程序中进行动态组合,并相互调用 一个着色器中可以有多个程序,但反过来不行 要进行多个组合,最简单的方法是将每个主要块存储为具有命名入口点的片段,然后从另一个程序中包含它们,或者在运行时将它们组合到单个程序中,并按需要的顺序调用它们。但在处理输入和输出时

我一定是误解了着色器:

我认为,由于可以将多个着色器附加到一个程序,因此可以简单地附加多个片段着色器,例如:使用颜色调制和折射渲染的板条箱纹理

但显然情况并非如此,因为每个程序只能有一个主函数

  • 我怎样才能绕过主函数限制,允许多个片段着色器在同一个程序中进行动态组合,并相互调用

一个着色器中可以有多个程序,但反过来不行

要进行多个组合,最简单的方法是将每个主要块存储为具有命名入口点的片段,然后从另一个程序中包含它们,或者在运行时将它们组合到单个程序中,并按需要的顺序调用它们。但在处理输入和输出时,这可能会变得混乱


可以使用多个过程,每个过程具有不同的效果和程序。这会有一些额外的开销,但设置起来会更容易。

你不能。这称为着色器的组合爆炸。要么使用大量着色器(称为Übershader方法),要么我相信可以通过处理预处理器并动态生成所需的着色器来实现


GLSL的较新版本应该支持虚拟函数,这允许您像在CPU代码中那样模块化地构建它们—HLSL5就是这样。

您可以预定义一组入口点。假设效果数量有限(漫反射、镜面反射、环境等)。它们中的任何一个最多只能应用一次,因此您只需创建一个管理着色器,如下所示:

void apply_diffuse();
void apply_specular();
void apply_environment();

void main(){ ...
     apply_diffuse();
     apply_specular();
     apply_environment();
...}

然后,在链接着色器程序时,将相应的实现作为单独的GLSL对象附加。如果您不想要这种效果,某些实现可能是傻瓜。这种方法不需要源文本解析,几乎没有性能损失。

问题在于您使用的术语

让我做一个类比:

  • 可执行文件由链接对象组成,对象从源代码编译
  • 着色器程序由链接的着色器对象组成,着色器对象从源代码编译
如您所见,着色器程序是可执行的。它链接多个着色器对象。每个着色器对象都是从源代码编译的。对于通常的可执行文件,只有一个主入口点,它仅由一个着色器对象定义。就像使用任何编译工具链编译一样

解决方案是着色器对象组合和着色器程序数量之间的良好平衡。当然,只有一个着色器程序进行渲染会很漂亮,但这是在假装太多:尝试考虑着色器功能,然后分别编译这些功能并根据需要链接


您必须查看一下,我想您可能会在扩展列表中找到一些有趣的内容。

着色器中的程序?!什么时候着色器对象可以包含程序对象?着色器的层次结构是着色器、技术、过程和程序。每个过程都包含顶点、碎片、几何体和/或细分程序,并由一种技术(一组创建特定效果的连续过程)包含,该技术由一个着色器包含。@peachykeen你确定你说的是简单的GLSL着色器,而不是一些fx格式或可编程着色的一些思维抽象?该死,为什么他们不从一开始就将它构建到GLSL中?这似乎非常重要。@Nightshade:因为它非常慢,而且直到最近才变得必要,因为越来越多的着色技术已经出现。它不是非常慢,至少没有被使用。编译它确实需要更长的时间,所有版本的HLSL和Cg都支持它。GLSL只是缺少很多功能。@peachykeen:很有趣,因为MSDN网站清楚地将动态链接列为HLSL5的一项新功能。你只是没有回答主要问题-如何做?如何附着单独的GLSL对象,它们是什么?他们是着色器吗?但是我不能在一个程序中有多个片段着色器。@Simon一个GLSL程序链接任意数量的片段。它的工作方式与C程序的链接方式相同:可以有许多片段着色器,但只有一个必须具有
main()
函数。