果然是我想复杂了。 如果光是为了做视野的话,根本不需要用到Shader,只要能用DX往画面上叠加3D模型就好了。 如果屏幕是20x15格的话 ,就搞一个20x15格的3D平面模型,顶点是每个格子的中心点, 然后顶点的颜色是那个格子的亮度,格子中间的颜色让他自己去插值。 设置合适的视角让他显示出来和屏幕一样大。 生成了这样一个3D模型以后,渲染到纹理,然后传送给RGSSBitmap 就可以了。 但是这个问题还是留在这里。毕竟用了Shader可以实现更多的功能啊 |
除非你不用RMAV,否则不可能,因为语言不同,就算转换成同种语言也不会是一种效果 |
本帖最后由 viktor 于 2013-4-5 15:29 编辑 恩……好吧我还是把视野脚本悄悄地贴出来吧。关于实现原理在这里不想做更多的解释了,看了就知道了其实做法很水 而且也并不是真正的【光照】计算。 因为我根本就没有想要做光照 只是想做一个根据当前的地图障碍物的情况改变视野明暗的,实时的 但是是伪的 视野效果。这个效果有点像是Elona的那种 主要的函数是iterate_tiles和update_bitmap,像素填充和准备做的模糊都写在update_bitmap里面,那个也是主要要优化的地方 http://blog.csdn.net/xulai1001/article/details/8761416 @Sion @yangff |
本帖最后由 yangff 于 2013-4-5 00:01 编辑 我懂了,你的光照是一个窗口大小的bitmap是吧。 很遗憾的告诉你……就算你用了Shader,优化效果不会特别明显(比Ruby肯定快,但是和直接用C操作),而且这种实现其实是有问题的。 首先,你是要计算一个BrightnessMap作为每个像素的亮度, 如果直接 for i in 0...width for j in 0...height end end 的话非常慢(O(N^2))(其实我搞不懂你为什么一定要用模糊)。 另外我也不知道你到底用了什么算法计算: 是根据光源暴力扩展亮度还是根据距离和轮廓线进行计算…… 【另外提一点,这里可以用kdtree优化……具体看《计算几何算法与应用》光线采样什么的。。】 但是实际上就算你用了shader……也不能改变内存和显存交换数据的问题…… (如果要做到兰兰所谓的单向,仅仅外包一个dx是不够的) 数据交换还是width*height的…… 所以我还是坚持,MMX解决问题…… 另外,我不知道你是怎么把光源合成进地图的。 如果是修改地图的亮度,然后把光源用加法合成上去……其实是会出问题的。 不细说,你把全局亮度调到0,然后光源亮度随便给,东西会全部没掉。 不过如果是固定alpha然后修改颜色……虽然可以……但是其实效果比较坑爹。。 |
不需要操作Tilemap,只需要引用里面的地形标记。现在是直接Fill_rect填充32x32的格子,每帧大概0-800次操作,是可以流畅运行的。 但是我还需要动态模糊效果。所以想到用shader 当然如果使用MMX混合的话,还有一种办法就是做一个32x32的圆形渐变图,把它按照当前格子的亮度值 blend到光照mask上面,但是这样做也就是15年前云风那个时代使用的折中的处理办法。在云风的博客里面也有很多相关内容。相比之下,如果能够使用Shader 岂不更加优美一些? |
站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作
GMT+8, 2024-11-9 02:50
Powered by Discuz! X3.1
© 2001-2013 Comsenz Inc.