网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
07月27日漏签0天
gpu吧 关注:7,538贴子:81,470
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 1 2 下一页 尾页
  • 27回复贴,共2页
  • ,跳到 页  
<<返回gpu吧
>0< 加载中...

转帖 主机游戏技术普及第一期

  • 只看楼主
  • 收藏

  • 回复
  • Nexus帰来
  • 知名人士
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
一楼喂度娘!


  • Nexus帰来
  • 知名人士
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
第二天 贴图(Texture Mapping)
我终于下了班。最近都在忙光照模型和动态光源呢,以后应该会讲到这一块。
今天要讲贴图了,这个词也是A9众常用的词,那么贴图到底是什么呢?
好,有了昨天的知识,我们就知道游戏里的物体究竟是什么了。比如说一个海豚,我们知道其实是长这样的:

但是,它没有皮肤呢。那怎么办呢?简单,蒙一张彩色的皮上去就可以了。
在游戏里面,这张皮,叫做纹理(Texture)。
我其实蛮讨厌这个译名的,它有点让人摸不着头脑。实际上它很简单,就是一张图片,跟常见的PNG、JPG图片没有本质区别。当然,具体的编码肯定不一样。
最常见的纹理是.dds文件,里面的编码是dxt1、dxt5等等,格式非常多,每一个都有特别的用途。
顺便一提,ps4推荐的格式是BC7。当然这还是dds文件了。这个BC7编码很强,质量非常高,图像的损失很小。
其实啊,现代的显卡其实可以允许你直接用png和jpg图片的,那我们为什么不用这些简单的格式呢?
那是因为,dds文件是为显卡量身定做的,显卡处理它们最高效了!
你可以想象一张图片,上面画了海豚的皮肤,我们把这张图片蒙上这个线框模型(Wire-frame model)就可以了。
不过,游戏怎么知道该怎么蒙?什么方向?什么位置?
这就需要一种新的数据了,叫做UV数据(UV data)。每一个顶点(Vertex),都会有一个对应的UV。
那么,UV数据到底是什么?长什么样?
不得不说,这些概念一个比一个简单,阿猫阿狗都会把。UV就是很普通的二维坐标。之所以叫uv,是因为xy已经被用掉了,所以就改叫uv了。还有的游戏或者引擎叫它st,那都是一个东西。
举个栗子:顶点1,要对应到纹理的左下角,那uv数据就是(0, 0)。顶点2,要对应到纹理的最中间,那uv数据就是(0.5, 0.5)。每一个顶点,都指定一个坐标就可以了。
聪明的玩家肯定要问,这只是顶点而已啊!那顶点之间的线呢?线和线之间的空间呢?
这些就是显卡的工作了,显卡会自动做插值运算(Interpolation)。

简单来说,你告诉显卡顶点怎么处理就行了,其它的点显卡都会自动计算。这张皮就能正确的蒙到海豚上去。
当然,插值运算(Interpolation)有很多种实现方式,这个非常重要,我们以后再细讲。
把皮蒙上去的过程,我们叫做UV Mapping,或者texture mapping。我个人认为,我们常说的贴图,指的就是texture mapping。贴图应当是一个动作,而不是一个名词。
好了,现在你们已经会初步分析SS的机能了!
A9众:啥!?
我觉得是这样呢,明天我们就一起来实践看看吧。
最后,大家稍微复习一下:要完成贴图,需要哪几种数据呢?


2025-07-27 20:43:26
广告
不感兴趣
开通SVIP免广告
  • Nexus帰来
  • 知名人士
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
第三天 实战SS机能分析:显存(Video Memory)
今天,我们就来应用一下前两天所学的知识,实战分析世嘉土星(Sega Saturn)的3D机能。
(注意,这里说的不是2D机能。SS的2D机能非常强!Saturn is a 2D monster!)
世嘉当年的宣传是,SS每秒可以处理20万个有纹理的多边形,或者50万个多边形。那么,事实真的是如此吗?
山内一典说过:“GT5的精细高模车用了50万个多边形”。这样的话,岂不是SS也可以描绘出那种精细的车体了?

