- 主题:外行问一个关于openGL和计算机图形学的一个的问题
看了点openGL的文档,发现这个问题:
似乎四边形和多边形最后都是被GPU拆为三角形处理显示的
那么实际上GPU是无法真正知道三个以上的点是否真正的共面吧?
如下说法是否正确?
比如说有四个点的三维坐标,GPU如果想验证四个点是否共面,就要增加验证步骤消耗细算资源,而且计算机储存的坐标数据类型(比如为float)精度有限,也会很难真正验证成功。所以计算机就舍弃这个验证共面的步骤,一律把这四个点作为两个三角形来显示,不管其是否真的是一个四点共面的四边形
如果显卡显示出来的都是一个个三角形,那么游戏里的视频贴图是怎么实现的呢?视频都是长方形的,是怎么贴合到显存里组成一个长方形的两个三角形上的呢?
--
FROM 175.190.123.*
谢谢,那该如何判断几个点是否共面呢?GPU里做不了这个,在CPU里做?如何做呢?用任意三个向量的行列式=0来验证其共面?
【 在 lvsoft 的大作中提到: 】
: GPU是只基于三角形处理,其他形状都是三角形拼接而成。
: GPU不需要知道三点以上是否共面,共面不共面对渲染没任何影响。
:
--
FROM 175.190.123.*
谢谢
“用户渲染矩形的时候需要保证送进去的顶点位置正确”,如果我送进去的几个顶点不是共面的?opengl或者GPU也会把这个所谓的Quad四边形或者polygon多边形拆分为一个个三角形渲染出来吗?
【 在 dilemma 的大作中提到: 】
: gpu在渲染三角形的时候不会关心三角形之间的关系
:
: 如果刚接触3d,推荐看
: ...................
--
FROM 175.190.123.*
谢谢
那程序中该如何判断n个点(n>3)是否是共面的呢?GPU编程实现不了的话,是不是得在CPU程序中判断这n个点的坐标?比如对任意三个向量做混合积,看行列式是否为0?
还有如果n个点的“多边形”不共面?送到GPU里,还是会显示出来吧?只不过是被拆成一个个三角形,还是不共面也会按照实际坐标把这个所谓的“多边形”显示出来?
【 在 sjtuDNA 的大作中提到: 】
: 看了点openGL的文档,发现这个问题:
: 似乎四边形和多边形最后都是被GPU拆为三角形处理显示的
: 那么实际上GPU是无法真正知道三个以上的点是否真正的共面吧?
: ...................
--
FROM 175.190.123.*
谢谢,您说的这句:“总结下,你看到的视频(帧),是逐像素点拉伸、变换渲染的,没有三角面片化。你关心的三角面片与连续光滑的视频帧,没有关系。”
我这样理解是否可以:视频帧不是以贴图的方式映射到Quad或者多边形上去的,所以该视频所覆盖的多边形的n个点或面是什么形状或者是否共面没关系,视频是通过坐标变换或者类似帧缓冲之类的手段变换到一个viewport视口上的,只不过视频的长方形四条边(或四个顶点)和其所覆盖的四边形的四条边(或四个顶点)在屏幕上的坐标是重合的,所以看上去视频好像是像贴图被贴上去了一样?
【 在 DoorWay 的大作中提到: 】
: 我粗浅的理解:
: 游戏里的视频贴图——是指的在CS地图里,贴一个图,比如lena的头像吗?
: 那是图(像)。就是一个矩阵,逐像素拷贝到显存里,OpenGL有一套接口,计算缩放与投影等,将矩阵里的每一个像素投影到目标面(成像面,比如台阶面或曲面)。
: ...................
--
FROM 175.190.123.*
就是普通视频,比如NBA游戏的场馆里的大屏幕播放了刚才勒布朗詹姆斯扣篮的回放或者本场精彩镜头集锦,或者NBA本季的宣传片,游戏里经常出现这种
【 在 DoorWay 的大作中提到: 】
: 先共识场景,你说的“ 游戏里的视频贴图”,到底是啥,
: 是游戏里的人物角色,还是游戏场景物体,比如房屋的墙,汽车的轮子……
: 视频是游戏的一部分,还是魔改的,比如在CS地图的墙上贴张你自己的照片,
: ...................
--
FROM 175.190.123.*
就是说程序上如果要实际上判断n点共面,最后也是要设定一个近似的阈值吗?
在blender和3dmax里是可以创造同一个平面上的多边形的吧?它们是怎么处理的呢?
还有obj文件格式里,定义一个面的时候需要包括其顶点,是可以包括n个点(n大于3)的,那如果这n个点如果不在一个平面上,还会被按照实际坐标渲染出来吗?
【 在 sjtuDNA 的大作中提到: 】
: 程序的目的如果是渲染,那么就不存在需要判断是否共面的逻辑。
: 共不共面,2个三角形都需要走图形管线进行渲染。如果共面会造成渲染结果近似,2个三角形分别渲染的结果也是近似的。
: 换一种说法,在浮点数领域里面,没有等于的说法,判断两个浮点数所谓『相等』需要用:abs(A-B)< Epsilon
: ...................
--
FROM 175.190.123.*
好吧,我明白了,那我不问渲染管线和GPU,我只问在cpu里或者非shader程序里如何判断n点共面呢?
【 在 sjtuDNA 的大作中提到: 】
: 说了八百遍了,程序不需要判断n点共面,程序不需要判断n点共面,程序不需要判断n点共面。
: 只是你臆想的程序需要判断n点共面,实际渲染管线不需要判断n点共面。
: blender和3dmax可以创造同一个平面上的多边形,他们只是生产模型。
: ...................
--
FROM 175.190.123.*
“纹理中的数据可以是静态图片、动图、视频、cpu生成的、gpu之前渲染得到的等等;其中的数据也可以不是颜色值,而是4维以内的整数、普通浮点数等”
动图和视频是怎么作为纹理的呢?我看了一遍一个openGL入门教程,没看到有提过这方面的内容。具体是如何实现的呢?谢谢
【 在 dilemma 的大作中提到: 】
: gpu管道允许的格式只能是点、线、三角形中的一种
: 3ds max是可以锁定平面或轴的,新生成的点自然就共面了
: 顶点除了位置坐标(xyz),还有纹理坐标(uv),纹理坐标的u和v范围可以视为[0,1],纹理的高度和宽度范围也归一化为[0,1]。一个uv值对应于纹理上的一个采样数据,采样时可以使用内置的采样算法或自己定制(uv坐标通常和像素不精确对应),超过范围的uv值会按照指定的规则重新映射到[0,1]内
: ...................
--
FROM 175.190.123.*
谢谢
但是存储的位置坐标都是浮点值,实际在程序里算出来两个向量都是float格式,数值是近似出来的,可能在数学上不一定完全平行吧?可能会差一点点。会有这种情况吗?这时候如何处理呢,只要是二者叉积结果小于一定的阈值就判定是平行的?前面 @sjtuDNA 也这样说过。
那么问题又来了:如果是要通过一个小的阈值来判断的话,那程序实际是无法区分两个三角形是真正完全共面的,还是说二者间有一个非常非常小的角度,因为两种情况下都会使得两个法向量的叉乘结果小于这个很小的阈值。那么是否能说实际工程角度而言,其实是无法真正判断数学上的共面是否确实为真(除非这n个点的x、y、z三分量中的某一个分量数值完全相等)。
举个例子:我用4个点组成两个毗邻的三角形,二者共享一条边,两个三角形的法向量有个非常非常小的角度是0.001度,小于程序里的阈值0.01度,程序就把4个点视为共面了,然后给他们组成的“四边形”明明一个名称来标记这个面,那么这个面的法向量怎么取?两个法向量的数学平均?程序对于它所认定的面的操作也只是把它们用同一个名称(这个面的名称)来标记,取消各个点之间连线在这个面内部的显示吧(使其看起来像一个面),然后就是针对这组点(或者这个面)做平移变换缩放组操作吧?对面的本质操作就是对一组毗邻三角形及其点和线的组操作吧,和其是否真的共面没关系(而且本来程序就无法真正的在数学上判断共面)?
【 在 DoorWay 的大作中提到: 】
: 先区分:验证共面是图形问题,在console程序里也能做;与渲染(OpenGL接口 +显卡)显示是两回事。
: 验证四个点共面,简单的方法就是,分为两组:abc;bcd.
: 点构造向量,向量叉乘,是法向量。两个(法)向量判断平行,看叉积是否为0。
: ...................
--
修改:seeeU FROM 175.190.123.*
FROM 175.190.123.*