环状血条的两种绘制方法——理解混合以及着色器
Autukill 发表于 2015-11-07 10:00:48 1303

本帖最后由 Autukill 于 2015-11-7 22:15 编辑

先上代码(GMS 1.4.1567):
Circle_Health_Bar_Blend (由我编写):
链接:http://pan.baidu.com/s/1kTKYqJd 密码:qhvt

Circle_Health_Bar_Shader(tifaices编写):
链接:http://pan.baidu.com/s/1bnfrg6N 密码:iqqa
两个实现方式,只适用于GMS,因为:
[list]
[*]GM 不支持 draw_enable_alphablend( )
[*]GM 不支持 shader
[/list]
[hr]
Circle_Health_Bar_Blend

实现思路:使用混合模式、表面以及2D几何图元绘制。

[list]
[*]表面隔离混合模式对外界的影响,同时减少2D几何图元的绘制次数,通常只绘制1次(一个三角形)
[*]2D几何图元绘制 结合 混合模式,覆盖希望消除的血条区域
[/list]
说明:
变量 surface 存储血条表面,同时,表面应该在 Begin Step 事件中执行创建。
变量 surf_need_ini 指明 surface 是否应该更新内容。同时,每次操作 surface ,都检测表面的存在状态,而且更新 surf_need_ini 的值。

函数 draw_enable_alphablend 是 GMS 新加入的函数,意思就是:当前像素的alpha值直接覆盖之前坐标上的alpha值。
利用这个原理,我用 alpha 为0 去覆盖 希望消除 的血条区域。

[hr]
混合模式 和 着色器是完全不同的东西
通常,着色器比混合模式快。

[hr]
Circle_Health_Bar_Shader

实现思路:使用着色器丢弃不要的像素

说明:
创建shader,会为我们自动填充好 顶点(Vertex)着色器 片段(Fragment)着色器
为了能操作每一个像素,需要
[list=1]
[*]Vertex 着色器中 声明 varying(变量) vec2 v_vPosition;并在main()中赋值v_vPosition = object_space_pos.xy;
[*]Fragment 着色器中 再次声明 varying(变量) vec2 v_vPosition;这样,我们就能在 Fragment 着色器中获取当前像素的实际坐标了
[/list]
Fragment 着色器中,利用点斜式方程求出当前像素坐标x值所映射的y值,用于后面的比较。

最新回复 (3)
  • serbow 发表于 2015-11-08 11:02:52
    0 2
    :D:D:D:D:D:D:D:D:D
  • serbow 发表于 2015-11-11 03:38:54
    0 3
    技术好高端,本想掌握一下,不过感觉好难,收藏下来。看到这一技术,发现我的笨办法,真的太笨了。