- 主题:外行问一个关于openGL和计算机图形学的一个的问题
我粗浅的理解:
游戏里的视频贴图——是指的在CS地图里,贴一个图,比如lena的头像吗?
那是图(像)。就是一个矩阵,逐像素拷贝到显存里,OpenGL有一套接口,计算缩放与投影等,将矩阵里的每一个像素投影到目标面(成像面,比如台阶面或曲面)。
三角面片化,是图(形)。图形是参数化的,用图形api生成,比如loft或者sweep,或者大量点组成的三角网格mesh,这是一套数据结构。生成后要交给显卡渲染,要再转换成另一套数据结构,就是三角面片化(Tessellation),变成一系列顶点,OpenGL只认这个,渲染填充。
总结下,你看到的视频(帧),是逐像素点拉伸、变换渲染的,没有三角面片化。
你关心的三角面片与连续光滑的视频帧,没有关系。
请懂的大神纠正我。谢谢。
【 在 seeeU 的大作中提到: 】
: 看了点openGL的文档,发现这个问题:
: 似乎四边形和多边形最后都是被GPU拆为三角形处理显示的
: 那么实际上GPU是无法真正知道三个以上的点是否真正的共面吧?
: ...................
--
修改:DoorWay FROM 61.185.195.*
FROM 61.185.195.*
先共识场景,你说的“ 游戏里的视频贴图”,到底是啥,
是游戏里的人物角色,还是游戏场景物体,比如房屋的墙,汽车的轮子……
视频是游戏的一部分,还是魔改的,比如在CS地图的墙上贴张你自己的照片,
继而在墙上播放连续变化的图片(一个视频),你叫它“视频贴图”?
【 在 seeeU 的大作中提到: 】
: 谢谢,您说的这句:“总结下,你看到的视频(帧),是逐像素点拉伸、变换渲染的,没有三角面片化。你关心的三角面片与连续光滑的视频帧,没有关系。”
: 我这样理解是否可以:视频帧不是以贴图的方式映射到Quad或者多边形上去的,所以该视频所覆盖的多边形的n个点或面是什么形状或者是否共面没关系,视频是通过坐标变换或者类似帧缓冲之类的手段变换到一个viewport视口上的,只不过视频的长方形四条边(或四个顶点)和其所覆盖的四边形的四条边(或四个顶点)在屏幕上的坐标是重合的,所以看上去视频好像是像贴图被贴上去了一样?
:
--
FROM 124.114.151.*
如果播放的是游戏人物,那跟玩家操控的人物模型一样,是用三位建模软件,手工建立出来的,想象下衣服店里脱掉衣服的模特。
这种模型的数据结构就是大量的三角面片,每个三角面片就是三个顶点,如何把三角面片的表示的人脸显示的光滑,减小三角面片增加分辨率,OpenGL的渲染模式,Smooth是怎么解决光滑的我还不知。
人物的不同动作,连续编辑成路径,就是动画。
表示模型的坐标都是三维的。现在考虑一个问题,显示器是二维的,如何表现三维的运动员?透视,远小近大。要有一套换算,把模型此刻的顶点左标,换算到屏幕1024x768的格子上。
你按下旋转键,视角变了,屏幕(投影面)变了,哪怕人物没动,顶点的坐标没变,刚才的变换也得再算一遍。让你看上去是三维,视角变了。
想通这个,你的显示器屏幕,和游戏场景里的屏幕,就没有区别。游戏里更简单,固定视角。
游戏人物的模型是资源文件,每一时刻的位置动作(编号)都可以用数字存储,
这样就能实现历史回放。比如dota的比赛录像回放。
光秃秃的模型要有肤色、头发、胡子、球衣,可以是提前绘制的模型,也可以是渲染时计算的。
如果游戏里的屏幕,播放真实的NBA比赛,比赛视频已经有了,比如mp4格式。
逐帧读出来,一个内存块,交给OpenGL,计算好目标位置,源的大小、目标屏幕的大小,进行逐像素投影、缩放、绘制。没有三角面片。
我也是粗浅的理解。请大神补充纠正。
【 在 seeeU 的大作中提到: 】
: 就是普通视频,比如NBA游戏的场馆里的大屏幕播放了刚才勒布朗詹姆斯扣篮的回放或者本场精彩镜头集锦,或者NBA本季的宣传片,游戏里经常出现这种
:
--
FROM 1.86.63.*
先区分:验证共面是图形问题,在console程序里也能做;与渲染(OpenGL接口 +显卡)显示是两回事。
验证四个点共面,简单的方法就是,分为两组:abc;bcd.
点构造向量,向量叉乘,是法向量。两个(法)向量判断平行,看叉积是否为0。
cross1 = [ab] x [bc]
cross2 = [bc] x [cd]
c = cross1 x cross2
【 在 seeeU 的大作中提到: 】
: 谢谢,那该如何判断几个点是否共面呢?GPU里做不了这个,在CPU里做?如何做呢?用任意三个向量的行列式=0来验证其共面?
:
--
FROM 124.114.151.*
1 是,用阈值。根据模型精度定的阈值,数值精度一般用很多位;模型精度10分之1毫米。
2 数学真正的共面就用数学的方法解出来。程序的精度就是小于阈值,就真正的共面。
3 程序就把4个点视为共面了,然后给他们组成的“四边形”明明一个名称来标记这个面,那么这个面的法向量怎么取?—— 这里指的是哪个程序?程序没有这么傻,如果有也是程序员傻(笑)。一般图形程序定义一个面,就是选一个点和一个法向就行了。叫它CPlane。内部计算时,就是平面公式,Ax + By +Cz =d。判断多点共面,取三点构造CPlane,判断其他点到平面的距离就可以。
4 有了平面,定义四边形,要在CPlane上取四点。
5 有了四边形,才渲染四边形。OpenGL可以直接渲染四边形。否则就拆成两个三角形。否则就拆成四个顶点。这里注意不是渲染四边形,让它看起来平。而是先有四边形,才渲染。
6 要考虑的,是四边形显示在屏幕上,要将顶点投影到显示器屏幕上(OpenGL叫摄像机和投影面)。当你转到侧面,四边形在屏幕上变成一条线。显然四个顶点投影后重合了。
7 “使其看起来像一个面”,就是使四边形看起来像一个面。是伪问题。正面的时候,就是填充顶点间的区域。在800x600的屏幕上,大家都关心的是顶点间连线有无锯齿。不会关心平面是不是平(笑)。
我也是粗浅的理解。请大神补充纠正。
【 在 seeeU 的大作中提到: 】
: 谢谢
: 但是存储的位置坐标都是浮点值,实际在程序里算出来两个向量都是float格式,数值是近似出来的,可能在数学上不一定完全平行吧?可能会差一点点。会有这种情况吗?这时候如何处理呢,只要是二者叉积结果小于一定的阈值就判定是平行的?前面 @sjtuDNA 也这样说过。
: 那么问题又来了:如果是要通过一个小的阈值来判断的话,那程序实际是无法区分两个三角形是真正完全共面的,还是说二者间有一个非常非常小的角度,因为两种情况下都会使得两个法向量的叉乘结果小于这个很小的阈值。那么是否能说实际工程角度而言,其实是无法真正判断数学上的共面是否确实为真(除非这n个点的x、y、z三分量中的某一个分量数值完全相等)。
: ...................
--
修改:DoorWay FROM 1.86.63.*
FROM 1.86.63.*