微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何允许用户为 openGL 软件自定义着色器

如何解决如何允许用户为 openGL 软件自定义着色器

例如,在 Unity 或 Unreal 等软件中,它们如何允许用户将自己的自定义着色器添加到对象中? 这个自定义着色器只是一个普通的片段着色器还是另一种着色器?而如果只是一个片段着色器,它们是如何处理灯光的?

我不会在这里发布代码,因为它很大并且会污染页面,但是我开始在这里学习:https://github.com/opentk/LearnOpenTK/blob/master/Chapter2/6-MultipleLights/Shaders/lighting.frag(这是一系列教程,这是上次的着色器一个),他们说我们应该把光类型放在函数中,在片段着色器中,计算每个片段的颜色。

例如,这个计算定向光的函数提取自我上面发送的代码

vec3 CalcDirLight(DirLight light,vec3 normal,vec3 viewDir)
{
    vec3 lightDir = normalize(-light.direction);
    //diffuse shading
    float diff = max(dot(normal,lightDir),0.0);
    //specular shading
    vec3 reflectDir = reflect(-lightDir,normal);
    float spec = pow(max(dot(viewDir,reflectDir),0.0),material.shininess);
    //combine results
    vec3 ambient  = light.ambient  * vec3(texture(material.diffuse,TexCoords));
    vec3 diffuse  = light.diffuse  * diff * vec3(texture(material.diffuse,TexCoords));
    vec3 specular = light.specular * spec * vec3(texture(material.specular,TexCoords));
    return (ambient + diffuse + specular);
}

但我从未见过人们在 Unity 中的着色器中添加灯光,例如,人们只是添加纹理并弄乱颜色,除非他们真的想特别弄乱灯光。

有没有办法只制作一个片段着色器来计算所有类型的光,然后用户可以在此之上应用另一个着色器,仅用于对象材质?

如果您不知道如何回答但有一些很好的阅读材料,或者我可以在那里了解有关 openGL 和 GLSL 的更多信息,那也很有价值。

解决方法

构建着色器文件有几种不同的方法,每种方法都有不同的优缺点。

  • 作为单独的程序。您将每个文件都设为自己的着色器程序。添加新程序很简单,并且允许您的用户只用 GLSL、HLSL 或引擎自定义着色器语言编写程序。您必须为用户提供某种方式来表达程序期望的数据类型,除非您从引擎查询它,但制作足够通用的东西可能会变得复杂。

  • Über Shader! 将所有需要的功能放在一个着色器中,让行为由控制流或预处理器宏控制,例如 #ifdef .因此,用户只需编写主函数(应用程序将其添加到着色器的其余部分)。这允许您让用户使用所有预定义的变量和函数。明显的缺点是它可能很大且难以处理,小的更改可能会破坏许多着色器。

  • 微着色器。每个程序都包含一个小的、通用的功能,应用程序将它们全部连接到一个正常运行的着色器中。用户只需编写主函数并告诉程序要添加哪些功能。问题是很容易在名称中出现冲突,除非您小心并且比 über 着色器 更难实现。

  • 效果文件。Microsoft’s effect frameworkNVIDIA’s CgFX framework 提供(已弃用)。

  • 抽象阴影树。实际上不知道这是什么,但它是 suppose to be a solution

您还可以结合使用其中的一些技术或尝试根据您的需要发明自己的解决方案。 Here's 讨论的解决方案(在2.3.3 现有解决方案 部分)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。