i_wanna_be_the_guy吧 关注:62,566贴子:1,119,767

这是一个给i wanna游戏服务的shader学习帖

只看楼主收藏回复

搬用下自己视频的简介
就我所知国外的i wanna游戏基本都动用过shader这项科技,而国内目前为止如果有也是极少的,比如国产耐久天团做特效也是用表面处理,也就导致了w和k某人的游戏特效炫酷但一般电脑带不动
而shader不光泛用性强,同时兼具运行效率极高的优点,可以说是碾压单用draw来做特效
比如著名耐久作者razzor在RNG地牢里做的耐久,里面的旋转骰子就是靠shader来实现的,可以说是一个炫酷吊炸天的科技


1楼2022-11-06 10:00回复
    shader为什么运行效率特别快,下面两张图能形象地说明,第一张图放在GM里就是用draw事件(cpu)来处理画面,可以看到是一个像素一个像素的处理,拿i wanna来讲,一个画面800*608像素大小,也就是说处理完整个画面需要800*608步,这是相当耗时的,极有可能让部分电脑带不动,而第二张图是shader(GPU)的运行方式,可以看到,它能对一个画面中的每一个像素并行处理,也就是800*608的画面只需一步完成,这个效率天差地别



    2楼2022-11-06 10:18
    回复
      2026-09-09 02:44:52
      广告
      不感兴趣
      开通SVIP免广告
      值得注意的是,只有GMS才会有shader,GM8是没有shader这个东西的,想要用shader建议先下个GMS2或1
      这里我们使用GMS1
      一开始拿shader做特效,我们可以先整些简单的特效,比如边缘炫彩,如下图,这不得不让我想到了我玩
      I wanna Apricot ILLUSION时候后面也有个类似特效,但是给我电脑卡的不行,用shader实现同样效果就十分流畅,但老实说在做这个特效之前,我们可以先学些再简单些的基础玩意,首先先让我们新建一个shader吧



      3楼2022-11-06 10:27
      回复
        我们这里采用像素着色器(顶点着色器其实没什么用),我们可以开始写一个类似hello world的最简单shader
        然后在obj的绘制事件里使用这个shader,解释已经在图中标注了




        这就是我们的第一个shader了


        4楼2022-11-06 10:35
        回复
          需要注意的是,在shader脚本里写代码必须要在结尾处写分号,请改掉GML的毛病,同时对数据类型也有严格要求,而且shader里还引进了先前我们没接触过的数据类型:向量 其实就是向量坐标
          而x,y也不是指位置上的坐标了,指的是这个向量的坐标
          gl_FragColor是四元向量,由四个值确定,分别为r g b a
          下图中包含了数据类型和运算律



          5楼2022-11-06 10:39
          收起回复
            于是我们可以来实践下我们学习的运算律,经典的灰度算法告诉我们,黑白化就是让每个像素的rgb三个值均变成原来rgb三个值的平均值,这就是一个事实,不信可以拿一个图像编辑器做一下试验
            于是代码如下


            成功实现黑白化


            6楼2022-11-06 10:41
            回复
              两周后讲uniform,我草我的时间实在是太紧了


              7楼2022-11-06 10:42
              回复
                顶一下


                8楼2022-11-06 13:07
                回复
                  2026-09-09 02:38:52
                  广告
                  不感兴趣
                  开通SVIP免广告
                  事实上,我们在做画面特效的时候肯定是想实现动态效果而非一个静止画面,于是我们就需要把cpu(gml)里的一些动态变化的量传入shader里,继续拿之前的灰度化举例子,我们能否实现从原来的画面过渡到黑白化而非一个静止的黑白miku,,就好像domu里的灰白化一样,这当然是可以实现的


                  9楼2022-11-19 09:18
                  回复
                    太强拉 但是gm8用不了 建议你赶紧出个表面教学。不然我头给你拧掉


                    IP属地:重庆来自Android客户端11楼2022-11-19 13:03
                    收起回复
                      支持


                      IP属地:江苏来自Android客户端12楼2022-11-22 00:15
                      回复
                        太强拉,但是我已经八百年没写过代码了(x)


                        IP属地:湖南来自Android客户端13楼2022-11-28 05:10
                        回复
                          催更


                          IP属地:江苏来自Android客户端14楼2022-12-01 20:37
                          回复
                            催更


                            IP属地:山东15楼2022-12-06 09:06
                            回复
                              2026-09-09 02:32:52
                              广告
                              不感兴趣
                              开通SVIP免广告
                              我们已经感受到了shader对颜色的变换了,接下来我们将讲讲如何用shader绘制形状,虽说我们可以用自带绘制函数来画一些形状,但是只有三角形与长方形局限性实在太强,而使用shader,我们能设计出无穷多我们想要的图案


                              17楼2022-12-17 20:30
                              回复