【GMS】shader入门教程
gamemaker吧
全部回复
仅看楼主
level 6
质子结构 楼主
1l
2016年06月09日 15点06分 1
level 6
质子结构 楼主
这个是缓更……人多了再考虑更……
2016年06月09日 15点06分 4
[冷]
2016年06月10日 05点06分
……
2016年06月10日 06点06分
……
2016年06月10日 06点06分
………
2016年06月10日 06点06分
level 15
雾草一直找不到GMS的shader教程,顶顶顶
2016年06月09日 15点06分 5
level 7
顶起,GLSL太恶心了一直没学好
整型永不能与浮点做运算,floor返回值还是浮点等一系列奇葩特性让我磕不下去了。。
希望这贴有帮助
2016年06月10日 07点06分 6
这个其实窝建议尽量使用类型相同的变量进行运算,因为在编程里类型转换是需要消耗性能的
2016年06月10日 08点06分
另外GLSL虽然不支持显式或隐式类型转换,但支持构造函数类型转换,例如int abc = int(3.0) + 2;
2016年06月10日 08点06分
@质子结构 多谢,会认真学习的ww
2016年06月14日 03点06分
吧务
level 12
质子终于填坑了......
2016年06月10日 07点06分 7
吧务
level 12
另外,shader算是gms最强大的功能了。某种程度上可以代替混合模式和表面。
举个例子,用shader绘制动态水的波动效果,且不说代码多少(传统方式用表面,纹理混合模式什么的),shader用显卡处理的效率不是cpu能比拟的。
所以我建议完GMS的朋友,一定要用好shader。
只会用不会编写也ok,比如说我:)但这样就不能发挥自己的想象空间了。
2016年06月10日 07点06分 8
level 7
顶帖[乖]楼主请务必更新
2016年06月10日 16点06分 9
level 6
质子结构 楼主
额外漫画科普一下GPU并行运算的特点
与CPU相比,GPU拥有更多逻辑运算单元(ALU)
虽然单个的GPU运算单元会比CPU的运算单元慢,但GPU可以同时并行运算更多的像素
但是GPU的控制流方面会弱于CPU,例如for循环,因此shader中要慎用if...else...、for之类的控制语句
2016年06月10日 16点06分 10
这个原理讲的太好了
2016年06月12日 07点06分
滑稽乱入[滑稽]
2017年10月04日 16点10分
level 8
gm果然是基于opgl开发的。。最近在学opgl[呵呵]
2016年06月12日 01点06分 12
看这些保留的内置变量好像是版本比较低的gl,不过做2d够用[少林寺]
2016年06月12日 01点06分
我一直不明白我记得gm好像是dx9的但为啥用的是gl的着色器。。。
2016年06月12日 02点06分
@sunyubokkkkk DirectX只支持win,不方便移动端的……
2016年06月12日 02点06分
回复 sunyubokkkkk :gm8是dx8 gms是dx11和opgl
2016年06月13日 06点06分
level 6
质子结构 楼主
前面讲的是全局变量的声明
现在来看看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。这么空间变换的目的是硬件要这么做才能正确绘制。
2016年06月14日 13点06分 13
吧务
level 12
顶质子!
2016年06月14日 14点06分 14
level 6
质子结构 楼主
没人的话就这样了……
2016年06月16日 09点06分 15
[滑稽]有人啊有人啊
2016年06月18日 10点06分
level 15
人啊人啊人在此
2016年06月17日 00点06分 16
level 6
质子结构 楼主
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变量也是这个原理。
2016年06月19日 02点06分 17
0.675→0.625
2016年06月19日 14点06分
吧务
level 12
顶质子学知识!
你这名字有点像那个穿日本和服女人的,后来还背了一把日本刀。。。。。。。。
2016年06月19日 13点06分 18
智子么
2016年06月19日 14点06分
@质子结构 看来你也是三体爱好者。。。。。
2016年06月19日 14点06分
1 2 3 尾页