周刊麻将Sunday 发表于 2016-8-22 18:36

【非战】运动模糊和帧数

本帖最后由 周刊麻将Sunday 于 2016-8-22 18:40 编辑

书记那贴被关闭了,他的意思似乎是90年代的游戏卡是因为没有运动模糊而不是帧数低? 试验了一下。@tenco
如果不合适的话这贴也关了吧……
视频链接:https://pan.baidu.com/s/1i536ROT
内含三个视频。

http://ww4.sinaimg.cn/mw690/dea8c181jw1f72onyyhnaj211s0lcdl3.jpg
简单的视频,黑色背景中黄色球体下落,速度为每毫秒0.1像素,大概因为图片简单,每秒33帧(30ms一帧)时不卡顿,一拍二时(60ms一帧)有明显卡顿现象。
30.avi是30ms每帧每秒生成的视频(但所有三个视频帧数都压缩成了30FPS,但是时间差不太多就这样吧),60.avi是一拍二的视频,60blur.avi是60.avi的有运动模糊版(30ms的运动模糊和原视频几乎完全相同)。

运动模糊的计算: 人眼按1/24秒残留时间计算,1000/24/10=4.166666,模糊尺度按4或者5计算(结果到8都差不多),因为是垂直运动,模糊矩阵是一个长度为4的列向量:
[0.25;
0.25;
0.25;
0.25]

代码(opencv)
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
int main(int argc, int ** argv)
{
    IplImage* img = cvCreateImage(cvSize(500, 500), 8, 3);                  //原图
    IplImage* img2 = cvCreateImage(cvSize(500, 500), 8, 3);                  //模糊图像
    CvVideoWriter* video = NULL;
    //video = cvCreateVideoWriter("60mo.avi", CV_FOURCC('X', 'V', 'I', 'D'), 30, cvSize(img2->width, img2->height));         //录视频用的
    unsigned int count=20;                                                         
    unsigned int zhen = 60;                                                            //每帧时间,30ms或者60ms
    // Make colors
    CvScalar yellow = CV_RGB(255, 255, 0);
    CvScalar white = CV_RGB(255, 255, 255);
    CvScalar red = CV_RGB(255, 0, 0);
    float k[] = { 0.25, 0.25, 0.25, 0.25};                                          //模糊核
    CvMat km = cvMat(4, 1, CV_32FC1, k);                        
    while (1){
      cvZero(img);
      cvCircle(img,
            cvPoint(img->width/2,
            zhen*0.1*count),
            4, yellow,-1);
      //cvFilter2D(img,img,;
      cvFilter2D(img, img2, &km, cvPoint(0,-1));                     //和模糊核卷积
      cvShowImage("show", img2);                                       
      count++;
      if (zhen*0.1 * count > img2->height)
            count = 0;
    //    cvWriteFrame(video, img2);                                    //录视频用的,一拍二就两遍,否则就一遍
    //    cvWriteFrame(video, img2);
      // Exit on esc key
      if (cvWaitKey(zhen) == 27)                                     //等待合适的时间
            break;
    }
      cvWaitKey(0);
      cvReleaseVideoWriter(&video);
    cvReleaseImage(&img);/*释放图像*/
    cvReleaseImage(&img2);
    cvDestroyAllWindows();/*释放所有窗口*/
}


结论:看起来卡的主要原因还是低帧数,加入运动模糊之后有一点效果但是也还是远远不够

tenco 发表于 2016-8-22 18:42

我的说法更严谨一些

http://zhihu.com/question/49676189/answer/118253023
同帧数的3D游戏比电影卡唯一的原因就是没有动态模糊。


因为按照资深玩家的标准,24帧的电影其实也是很卡的,只不过是同样是24帧时,电影比游戏流畅。

如果单纯把低帧数游戏加上动态模糊效果,只是比原本的好一些,并不是不卡。

真的要达到流畅,至少60帧。

卡奥斯·克斯拉 发表于 2016-8-22 18:43

其实,可以把作画上添加的运动模糊作为一种心理暗示来看,使观众认为画面反应出来的为正常现象。

