gamemaker吧 关注:13,657贴子:95,279

【GMS】shader入门教程

只看楼主收藏回复

1l


1楼2016-06-09 23:40回复
    这个是缓更……人多了再考虑更……


    4楼2016-06-09 23:45
    收起回复
      2025-05-09 21:23:50
      广告
      雾草一直找不到GMS的shader教程,顶顶顶


      IP属地:上海来自Android客户端5楼2016-06-09 23:56
      回复
        顶起,GLSL太恶心了一直没学好
        整型永不能与浮点做运算,floor返回值还是浮点等一系列奇葩特性让我磕不下去了。。
        希望这贴有帮助


        IP属地:浙江6楼2016-06-10 15:10
        收起回复
          质子终于填坑了......


          IP属地:北京7楼2016-06-10 15:18
          回复
            另外,shader算是gms最强大的功能了。某种程度上可以代替混合模式和表面。
            举个例子,用shader绘制动态水的波动效果,且不说代码多少(传统方式用表面,纹理混合模式什么的),shader用显卡处理的效率不是cpu能比拟的。
            所以我建议完GMS的朋友,一定要用好shader。
            只会用不会编写也ok,比如说我:)但这样就不能发挥自己的想象空间了。


            IP属地:北京8楼2016-06-10 15:25
            回复
              顶帖楼主请务必更新


              IP属地:上海来自Android客户端9楼2016-06-11 00:22
              回复
                额外漫画科普一下GPU并行运算的特点

                与CPU相比,GPU拥有更多逻辑运算单元(ALU)
                虽然单个的GPU运算单元会比CPU的运算单元慢,但GPU可以同时并行运算更多的像素
                但是GPU的控制流方面会弱于CPU,例如for循环,因此shader中要慎用if...else...、for之类的控制语句


                10楼2016-06-11 00:46
                收起回复
                  2025-05-09 21:17:50
                  广告
                  gm果然是基于opgl开发的。。最近在学opgl


                  IP属地:辽宁12楼2016-06-12 09:22
                  收起回复
                    前面讲的是全局变量的声明
                    现在来看看void main(),学过C语言都知道main的吧~ 在GLSL里也一样,无论vertex还是fragment shader都必须执行main函数,所有顶点或像素的主要操作都在里面了。
                    main函数里的前两句:
                    vec4 object_space_pos = vec4( in_Position.x, in_Position.y, in_Position.z, 1.0);
                    gl_Position = gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION] * object_space_pos;
                    把in_Position的xyz赋值到自定义四维向量object_space_pos中,用1.0补充第四个分量。坐标的第四个分量,如果是1代表位置,是0代表方向,所以这里用1.0。in_Position是GMS固定用来识别顶点坐标位置的变量,在之前的attribute vec3 in_Position声明,在2D中其xy分量分别代表sprite矩形的四个顶点坐标,z暂时不必管。in_Position是顶点的物体空间(object space)坐标,这里由vec3转换成vec4,是为了接下来进行的坐标空间变换左乘一个4x4的变换矩阵。由于2D很少涉及复杂的空间变换,这里只简单解释一下。
                    不同的坐标空间有不同的坐标系,于是描述物体的位置坐标就发生了变化。比如,你发现隔壁老王在你正前方10米,面向左方干些奇怪的事情,在你的坐标空间x轴为右y轴为前的话,描述老王的位置可以用(0,10)坐标来表示,那么在老王的坐标空间,你在老王正左边,而老王又习惯用厘米,那么老王描述你的位置可以用(-1000,0)坐标来表示。空间变换就是转换坐标系这么一个过程,数学上通常是 4x4变换矩阵*四维位置坐标。谁乘以谁的顺序很重要,写反了会得出完全不一样的结果哦!矩阵gms已经帮你准备好了,就是gm_Matrices[MATRIX_WORLD_VIEW_PROJECTION]。
                    in_Position的object space,其实就是gml里room的坐标。vec4化后左乘那个矩阵,最后映射到投影空间(projection space)保存到gl_Position。对于投影空间,只考虑xy,就是以屏幕中心为原点建立的二维坐标系,坐标映射到[-1,1]。也就是,屏幕左下角为(-1,-1),中心点为(0,0),右上角为(1,1)。z通常代表深度,类似gml的depth,在这个shader里恒为0.5。这么空间变换的目的是硬件要这么做才能正确绘制。


                    13楼2016-06-14 21:03
                    回复
                      顶质子!


                      IP属地:北京14楼2016-06-14 22:16
                      回复
                        没人的话就这样了……


                        15楼2016-06-16 17:13
                        收起回复
                          人啊人啊人在此


                          IP属地:上海来自Android客户端16楼2016-06-17 08:10
                          回复
                            main函数的最后两句:
                            v_vColour = in_Colour;
                            v_vTexcoord = in_TextureCoord;
                            in_Colour是顶点颜色,in_TextureCoord是顶点坐标,GMS固定的顶点属性变量。v_vColour、v_vTexcoord是自定义的varying变量,前面说过,vertex shader是将这些值经过渲染管线插值然后传递到fragment shader的,fragment shader才因此可以使用。随便用顶点颜色举个栗子大致过程是:

                            Fragment Shader的中间像素值是根据Vertex shader的值线性插入的。其他varying变量也是这个原理。


                            17楼2016-06-19 10:54
                            收起回复
                              2025-05-09 21:11:50
                              广告
                              顶质子学知识!
                              你这名字有点像那个穿日本和服女人的,后来还背了一把日本刀。。。。。。。。


                              IP属地:北京18楼2016-06-19 21:37
                              收起回复