马个鸡,总算编译过了自定义Shader,在此感谢自己,感谢自己,以及感谢自己。没有自己的努力,我是不可能解决这个问题的,自己真是太叼了。妈的智障!!!
管方那屎一样的make工具根本没用,反正我是折腾半天死活用不了,以及google都搜不到半点教程和相关解决方案让我差点放弃。
今早起来咽不下这口气,找出编译过的LumixEngine参考了一下,主要的问题就是不知道这个shaderc到底是怎么用的,缺少一个靠谱的参考。
根据这里提到,编译有include不到某某文件的问题,要包含bgfx_shader.sh,也就是要把bgfx/src目录加入到参数中
https://github.com/bkaradzic/bgfx/issues/1148
我目前用的成功的参数,例子测试的是bgfx\examples\01-cubes目录,图如下,建立dx11和glsl目录
ogl.bat
shaderc -f vs_cubes.sc -o .\glsl\vs_cubes.bin --depends -i ..\..\src --varyingdef varying.def.sc --platform linux -p 120 --type vertex -O3 shaderc -f fs_cubes.sc -o .\glsl\fs_cubes.bin --depends -i ..\..\src --varyingdef varying.def.sc --platform linux -p 120 --type fragment -O3
编译shaderc项目,会生成到
bgfx\.build\win32_vs2015\bin\shadercRelease.exe
改名为shaderc.exe,或其他你自己喜欢的,我用的shaderc,放到这个01-cubes项目下。
拉个命令提示符快捷方式过来,点击就在本目录打开。然后运行ogl.bat就行了。
参数上参考的
bgfx\scripts\shader.mk
这个文件写的
分别是
-f glsl脚本文本
-o 输出文件名
-i 包含bgfx_shader.sh的路径
--varyingdef varying.def.sc文件
--platform shader参数,这个平台不管你是win下还是linux还是什么,只要是glsl shader,就写linux,这玩意并不区分window glsl shader还是linux glsl shader,这是参考shader.mk写的
格式分3种,VS,FS,CS,对应顶点,像素,计算着色器,前缀vs,fs,cs似乎是必需的,没验证,但是昨晚搜的时候好像哪提到过。
于是运行就能编译glsl的shader了。
dx11.bat
shaderc -f vs_cubes.sc -o .\dx11\vs_cubes.bin --depends -i ..\..\src --varyingdef varying.def.sc --platform windows -p vs_4_0 -O 3 --type vertex -O3 shaderc -f fs_cubes.sc -o .\dx11\fs_cubes.bin --depends -i ..\..\src --varyingdef varying.def.sc --platform windows -p ps_4_0 -O 3 --type fragment -O3
这是我用的dx11编译项
然后我们来试着修改一下fs shader内容
$input v_color0 /* * Copyright 2011-2018 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause */ #include "../common/common.sh" void main() { // gl_FragColor = v_color0; gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); }
把颜色改为纯红色
编译出来的bin替换
bgfx\examples\runtime\shaders\glsl
目录下对应的bin,替换前可以备份一下原文件
看到鲜红的颜色,知道终于成功了
换到DX11模式再测试一下
$input v_color0 /* * Copyright 2011-2018 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause */ #include "../common/common.sh" void main() { // gl_FragColor = v_color0; gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0); }
大功告成,坑弃回归Urho3D