tenco 发表于 2016-8-22 18:48

本帖最后由 tenco 于 2016-8-22 18:55 编辑

另外你那个动态模糊的算法其实和现在的游戏一样,都是非常简化的过程。

你并不是像摄像机那样用实际的运动过程生成一帧,单纯只是用同一帧按照运动方向模糊造成的,
而且你这个算法和摄影原理完全不一样啊,摄影那个模糊并不是前后是虚的中间是实的,而是球的整个轨迹都一样虚,要不再改改?


这是电影CG里的动态模糊效果
http://ww1.sinaimg.cn/mw690/6f31956bjw1f72q0x1gfqj20zk0k0aar.jpg

周刊麻将Sunday 发表于 2016-8-22 18:53

本帖最后由 周刊麻将Sunday 于 2016-8-22 18:55 编辑

tenco 发表于 2016-8-22 18:48
另外你那个动态模糊的算法其实和现在的游戏一样,都是非常简化的过程。

你并不是像摄像机那样用实际的运动 ...
垂直匀速运动,而且离摄像机距离相同,积分核就是这个,完全没问题,这是个数学问题,拿这个核去反卷积实际的照片是相当有效的。
动画软件更复杂只能是因为速度和方向都不一定。
不过我就是感觉非常奇怪,之前知乎的问题最高片答案说的的确看起来很有道理,结果实际运算才发现效果这么差……

周刊麻将Sunday 发表于 2016-8-22 18:58

本帖最后由 周刊麻将Sunday 于 2016-8-22 18:59 编辑

tenco 发表于 2016-8-22 18:48
另外你那个动态模糊的算法其实和现在的游戏一样,都是非常简化的过程。

你并不是像摄像机那样用实际的运动 ...
和速度有关,速度越大就越这个样,这小破球速度慢,调更高效果更差,还不如现在呢……

tenco 发表于 2016-8-22 19:03

周刊麻将Sunday 发表于 2016-8-22 18:53
垂直匀速运动,而且离摄像机距离相同,积分核就是这个,完全没问题,这是个数学问题,拿这个核去反卷积实 ...
你按照我给你的样图试一下

我解释一下摄影的原理,在你曝光过程中,物体经过的画面,各部分都应该是一样的,不应该是前后虚化。
另外如果物体运动后遮盖住了之前已经被拍摄的物体,亮度高的遮盖亮度低的。

可以看这张照片阴影里的星光部分。
http://ww4.sinaimg.cn/mw690/6f31956bgw1ehv8wusdezj20ne0v6tln.jpg

这张照片其实就很像你做的那个效果,然而是错误的,这张照片之所以前后虚化,是因为曝光过程中曝光条件变化了,手办的图像是实的是因为最后追加了灯光,她背后的影子才是真正的原始曝光效果。

kuglv 发表于 2016-8-22 19:16

游戏要60帧才流畅是逼乎的人告诉你的还是你脑补的

----发送自 samsung SM-G9200,Android 6.0.1

tenco 发表于 2016-8-22 19:20

本帖最后由 tenco 于 2016-8-22 19:22 编辑

kuglv 发表于 2016-8-22 19:16
游戏要60帧才流畅是逼乎的人告诉你的还是你脑补的

----发送自 samsung SM-G9200,Android 6.0.1 ...
不,仅仅是游戏界从1993年开始流传到现在的一个谣言罢了,就和参数越高的显卡就越好一样,都是大家盲信的谣言而已。

觉得流畅不流畅其实和你个人的生理特性以及游戏水平有很大的关系。

我觉得30帧就够了,但是在游戏论坛每次都被人骂狗眼,认识的人有60都能看出卡的。

我个人有个猜测,就是你的眼睛视力越差,对帧数就越不敏感。

tenco 发表于 2016-8-22 19:20

kuglv 发表于 2016-8-22 19:16
游戏要60帧才流畅是逼乎的人告诉你的还是你脑补的

----发送自 samsung SM-G9200,Android 6.0.1 ...

彼得杰克逊他们认为48帧就够流畅了。

