Opengl 为什么Blender导出的着色器(*.frag,*.vert)在Irrlicht中变为黑色

Opengl 为什么Blender导出的着色器(*.frag,*.vert)在Irrlicht中变为黑色,opengl,glsl,shader,irrlicht,Opengl,Glsl,Shader,Irrlicht,我在Irrlicht 1.8.3中遇到了“官方tuto 10着色器”,我修改了这个官方示例,以使用我使用插件从Blender导出的着色器: 导出的材质只是由简单的漫反射和镜面反射颜色组成,这些颜色根本不是黑色的,但在Irrlicht中看起来是黑色的 这里是Irrlicht SDK中着色器tuto的一部分(我刚刚修改了加载的着色器的名称),假设没有使用CG,并且使用了高级着色器 case video::EDT_OPENGL: if (UseHighLevelShaders) {

我在Irrlicht 1.8.3中遇到了“官方tuto 10着色器”,我修改了这个官方示例,以使用我使用插件从Blender导出的着色器:

导出的材质只是由简单的漫反射和镜面反射颜色组成,这些颜色根本不是黑色的,但在Irrlicht中看起来是黑色的

这里是Irrlicht SDK中着色器tuto的一部分(我刚刚修改了加载的着色器的名称),假设没有使用CG,并且使用了高级着色器

case video::EDT_OPENGL:
    if (UseHighLevelShaders)
    {
        if (!UseCgShaders)
        {
            /**I MODIFIED NAMES OF THE ORIGINAL FRAG VERT FILES BELOW*/
            psFileName = "../../media/mat_Material.frag";//opengl.frag";
            vsFileName = "../../media/mat_Material.vert";//opengl.vert";
        }
        else
        {
            // Use HLSL syntax for Cg
            psFileName = "../../media/d3d9.hlsl";
            vsFileName = psFileName; // both shaders are in the same file
        }
    }
    else
    {
        psFileName = "../../media/opengl.psh";
        vsFileName = "../../media/opengl.vsh";
    }
    break;
}

查看您发布的着色器文件,问题很明显:Blender游戏引擎使用的制服和Irrlicht使用的制服非常不同(名称不同,语义不同)。您不能简单地将任意着色器文件放到现有引擎中,并期望它“只是”工作。您必须调整它,使其与加载它的主机呈现代码相匹配。

您显示的代码片段是无用的。亲自查看着色器更有趣。结果显示为全黑表示着色器没有首先运行,或者某些制服设置不正确。我们需要查看着色器代码,理想情况下还需要查看Irrlicht绑定到着色器的代码。但是生成的FRAG文件大约有5200行代码:/好吧,继续并发布它。我们需要看到它。不要使用pastebin,只需将其放入容器中即可。要保存一些格式,请在一些编辑器中打开它,并预先应用一个缩进(4个空格或一个选项卡),以便它正确显示。顺便说一句:5.2k LoC对于片段着色器来说非常有用。感谢您的帮助,这里是指向生成的Blender VERT文件的链接,这里是指向生成的Blender FRAG文件的链接,还有原始的Irrlicht VERT文件,最后是原始的Irrlicht FRAG文件(需要单击这些链接以查看内容)好的,非常有用,我将研究如何调整这个,我真的需要为我的游戏创作项目解决这个问题,谢谢you@3DMaker这里有几件事要考虑。首先,Blender的游戏引擎与Blender自己的材料系统紧密集成;着色器源由混合器动态生成。还有许多条件代码路径(比如Pixar是否支持OpenSubdiv曲面细分库,或者Blender游戏引擎是否检测到它正在AMD/ATI GPU上运行)。Irrlicht着色器不会执行任何操作。如果你要正确地解决这个问题,最好的方法(听起来可能很愚蠢)实际上不仅是输出GLSL源,而且是Irrlicht的C++源代码,然后你再添加到你的RiLiCH项目中,然后从那里使用。事实上,着色器通常与使用它们的OpenGL代码紧密耦合,所以在某种意义上讲,将一个完整的着色器程序导出到C++编译单元/类(用GLSL源完成),然后在程序中实现。我想我将使用简单的MTL格式,它由Blender支持,并被Irrlicht毫无问题地理解