- 主题:外行问一个关于openGL和计算机图形学的一个的问题
说了八百遍了,程序不需要判断n点共面,程序不需要判断n点共面,程序不需要判断n点共面。
只是你臆想的程序需要判断n点共面,实际渲染管线不需要判断n点共面。
blender和3dmax可以创造同一个平面上的多边形,他们只是生产模型。
obj的格式也好,任何格式送入渲染管线的都是三角形,如果不是三角形,要做triangulation。
渲染不关心在不在一个平面上,只按照实际的坐标进行绘制。
【 在 seeeU 的大作中提到: 】
: 就是说程序上如果要实际上判断n点共面,最后也是要设定一个近似的阈值吗?
: 在blender和3dmax里是可以创造同一个平面上的多边形的吧?它们是怎么处理的呢?
: 还有obj文件格式里,定义一个面的时候需要包括其顶点,是可以包括n个点(n大于3)的,那如果这n个点如果不在一个平面上,还会被按照实际坐标渲染出来吗?
: ...................
--
FROM 124.127.210.*
好吧,我明白了,那我不问渲染管线和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.*
4点共面可以考虑:
1. 可以拆成有共同边的2个三角形,2个三角形的法向量的夹角小于epsilon。(一般模型输入的时候都带法向量,所以不用计算)。复杂度O(n)
2. W点到ABC面的距离,小于epsilon
【 在 seeeU 的大作中提到: 】
: 好吧,我明白了,那我不问渲染管线和GPU,我只问在cpu里或者非shader程序里如何判断n点共面呢?
--
修改:sjtuDNA FROM 124.127.210.*
FROM 124.127.210.*
动图的序列帧可以作为N个纹理对象,通过timer来进行触发这个纹理对象id的变换。
【 在 seeeU 的大作中提到: 】
: “纹理中的数据可以是静态图片、动图、视频、cpu生成的、gpu之前渲染得到的等等;其中的数据也可以不是颜色值,而是4维以内的整数、普通浮点数等”
: 动图和视频是怎么作为纹理的呢?我看了一遍一个openGL入门教程,没看到有提过这方面的内容。具体是如何实现的呢?谢谢
:
--
FROM 124.127.210.*
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.*
光栅化过程的原理你没有搞清楚。
为什么GPU必须要处理三角形面片,而不是四边形面片。
最重要的原因就是:可以通过叉积判断一个点是不是在三角形内部
在光栅化时,会遍历所有像素,这个像素在哪个三角形内,根据这个三角形的颜色属性等,通过brdf模型或者其他的模型来给这个像素赋值。在fragment shader里面,可以更灵活的编程处理这个赋值过程。
所以你说的什么四边形,什么共面,根本就不可能存在。
【 在 seeeU 的大作中提到: 】
: 谢谢
: 但是存储的位置坐标都是浮点值,实际在程序里算出来两个向量都是float格式,数值是近似出来的,可能在数学上不一定完全平行吧?可能会差一点点。会有这种情况吗?这时候如何处理呢,只要是二者叉积结果小于一定的阈值就判定是平行的?前面 @sjtuDNA 也这样说过。
: 那么问题又来了:如果是要通过一个小的阈值来判断的话,那程序实际是无法区分两个三角形是真正完全共面的,还是说二者间有一个非常非常小的角度,因为两种情况下都会使得两个法向量的叉乘结果小于这个很小的阈值。那么是否能说实际工程角度而言,其实是无法真正判断数学上的共面是否确实为真(除非这n个点的x、y、z三分量中的某一个分量数值完全相等)。
: ...................
--
FROM 124.127.210.*
OpenGL API虽然接受Polygon,但是依然会把他处理成Triangle再继续操作顶点。
【 在 DoorWay 的大作中提到: 】
: 1 是,用阈值。根据模型精度定的阈值,数值精度一般用很多位;模型精度10分之1毫米。
: 2 数学真正的共面就用数学的方法解出来。程序的精度就是小于阈值,就真正的共面。
: 3 程序就把4个点视为共面了,然后给他们组成的“四边形”明明一个名称来标记这个面,那么这个面的法向量怎么取?—— 这里指的是哪个程序?程序没有这么傻,如果有也是程序员傻(笑)。一般图形程序定义一个面,就是选一个点和一个法向就行了。叫它CPlane。内部计算时,就是平面公式,Ax + By +Cz =d。判断多点共面,取三点构造CPlane,判断其他点到平面的距离就可以。
: ...................
--
FROM 124.127.210.*
举个例子:我用4个点组成两个毗邻的三角形,二者共享一条边,两个三角形的法向量有个非常非常小的角度是0.001度,小于程序里的阈值0.01度,程序就把4个点视为共面了,然后给他们组成的“四边形”明明一个名称来标记这个面,那么这个面的法向量怎么取?两个法向量的数学平均?程序对于它所认定的面的操作也只是把它们用同一个名称(这个面的名称)来标记,取消各个点之间连线在这个面内部的显示吧(使其看起来像一个面),然后就是针对这组点(或者这个面)做平移变换缩放组操作吧?对面的本质操作就是对一组毗邻三角形及其点和线的组操作吧,和其是否真的共面没关系(而且本来程序就无法真正的在数学上判断共面)?
————————————————————————————————————————————————————————————
你举的例子,是你独创的渲染管线,不是目前的渲染管线的做法。
渲染管线从来不会,也不需要判断2个三角形是否共面。
2个三角形,有相邻边,法相方向接近,那么在最后渲染的结果上就是『一致』的,不需要判断他是否共面。
我不明白你天天纠结这个共面,干嘛。很难以理解吗?
2包中华,画出来就是2包中华,你管他是不是放在一个桌子上干嘛?
--
FROM 124.127.210.*