想必大家已经有了第一印象:这不科学!
首先一个不科学的地方是,我们不知道他们说的多边形是几边型,这个我在第一天里也提到了。单位不同,如何比较?
还有,这里的时间单位是每秒,这也是很有误导意义的。这个多边形数和场景复杂度是不同的。
好吧,那我们退一步,给SS1秒钟(30-60帧),它可以描绘出如此精细的物体吗?
我们想一想,处理50万个多边形,需要什么条件?
1. 显存可以装的下所需要的数据。(粮草)
2. 3D图像处理器有能力及时处理这些数据。(兵力)
3. 数据传输速度足够快,保证不拖图像处理器的后腿。(运输队)
要想打赢一场仗,粮草、运输队和兵力,缺一不可。
今天,我们先来看看SS有没有足够的粮草。
大家复习一下前几课的内容,游戏中的物体和场景是由哪些基本数据组成的?
顶点数据(Vertex Data)
索引数据(Index Data)
UV数据(UV Data)
纹理(Texture)
这里,我们需要记住一个重要的事实:以上数据,在游戏运行中,一定是在显存(Video Memory)里的。
什么是显存呢?显存就算显卡专用的存储器。在传统游戏主机里,显存和内存(cpu专用)是分开的。只有xbox 360,wii u,ps4和xbox one是特例。
我们把话题拉回来,这些数据分别需要占用多少空间呢?
顶点是三维坐标,索引是一个数字,uv是二维坐标。单算一个的话,它们分别占用12个字节,4个字节和8一个字节。(因为SS是32位机)
纹理这里,我们可以放点水,假设它用了超小的图吧,几乎不占空间。我就不统计了~(其实在现代的视频游戏里,这恰恰是数据量最大的部分。)
然后,它们的数量分别又是多少呢?
答案:索引大致是顶点的1-3倍(想想为什么?),uv一定是跟顶点一样多(想想为什么?)。
我们再放点水吧~假设索引跟顶点一样多。
如此计算的话,一个顶点要占用多少空间呢?
根据小学课本,这里应该使用加法!12+4+8=24(字节)
好,我们再来看看有多少容量来装这些数据。
其实SS的存储器非常多,也非常复杂。好在只有一块存储器是用作3D图像的,它的容量是512KB。
512KB可以存储多少顶点呢?
根据小学课本,这里应该使用除法!512 X 1024 / 24 约等于 2.2万。
那么,2.2万个顶点可以组成多少三角形呢?
我们第三次放水,就当是2万吧。实机可能1万都不到。
下一个问题,我们不知道他们说的多边形是几边型,姑且就放水算作四边形吧。
这样,多边形的量最多是1万。
我们不排除SS使用了很先进的压缩算法。但是,再压也不会有数量级的飞跃,满打满算不会超过10万的。
所以我们得到了结论:即便放水无数次,SS游戏的场景复杂度绝对不是十万级别的。
我个人估计,如果屏幕上有一万的三角形,就已经很不错了。多数游戏应该只有几千吧。
以下是世嘉的第一方大作Virtua Fighter 2,算是SS上3D画面相当好的游戏了。