20160531 发表于 2016-8-22 19:22

周刊麻将Sunday 发表于 2016-8-22 19:24

tenco 发表于 2016-8-22 19:03
你按照我给你的样图试一下

我解释一下摄影的原理,在你曝光过程中,物体经过的画面,各部分都应该是一样 ...
我不知道书记你是跑了一遍程序还是看这黄球看的…………看黄球肯定看不出来什么,lena是这样的(尺度10)http://ww1.sinaimg.cn/mw690/dea8c181jw1f72qt0rdakj211s0lc0yg.jpg
至于算法,随便百度一篇论文吧……http://www.docin.com/p-1072452233.html
http://wenku.baidu.com/link?url= ... KZK2AYRDwHqD-YMjveu

tenco 发表于 2016-8-22 19:35

周刊麻将Sunday 发表于 2016-8-22 19:24
我不知道书记你是跑了一遍程序还是看这黄球看的…………看黄球肯定看不出来什么,lena是这样的(尺度10)
...

那奇怪了

按理说如果是照片处理用的算法,应该是可以用的啊

不过也不影响这个贴的结论,运动模糊还是有改善的嘛,只要证明电影比游戏强就可以了。

oz01 发表于 2016-8-22 19:46

你把两个离散时间点怎么折腾,信息也不会是连续的
镜头捕捉到的是两个时间点内连续的信息

kuglv 发表于 2016-8-22 19:50

引用第8楼tenco于2016-08-22 19:20发表的:
本帖最后由 tenco 于 2016-8-22 19:22 编辑 引用:kuglv 发表于 2016......

喷了,又是你脑补出来的所谓大家盲信的谣言
你在游戏区被喷狗眼是因为你硬要说30帧和60帧没区别,而不是30帧流畅,如果30帧都不算流畅那大多主机游戏都可以扔垃圾桶了
大多数人的30帧和60帧之争都是在争这两者是不是看得出区别而不是这两者哪个流畅,不要偷换概念,何况感官上是不是流畅还要看画面大小和帧生成时间,单纯30帧和60帧不是不流畅和流畅的区别,而是流畅和更流畅的区别

----发送自 samsung SM-G9200,Android 6.0.1

后入芙蓉王 发表于 2016-8-22 19:52

所谓的60帧不卡是“60帧均匀分布所以不卡”
要是60帧里有一帧生成时间过长,你会明显感觉到卡的

30帧就更不用说了,觉得30帧不卡的可以去弄个热情传说,然后对比一下打了60帧MOD和原版30帧的差别

周刊麻将Sunday 发表于 2016-8-22 21:19

oz01 发表于 2016-8-22 19:46
你把两个离散时间点怎么折腾,信息也不会是连续的
镜头捕捉到的是两个时间点内连续的信息 ...

那肯定的,但是照理说人眼有视觉暂留,30帧的东西和15帧的差距竟然这么打好奇怪啊,而且加入运动模糊之后也没见改善……

华蝶风雪 发表于 2016-8-22 22:56

“视觉暂留”是很重要的,我来做一个例子
>视频链接<
上方30,下方60

xzhlj0325 发表于 2016-8-22 23:05

mhx锁30帧,mh4g、3g都是60帧,跑步和切视角时能感觉到不同,60帧会有现实中感觉不到的流畅感

ArtoriaPendrago 发表于 2016-8-22 23:26

结夜野棠 发表于 2016-8-22 23:34

deadbeef 发表于 2016-8-22 23:35

本帖最后由 deadbeef 于 2016-8-22 23:42 编辑

我一直觉得游戏比动画/电影卡 是源于互动性体验
因为游戏过程是一个观察->分析->操作的处理反射弧
所以帧数低的情况会出现一些期待结果与实际观察结果不符合的冲突情况
因此在视野比较深的主视角游戏里更明显
而在电影/动画/播片的情况下 人脑其实并不怎么主动去预测画面动作

至于说动态模糊 可能确实是视觉上卡顿的重要原因
但是应该不是主观上觉得卡顿的主要原因
因为就我晕3D的经验来说 如果说一个游戏的视野和帧数让我晕 那么开了动态模糊只能让我更晕

