【求助】关于如何在GameMaker:Studio2 2.3.2中绘制隐函数的问题
gamemaker吧
全部回复
仅看楼主
level 7
最近在整一个函数绘图软件,关于显函数绘制部分有思路,了解绘制原理,但是关于隐函数的绘制还是没啥头绪。
前几天想到了个把x,y传入shader中由shader计算后绘制的方法,然而调了一晚上啥也没搞出来,我是这样写的
float pw = 512.0; // 定义x,y基向量(ps:i=pw/1024,j=ph/1024)
float ph = 512.0;
// 储存uv坐标并对其进行放大处理
vec2 uv = (v_vTexcoord * vec2(pw, ph) - vec2(pw / 2.0, ph / 2.0)) / 2.0; // 使坐标原点回到纹理中心
float end = (pow(uv.x, 2.0) + pow(uv.y, 2.0)) / 100.0; // 计算隐函数方程的值
gl_FragColor = v_vColour * vec4(0.0, 0.0, 0.0, floor(2.0 * clamp(abs(end), 0.0, 1.0) - abs(end))); // 只保留符合条件的值(只保留1或负数,没有任何小数或大于1的数)
把这个shader套用到一个1024*1024大小的spr上,绘制的时候没有出现任何东西,但是如果把gl哪一行代码改成
gl_FragColor = v_vColour * vec4(0.0, 0.0, 0.0, floor(2.0 * clamp(abs(end), 0.0, 1.0) - abs(end)));
2022年03月04日 16点03分 1
level 7
草,字还没打完不小心发了,接上文
把这个shader套用到一个1024*1024大小的spr上,绘制的时候没有出现任何东西,但是如果把gl哪一行代码改成
gl_FragColor = v_vColour * vec4(0.0, 0.0, 0.0, 1.0);
spr是被正常绘制了出来,是一个1024*1024的黑块
不知道是因为我shader部分写错了还是什么的,总之无法绘制,调试了3小时啥也没敢出来,觉得shader这个方法行不通,于是想问问还有没有更好的方法
(PS:shader里用的是圆的一般方程,只是为了测试)
2022年03月04日 16点03分 2
吧务
level 13
已知情况:
绘制spr时,uv的值可能不是0到1(大部分spr并不会占满纹理页),咱是懒得找那些坐标参数都在哪所以一般都是绘制surface,这样uv就一直是0到1范围了。
GMS2的shader里,x、y、z、u、v、r、g、b、a这些都是关键字,有color.r这样的写法。同时color.rgb这样的写法也存在。所以那个叫uv的vec2型变量,建议改成别的名字。
最后,代码部分咱没细看,就提示一下shader的rgb范围是0到1,溢出部分取范围内最贴近的值。如果函数结果是10到100的值,那看上去确实都是白色
2022年03月05日 01点03分 3
uv值我估摸着应该是0到1,因为spr的大小正好是2的幂次方, 然后关于溢出部分的,alpha参数的那一栏,不会有大于1的数,只会出现1或负数,我在step试过那一串计算alpha的算式,按照透明度绘制出来确实是一个圆,而且debug时算式也只出现过负数或1,所以应该不是算式的问题来着
2022年03月05日 07点03分
按照dl说的把uv换成了texuv,运行后依旧是无明显变化(搞得我都怀疑是可能画出来了但是太细了,,)
2022年03月05日 07点03分
草,好像确实是uv的问题,后面我给alpha参数那一栏加了个1.0,绘制出来个在右下角的半椭圆,我把所有代码复制到glsl在线编辑器里绘制出来个在中心的圆,所以可能是uv坐标不是0-1,有什么解决办法吗
2022年03月05日 09点03分
@永远的伊厨🌸 咱是知道了绘制sprite是整张纹理页作为纹理传递时就尽量不draw sprite了。而是改用draw surface替代。
2022年03月07日 00点03分
level 7
最新消息,问题成功解决并绘制了函数
2022年03月05日 15点03分 4
先恭喜一下,如果方便把遇到的坑和处理方案整理一下的话,感觉这帖可以加精了
2022年03月07日 00点03分
@q糖豆p
2022年04月09日 12点04分
@q糖豆p 不过我这个函数绘制没有特殊要求应该不会有这个需求罢,所以其实用处不大(
2022年04月09日 12点04分
1