为了满足自己的好奇心
准备自己尝试搭一个小的webgl网页游戏引擎
然后 记录自己开发的进程和遇到的问题
立个flag。用自己的引擎开发一款《跳一跳》
目前包含了
主要参考了《webgl编程指南》这本书的第九章第二节
简单来说,需要如下步骤来做一个webgl地基
此步遇到的问题
第一个问题是加载和解读shader字符串。
因为需要把shader作为单独的资源来处理,所以创建了*.glsl来保存shader。
然后利用了webpack的raw-loader来加载shader。
我还想把顶点和片元shader写在一起。
所以就用特殊的分隔符来分开了顶点和片元内容。
然后用正则根据分隔符提取顶点和片元内容,提供给webgl管理器。
用的正则是:
some.glsl
vertex%{
void main(){
gl_Position=vec4(0,0,0,1.0);
}
}%
fragment%{
void main(){
gl_FragColor=vec4(1.,1.,1.,1.);
}
}%
some.ts
const vertex = shader.match(/vertex\%\{([^\%]+)\}\%/)![1].replace(/^[^# ]+/, '');
const fragment = shader.match(/fragment\%\{([^\%]+)\}\%/)![1].replace(/^[^# ]+/, '');
很简单,但是目前还是比较有效。
第二个问题是glsl版本问题
因为想要使用in out的功能。所以需要改版本号。
就是在shader内容第一行加上#version 300 es这样的东西。
但是因为《webgl编程指南》没有用到,所以在csdn里查了很久。
也不是很懂。一直没整出这一行来。
很长时间是只写了#version 300,怎么都会报错。
不让这不让那的。
最后查glsl版本的文章,才发现需要加es标识,表示嵌入式系统
用于Android, iOS, WebGL
ES是:
OpenGL for Embedded Systems
参考:webgl版本
没有系统学习过相关知识,所以解决问题还是很耗费时间。
如果要绘制基础形状,需要在这个基础上增加一些功能:
顶点信息输入可以用layout(location=x)类型 名称 来声明
这样在代码里就可以直接设置,不用获取地址了。
要绘制多个点,一般采用buffer的形式,可以一次性给顶点程序传入很多数据。
此步遇到的问题
这一步主要遇到的问题是程序切换的问题。
为了减少开销,创建数组和buffer和贴图等都只做一次。在切换程序后进行绑定。
——————
ok。先写到这。最近打球腰闪了。好久没运动了。
下一篇写文字的创建