周刊麻将Sunday 发表于 2016-8-22 23:37

华蝶风雪 发表于 2016-8-22 22:56
“视觉暂留”是很重要的,我来做一个例子
>视频链接<
上方30,下方60
我觉得你这是模糊加大了吧………………按速度加运动模糊不会这样的

雪城穗乃香 发表于 2016-8-23 00:03

真不知道流畅度这种直观的体验怎么这么多人在战

买个144hz的显示屏呗,就在桌面,从60开始一直切换到144试过来,光是划动鼠标的体验都不一样。
别用你的60hz的显示屏以为关了垂直同步就能体验到高帧数了,没用的,这种显示器无法正确表现60hz以上的画面。

----发送自 HUAWEI PLK-UL00,Android 6.0

ashunicorn 发表于 2016-8-23 00:06

ArtoriaPendrago 发表于 2016-8-22 23:26
我还以为是B站某个视频的延续。
http://www.bilibili.com/video/av5824251/

哈哈哈里头还看到了书记的回答

华蝶风雪 发表于 2016-8-23 00:47

周刊麻将Sunday 发表于 2016-8-22 23:37
我觉得你这是模糊加大了吧………………按速度加运动模糊不会这样的

想了下,运动速度相同的清晰影像和模糊影像以相同的帧速呈现出来的话,流畅度应该是一致的
模糊改变不了什么,除非持续时间很短

macos 发表于 2016-8-23 02:24

电风扇 发表于 2016-8-23 08:42

周刊麻将Sunday 发表于 2016-8-22 21:19
那肯定的,但是照理说人眼有视觉暂留,30帧的东西和15帧的差距竟然这么打好奇怪啊,而且加入运动模糊之后 ...

因为3D游戏中的物体并不是真的在运动,而是每1/30秒依次显示一幅静止图像。这也许是视觉残留没能帮忙脑补得更流畅的原因




我什么都不懂我猜的

暗黑の命运 发表于 2016-9-3 10:52

本帖最后由 暗黑の命运 于 2016-9-3 10:54 编辑

我来说一下这个问题吧

首先,电影里所谓的"运动模糊"和现在你找个赛车游戏画面效果设置里的"运动模糊"不是一回事,电影影片的每秒24帧和游戏的每秒30帧/60帧是不一样的。电影里的一帧,图像里是这1/24秒内所有的运动的累计;而游戏里的每帧画面都是静止不动的,这个是由电影和游戏的软硬件性质决定的,所以电影24帧就够了,游戏一直到60帧都能感觉到不同


再说关于游戏里的“运动模糊”,90年代的游戏确实没有运动模糊,但是你找个FC模拟器下个松鼠大战,一样流畅的1B(动画帧数不足,但是操作感流畅),反过来你玩一下FC双截龙就不流畅。所谓的运动模糊是一个画面效果,是将当前帧的效果和之前帧的效果做融合,在你摄像机产生位移后,每个像素参考之前几帧的3D空间位置,最后做一个几帧平均的显示效果,简单说就是你能在某个像素上看到之前几帧像素的加和。用来表现赛车游戏高速运动时的快感。这个和顶楼说的电影的那个运动模糊是不一样的,这个效果一直开启的话会看吐血。想达到电影的那个效果,首先你游戏要以超过60FPS运行(例如90),然后把每帧图像叠加到30FPS上进行渲染,这样是完全得不偿失的,所以游戏不会使用这种方式处理


最后关于30FPS和60的区别,我在游戏区的帖子里也写了。30和60最大的区别来自操作响应的延迟(包括推遥杆移动,转镜头,按键放技能等),这个是一下就能感受到的,画面上的区别影响没这么大,所以RPG一般都追求30FPS,动作游戏为了更好的手感都会追求60FPS。作为游戏开发人员,20-60每10帧的差别都是能感受出来的

ASDJKL 发表于 2016-9-3 14:11

奥古斯都 发表于 2016-9-3 14:30

页: [1]
查看完整版本: 【非战】运动模糊和帧数