我面临一个问题,我相信是VAO依赖的,但我不确定..
我不确定VAO的正确用法,我在GL初始化期间做的事情很简单
glGenVertexArrays(1,&vao)
Run Code Online (Sandbox Code Playgroud)
接下来是
glBindVertexArray(vao)
Run Code Online (Sandbox Code Playgroud)
后来,在我的绘图管道中,我只调用glBindBuffer(),glVertexAttribPointer(),glEnableVertexAttribArray()等等,而不关心初始绑定的VAO
这是正确的做法吗?
给定一个完全由四边形组成的网格,其中每个顶点都具有效价n(n> = 3),并且不在同一平面上,我需要从一组封闭的种子顶点中找到网格中每个顶点的距离.也就是说,给定一个或多个网格顶点(种子集),我需要构建一个距离图,该距离图存储每个网格顶点距种子集的距离(距离自身的距离为0).
在花了一些时间寻找可能的解决方案之后,我得到了以下图片:
1)这不是微不足道的,并且在过去20年左右的时间里已经开发了不同的方法
2)考虑3d域的每个算法都限于三角域
说,这是我得到的图片:
Dijkstra算法可以用作在网格边缘之后找到2个顶点之间的最短路径的方法,但是它非常不准确并且将导致错误的测地线.Lanthier(洛杉矶)提出了改进,但错误仍然很高.
Kimmel和Sethian(KS)提出了一种快速行进方法-FMM-来解决Eikonal方程,解决计算从种子点开始的波传播并记录波穿过每个顶点的时间的问题.不幸的是,这个算法虽然简单易于实现,但仍然会带来非常不准确的结果,必须注意避免使用钝角三角形,或者以非常特殊的方式处理它们.Novotni(NV)解决了单个种子场景中(KS)精度的问题,但我不清楚是否:
a)它仍然受到钝角问题的困扰
b)当在多种子点场景中使用时,必须为每个种子实施单个FMM,以便从每个种子中找到每个网格顶点的最小距离(即,在10个种子点场景中,FMM将具有每个网格顶点运行10次)
另一方面,Mitchell等人提出了导致0错误的精确算法-MMP-.(MI)在87年,AFAIK从未真正被扼杀(可能是由于所需的计算能力).同样的方法,Surazhsky&al.(SU)提供了基于MMP的替代精确算法,其在速度方面应该优于后者,仍然导致正确的结果.不幸的是,计算所需的计算能力,即使比原始MMP小得多,仍然足够高,因此此时实时交互式实现是不可行的.(SU)也提出了他们的精确算法的近似,他们称之为平精确.它应该花费相同的FMM计算时间,同时只带来1/5的错误,但是:
c)我不清楚它是否可用于多种子方案.
Chen&Han(CH)和Kapoor(KP)已经提出了其他精确的最短路径算法,但是第一种算法绝对慢,第二种算法太复杂而无法在实践中实施.
所以..底线是:我需要一组距离,而不是两点之间的最短路径.
如果我做对了,
要么我使用FMM来获取单个通道中每个顶点的距离,
-要么-
使用另一种算法来计算从每个网格顶点到每个种子点的测地线,并找到最短的一个(如果我把它弄好,这意味着在每个网格顶点的每个种子点上调用该算法,即在10,000个顶点网格上和一个50分的种子集,我将不得不计算500,000测地线,以获得10,000最短的一个)
我错过了什么吗?FMM是一次通过多种种子距离的唯一方法吗?有人知道平面精确算法是否可用于多种子点场景?
日Thnx
笔记:
(洛杉矶):Lanthier等."在多面体表面上逼近加权最短路径"
(KS):Kimmel,Sethian"在流形上计算测地线路径"
(NV):Novotni"计算三角网格上的测地距离"
(MI):米切尔等人."离散测地线问题"
(SU):Surazhsky,Kirsanov等."网格上的快速精确和近似测地线"
(CH):Chen,Han,"多面体的最短路径"
(KP):Kapoor"高效计算geodeisc最短路径"
algorithm math graphics computational-geometry graph-algorithm
我对了解多重采样的工作原理非常感兴趣.我已经找到了关于如何启用或使用它的大量文献,但是关于它为了实现抗锯齿渲染它真正做了什么的信息非常少.在许多地方,我发现的是相互矛盾的信息,这些信息只会让我更加困惑.
请注意,我知道如何启用和使用多重采样(我实际上已经在使用它),我不知道的是多重采样渲染缓冲区/纹理中真正涉及的是什么类型的数据,以及如何在渲染管道中使用这些数据.
我可以很好地理解超级采样是如何工作的,但是多重采样仍然有一些我想要理解的模糊区域.
这是规格说的:(OpenGL 4.2)
像素样本值(包括颜色,深度和模板值)存储在此缓冲区(多重采样缓冲区)中.样本包含每种片段颜色的单独颜色值.
...
在多重采样渲染期间,像素片段的内容以两种方式改变.首先,每个片段包括具有SAMPLES位的覆盖值.
...
其次,每个片段包括SAMPLES深度值和关联数据集,而不是单样本渲染模式中维护的单个深度值和关联数据集.
因此,每个样本都包含不同的颜色,覆盖位和深度.与普通超级采样有什么区别?看起来像是对我的"加权"超级采样,其中每个最终像素值由其样本的覆盖值而不是简单平均值确定,但我对此非常不确定.那么样本级别的纹理坐标呢?
如果我在RGBF多重采样纹理中存储法线,我会在多边形的边缘上将它们"反锯齿"(即接近0)读回来吗?
每个片段调用一次片段着色器,除非它使用gl_SampleID,glSampleIn或具有"样本"存储限定符.如何为每个片段调用一次片段着色器并获得抗锯齿渲染?
我正在使用FBO + RBO,而不是默认帧缓冲区上的常规双缓冲,我正在绘制RBO,然后在单个缓冲的OpenGL上下文中直接在默认FBO(0)的GL_FRONT缓冲区上进行blit.
这很好,我没有任何闪烁,但如果场景有点复杂,我经历了巨大的fps下降,有些奇怪,我知道一些事情是错的.而且我不是指从1/60到1/30因为跳过同步,我的意思是突然下降了90%fps.
在blit之后我尝试了一个glFlush() - 没有区别,然后我在blit之后尝试了glFinish(),并且我有10x fps的提升.
所以我在默认的framebuffer和swapbuffers()上使用了常规的doble缓冲,并且fps也得到了提升,就像使用glFinish()时一样.
我无法弄清楚发生了什么.为什么glFinish()在它不应该做的时候会产生很大的不同?并且,可以直接在前缓冲区上使用RBO和blit,而不是在双缓冲上下文中使用swapbuffers调用吗?我知道我缺少vsync但是复合管理器无论如何都会同步(事实上我没有看到任何撕裂),就像监视器缺少10帧中的9帧一样.
出于好奇,本机swapbuffers()在windows或linux上使用glFinish()吗?
我从来没有使用多重继承,偶然发现了一个我从未遇到过的设计问题.
class A {
//..methods..
}
class B : public A {
int b;
//...methods..
}
class C : public A {
int c1,c2;
}
class D : public B,public C {
}
Run Code Online (Sandbox Code Playgroud)
这是经典的钻石.事实是,这C真的只是一个A额外的两个整数.而D实际上只是一个聚集B和C,但我觉得多重继承并不是用来做这样的事情.或者可能还有其他最佳做法可以做到这一点.
我试图实现多重继承的原因是我想编写一个类似的函数void func(A*)并将其传递给一个A或D类指针.我的天真尝试是做一个简单的演员:
void func(A* a) { // <-- I call this with a A or D pointer
// ..do something with A members..
if(is_the_case) { // <-- Im sure the …Run Code Online (Sandbox Code Playgroud) OpenGL gl_VertexID页面明确指出:
gl_VertexID是一个顶点语言输入变量,它包含顶点的整数索引
而OpenGL 顶点着色器页面则表明它是
当前正在处理的顶点的索引.使用非索引渲染时,它是当前顶点的有效索引(处理的顶点数+第一个值).
我可以假设100%在非索引渲染命令中gl_VertexID是绑定顶点缓冲区中的int顶点索引吗?或者它是由渲染命令处理的顶点的索引(可能或可能不遵循顶点缓冲区中的顺序)
怀疑来自描述部分inside(),至于处理顶点的数量等于顶点缓冲区中当前顶点的索引,顶点必须线性处理.我可以假设情况永远如此吗?或者也许有OpenGL实现可以向后处理顶点,或者在存储桶等中处理顶点.
我搜索了很多但是在#version 330顶点着色器中找不到以下语句是否合法:
#define note_the_following_whitespaces 0x01
(layout location = 7) vec3 out ov;
(layout location = 8) vec3 out rv;
void main() {
rv = vec3(1.0,2.0,3.0);
ov = (1.0+rv)/2.0;
gl_Position = [whatever]...
}
Run Code Online (Sandbox Code Playgroud)
我特别提到(1.0+rv)- 着色器在每张nVidia卡上编译都很好,但拒绝在ATI卡上编译.不幸的是我没有确切的编译结果,我只知道编译不成功.
我搜索了存档的帖子,但我找不到类似的东西.
只是一个简单的问题:在声明检查函数时最好的做法是什么:
int foo(int a) const { return a+1; }
Run Code Online (Sandbox Code Playgroud)
我指的是const关键字,你通常在检查函数的末尾声明它吗?我只是问,因为我通常会这样做,即使99%我不会宣布任何常规类......我只是继续告诉自己,如果我需要它可以节省一些时间,但我想知道是否有其他人真正关心声明const函数或者我只是偏执于类型安全代码
给定:
class A {
std::list<int> m_list;
std::list<int>::iterator m_iterator;
public:
explicit A() : m_iterator(m_list.begin()) { }
};
Run Code Online (Sandbox Code Playgroud)
我保证m_list会在评估ctor初始化列表之前构建,以便a begin()正确地取消引用它的开头/结尾吗?或者我应该更好地使用m_iteratorctor体内的任务?