好了,明天我们再来看一看SS的兵力和运输队吧。大家明天见!


  • Nexus帰来
  • 知名人士
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
第八天 屏幕撕裂(Screen Tearing)、垂直同步(V Sync)和双重缓冲(Double buffering)
既然昨天讲到帧缓冲(Framebuffer)了,不如我们就趁热打铁,讲一些相关的概念。
大家肯定经常看到垂直同步这个概念吧?PC游戏中也经常看到这个选项。
我们也都知道,开启垂直同步之后,游戏画面就不会撕裂了,但是游戏的帧数会降低不少。这又是什么原理呢?
首先,我们需要了解屏幕撕裂是怎么发生的。
为了让大家看的更清楚,我特意选了这张很明显的图。这张图也许是后期合成的,但是对于我们讲解概念非常方便。
(原地址图挂了  ̄□ ̄||)
在游戏主机中,除了用帧缓冲(Framebuffer)来存储屏幕上的像素之外,通常还会有一到两个后端缓冲(Back buffer)。
大家想啊,如果只有帧缓冲的话,如果显卡在上面绘制的时候,屏幕在一边不断的刷新(通常是每秒60次),岂不是会出现不断闪烁的情况?所以,所有的游戏主机都是有后端缓冲的。
有了后端缓冲,就可以完全避免屏幕闪烁了。显卡只在后端缓冲上绘制图像,等到屏幕刷新的时候,我们把后端缓冲跟帧缓冲交换(或者复制),这样就可以显示新图像了。
如果后端缓冲画到一半的时候,屏幕刷新了,会发生什么呢?
屏幕上一半是新图像、一半是旧图像,这就是所谓的屏幕撕裂(Screen tearing)了。
现在,大家思考一下:为什么早期的游戏,这种情况就很少见呢?
因为老游戏分辨率很低。像素的数量越少,就越不容易出现来不及绘制的情况。
接下来,有没有方法来避免屏幕撕裂呢?这时候,我们的垂直同步就登场啦~
垂直同步的工作原理,是建立在电视机和显卡的通讯之上的。当电视机完成了整个屏幕的绘制时,会通知显卡。(比如,显像管电视会有刷新率的概念,最新的数字接口HDMI有VBLANK的概念。它们都是用来通知显卡的。)
显卡在收到电视机的通知之前,不会进行下一帧的绘制。这个技术,就是所谓的垂直同步(Vertical Synchronization)了。
细心的玩家肯定会问了:明明是整个屏幕,为什么叫垂直同步?
其实,这都是在沿用以前模拟电视的概念。
以前的电视都是有扫描线的。一个扫描线就是一个水平的行。(以前描述分辨率都是240线、480线等等。)
相反的,垂直、自然就包含了全部的扫描线。垂直同步就是等待整个画面了。
这里我不得不提一下水平同步(Horizontal Synchronization)。它的字面意思是,等待一行绘制完的意思。但是在游戏主机中,水平同步通常就是不开启垂直同步。它往往不会做任何同步,而是尽快的让后端缓冲交换(或者复制到前端)。
以上就是游戏主机的特别之处了,跟传统显像管电视、或者pc游戏的情形都不同。毕竟针对游戏这种特别的任务,水平同步本身是没有意义的。
所以,大家可以直接理解为:水平同步就是没有同步,垂直同步就是防止图像撕裂。
像这样的两个帧缓冲的配置,叫做双重缓冲(Double buffering)。
学有余力的玩家,可以参考这篇:
http://en.wikipedia.org/wiki/Vertical_blanking_interval
最后,给大家留一个思考题:为什么在主机游戏中(战争机器3、GT5等等),屏幕撕裂通常发生在屏幕的上方呢?
好,今天的内容就到这里了。明天我们来看一看,为什么真三国无双6的帧数是在30帧和60帧之间切换呢?
大家明天见!
再来一张图:
(原地址图还是挂了=_=|||)


  • Nexus帰来
  • 知名人士
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
卧槽怎么又说不和谐...


  • 还是那个小新
  • 人气楷模
    13
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

A9新闻区的帖子吧,倒是看过,不过没看完。感觉发错地方了,应该发到opengpu去


  • Nexus帰来
  • 知名人士
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
第八天 屏幕撕裂(Screen Tearing)、垂直同步(V Sync)和双重缓冲(Double buffering)
既然昨天讲到帧缓冲(Framebuffer)了,不如我们就趁热打铁,讲一些相关的概念。
大家肯定经常看到垂直同步这个概念吧?PC游戏中也经常看到这个选项。
我们也都知道,开启垂直同步之后,游戏画面就不会撕裂了,但是游戏的帧数会降低不少。这又是什么原理呢?
首先,我们需要了解屏幕撕裂是怎么发生的。


  • Nexus帰来
  • 知名人士
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
为了让大家看的更清楚,我特意选了这张很明显的图。这张图也许是后期合成的,但是对于我们讲解概念非常方便。
(原地址图挂了...)
在游戏主机中,除了用帧缓冲(Framebuffer)来存储屏幕上的像素之外,通常还会有一到两个后端缓冲(Back buffer)。
大家想啊,如果只有帧缓冲的话,如果显卡在上面绘制的时候,屏幕在一边不断的刷新(通常是每秒60次),岂不是会出现不断闪烁的情况?所以,所有的游戏主机都是有后端缓冲的。
有了后端缓冲,就可以完全避免屏幕闪烁了。显卡只在后端缓冲上绘制图像,等到屏幕刷新的时候,我们把后端缓冲跟帧缓冲交换(或者复制),这样就可以显示新图像了。


