IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 尝试搭建webgl游戏引擎-起头 -> 正文阅读

[游戏开发]尝试搭建webgl游戏引擎-起头

为了满足自己的好奇心
准备自己尝试搭一个小的webgl网页游戏引擎
然后 记录自己开发的进程和遇到的问题

立个flag。用自己的引擎开发一款《跳一跳》

进度效果展示

进度图

目前包含了

  • 初阶webgl管理器
  • typescript+webpack框架
  • 初阶资源、实体、组件架构
  • 文字标签
  • 2d图片
  • 方盒子
  • 初阶光照
  • 初阶节点树

创建webgl管理器

主要参考了《webgl编程指南》这本书的第九章第二节

简单来说,需要如下步骤来做一个webgl地基

  • 利用准备好的shader字符串,用webgl创建顶点和片元shader
  • 创建webgl程序
  • 编译shader并附加到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版本

没有系统学习过相关知识,所以解决问题还是很耗费时间。

绘制内容基础

如果要绘制基础形状,需要在这个基础上增加一些功能:

  • 在顶点shader内添加坐标的输入,uv的输入。
  • 启动对应的webgl程序。(一套shader对应一个程序)。
  • 用代码给webgl程序添加对应的数据
  • 清除背景,并绘制形状

顶点信息输入可以用layout(location=x)类型 名称 来声明
这样在代码里就可以直接设置,不用获取地址了。

要绘制多个点,一般采用buffer的形式,可以一次性给顶点程序传入很多数据。

此步遇到的问题
这一步主要遇到的问题是程序切换的问题。
为了减少开销,创建数组和buffer和贴图等都只做一次。在切换程序后进行绑定。

——————
ok。先写到这。最近打球腰闪了。好久没运动了。
下一篇写文字的创建

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-07-03 11:07:46  更:2022-07-03 11:08:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 11:11:02-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码