2025-07-27 20:37:26
广告
不感兴趣
开通SVIP免广告
  • Nexus帰来
  • 知名人士
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
如果后端缓冲画到一半的时候,屏幕刷新了,会发生什么呢?
屏幕上一半是新图像、一半是旧图像,这就是所谓的屏幕撕裂(Screen tearing)了。
现在,大家思考一下:为什么早期的游戏,这种情况就很少见呢?
因为老游戏分辨率很低。像素的数量越少,就越不容易出现来不及绘制的情况。
接下来,有没有方法来避免屏幕撕裂呢?这时候,我们的垂直同步就登场啦~
垂直同步的工作原理,是建立在电视机和显卡的通讯之上的。当电视机完成了整个屏幕的绘制时,会通知显卡。(比如,显像管电视会有刷新率的概念,最新的数字接口HDMI有VBLANK的概念。它们都是用来通知显卡的。)
显卡在收到电视机的通知之前,不会进行下一帧的绘制。这个技术,就是所谓的垂直同步(Vertical Synchronization)了。


  • Nexus帰来
  • 知名人士
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
细心的玩家肯定会问了:明明是整个屏幕,为什么叫垂直同步?
其实,这都是在沿用以前模拟电视的概念。
以前的电视都是有扫描线的。一个扫描线就是一个水平的行。(以前描述分辨率都是240线、480线等等。)
相反的,垂直、自然就包含了全部的扫描线。垂直同步就是等待整个画面了。
这里我不得不提一下水平同步(Horizontal Synchronization)。它的字面意思是,等待一行绘制完的意思。但是在游戏主机中,水平同步通常就是不开启垂直同步。它往往不会做任何同步,而是尽快的让后端缓冲交换(或者复制到前端)。
以上就是游戏主机的特别之处了,跟传统显像管电视、或者pc游戏的情形都不同。毕竟针对游戏这种特别的任务,水平同步本身是没有意义的。
所以,大家可以直接理解为:水平同步就是没有同步,垂直同步就是防止图像撕裂。


  • Nexus帰来
  • 知名人士
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
像这样的两个帧缓冲的配置,叫做双重缓冲(DouВLe buffering)。
最后,给大家留一个思考吅题:为什么在主机游戏中(战争机器3、GT5等等),屏幕撕吅裂通常发生在屏幕的上方呢?
好,今天的内容就到这里了。明天我们来看一看,为什么真三囯无双6的帧数是在30帧和60帧之间切换呢?
大家明天见!


  • Nexus帰来
  • 知名人士
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
第九天 三重缓冲(Triple Buffering)
第九天 三重缓冲(Triple Buffering)
我们先来看下真三国无双这个例子。
玩过的同学都知道,这个游戏的帧数非常不稳定。经过测算,356并不是普通的掉帧,而是在60帧和30帧之间切换。
基于以上的时候,我们就可以下结论了:356使用了垂直同步 + 双重缓冲,而且游戏的瓶颈是GPU。
很多玩家要说了:游戏是你做的啊?你是怎么知道的?你太嚣张了!
我当然是有根据的。我们先来看一下,双重缓冲下的垂直同步,如果游戏的帧数稍微低了一些会发生什么。
昨天我们昨天所学的内容,开启了垂直同步,后端缓冲就只能在HDMI信号的VBLANK期间跟前端缓冲交换(或者复制)了。HDMI信号的VBLANK是每秒60次,所以是60Hz。
假设我们面前只有两三个小兵,那游戏跑起来就绰绰有余了,GPU每秒处理100帧都是可能的。不过,356开启了垂直同步,游戏会等待VBLANK信号,所以帧数会稳定在每秒60帧。
这时候,有一个有脸的武将带领一大队小兵突然出现在视野里,游戏处理起来就吃力了。这时候,GPU每秒只能处理50帧了。游戏的帧数会是多少呢?
答案是30帧, 而不是50帧。
为什么呢?因为GPU错过了第一个VBLANK信号,就会等到第二个信号才会更新。所以帧数会变成30。
假如GPU的负荷又增大了,那会怎样呢?
帧数会变成20、15、12、10,60/N,以此类推。
我们再来思考一下,如果是CPU算不过来,每秒只能算50帧,那实际的帧数是多少呢?
答案是,50-30帧之间都有可能。
根据上面所学的知识,我们可以确定:356使用了垂直同步 + 双重缓冲,而且游戏的瓶颈是GPU。
现在我们都知道,在GPU是瓶颈的情况下,双重缓冲不是一个好东西了。
于是,一个叫做三重缓冲(Triple Buffering)的技术隆重登场~当当当当~
有了第二个后端缓冲,显卡就不用等待VBLANK信号了,直接在另一个缓冲上绘制就可以了。
当VBLANK信号到达的时候,一定会有一个后端缓冲是完成的状态,那么直接就显示那个就行了。
即便GPU不能在60Hz下更新,帧数也不会直接降到30了。
到了这里,帧缓冲相关的内容就结束了。
顺便提一下,SS和PS都有垂直同步的能力,但是因为存储器的容量有限,三重缓冲并不现实。所以,那个时期的游戏可以正常跳帧的并不多。
明天我们就来讲一讲PS1的光照了,大家明天见!


  • Nexus帰来
  • 知名人士
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
不过,需要注意的是,游戏中的法线数据是跟顶点对应的。每一个顶点对应一个法线数据。
这个法线数据的值,是它周围所有三角形法线数据的平均值。
有了所有顶点的法线数据,显卡就可以计算出任意一个像素所属三角形的方向了。就像我们以前说过的,这也是插值运算(Interpolation),是属于显卡的工作。
有了法线数据,显卡就可以做最简单的光照效果了。
我们来想象一下最简单的一个平面,当光线的方向和法线的方向完全一致是,光线是垂直射入的。这时候平面最亮了。
当光线的方向慢慢变化,它跟法线的夹角越大,平面能接受的光线就越少,就会越来越暗。


  • Nexus帰来
  • 知名人士
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
当光线和这个平面完全平行时,就接受不到任何光照了。
再转下去,平面就会背对光线,还是没有任何光照。
合金装备1里面人物的光照就是基于这么简单的原理。


2025-07-27 20:31:26
广告
不感兴趣
开通SVIP免广告
  • Nexus帰来
  • 知名人士
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
具体的计算方法,就是简单的向量的点乘。把法线向量和光线向量乘起来,再乘以光源本身的强度,就得到了能接受光照的量了。
当光照的量最大时,这个像素的颜色就是纹理本身的颜色。
当光照的量是0时,这个像素的颜色就是黑色。
任何的中间情况都是可能的。
细心的玩家肯定要问:光源的颜色不同怎么办?如果有好几个光源怎么办?
当光源不是纯白色的时候,我们再乘以光源的RGB值就是最终的像素值了。
多个光源就是把RGB值加起来。
这些就都是很细节的内容。
今天我们说的这种最最基础的光照叫方向光照(Directional Lighting),因为光照的强度只跟光线的方向有关。以后我们会逐渐提到更复杂的光照技术。
最后,我们来复习一下,光照需要哪一种数据?


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 下一页 尾页
  • 27回复贴,共2页
  • ,跳到 页  
<<返回gpu吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示