Tag: opengl

为什么四元数用于旋转?

我是一名物理学家,一直在学习一些编程知识,并且遇到了很多使用四元数旋转的人,而不是用matrix/vectorforms写东西。 在物理学中,我们没有使用四元数有很好的理由(尽pipe偶尔讲述关于汉密尔顿/吉布斯等的奇怪故事)。 物理学要求我们的描述具有良好的分析行为(这有一个精确定义的含义,但是在某些技术方面远远超出了正常介绍类的教导,所以我不会详细讨论)。 事实certificate,四元数不具有这种好的行为,所以它们没有用,vector/matrix做,所以我们使用它们。 然而,受限于不使用任何分析结构的刚性旋转和描述,三维旋转可以用任何方式(或其他几种方式)等效描述。 通常,我们只需要一个点X =(x,y,z)到一个新的点X'=(x',y',z')的映射,受X 2 = X'2的限制。 还有很多事情是这样做的。 天真的方法是画出三angular形,并使用三angular函数,或者使用点(x,y,z)和vector(x,y,z)之间的同构和函数f(X)= X'和(x,y,z) T (a,b,c)(x',y',…)的matrixMX = X',或者使用四元数,或者沿着新的vector投影出旧vector的分量。 z')等 从math的angular度来看,这些描述在这个环境中是等价的(作为一个定理)。 他们都有相同数量的自由度,相同数量的限制等等。 那么,为什么四元数似乎更偏向于vector? 我看到的常见原因是没有万向节锁或数字问题。 没有万向节锁的说法似乎很奇怪,因为这只是一个欧拉angular的问题。 这也只是一个坐标问题(就像极坐标中r = 0的奇点(雅可比行列式)),这意味着它只是一个局部问题,可以通过切换坐标,旋转退化,或者使用两个重叠的坐标系。 我对数字问题不太确定,因为我不清楚这些(以及其他方法)是如何实施的。 我已经读过,重新归一化四元数比旋转matrix更容易,但这只适用于一般matrix; 一个旋转具有额外的约束,这个约束(这是四元数定义内置的)(事实上,这是必须的,因为它们具有相同的自由度)。 那么,四元数使用vector或其他select的原因是什么?

Python – 没有处理程序可以findlogging器“OpenGL.error”

好的,它是什么,为什么会出现在Win2003服务器上,而不是在WinXP上。 它似乎并没有影响我的应用程序,但是当我closures应用程序时,我收到了这个错误消息。 这是烦人的(因为错误消息应该是)。 我正在使用pyOpenGl和wxPython做graphics的东西。 不幸的是,我是接pipe了这个Python应用程序的C#程序员,我不得不学习Python来做到这一点。 我可以提供代码和版本号等,但我仍然在学习技术的东西,所以任何帮助,将不胜感激。 Python 2.5,wxPython和pyOpenGL

什么是顶点数组对象?

我刚从本教程开始学习OpenGL: http : //openglbook.com/the-book/ 我到了第二章,画了一个三angular形,除了VAO,我明白了所有的一切(这个缩写是好的吗?)。 教程有这样的代码: glGenVertexArrays(1, &VaoId); glBindVertexArray(VaoId); 虽然我明白代码是必要的,但我不知道它做了什么。 尽pipe我从来没有使用VaoId(除了销毁它),但代码在没有它的情况下不能运行。 我假设这是因为它需要绑定,但我不知道为什么。 这个确切的代码是否需要成为每个OpenGL程序的一部分? 该教程将VAO解释为: 顶点数组对象(或VAO)是描述如何将顶点属性存储在顶点缓冲对象(或VBO)中的对象。 这意味着VAO不是存储顶点数据的实际对象,而是顶点数据的描述符。 顶点属性可以用glVertexAttribPointer函数及其两个姐妹函数glVertexAttribIPointer和glVertexAttribLPointer来描述,我们将在下面探讨其中的第一个。 我不明白VAO如何描述顶点属性。 我没有以任何方式描述它们。 它是否从glVertexAttribpointer获取信息? 我想这一定是它。 VAO只是来自glVertexAttribPointer的信息的目的地吗? 请注意,我接受的教程是否可以接受? 有什么我应该注意的或更好的教程要遵循?

顶点着色器与片段着色器

我已经阅读了一些关于Cg的教程,但是有一件事对我来说并不是很清楚。 顶点和片段着色器究竟有什么区别? 而在什么情况下比另一个更适合?

opengl:glFlush()与glFinish()

我很难区分调用glFlush()和glFinish()之间的实际区别。 文档说glFlush()和glFinish()会把所有缓冲的操作都推送到OpenGL,这样可以确保所有的操作都会被执行,区别在于glFlush()立即返回glFinish()阻塞,直到所有的操作完成。 读过这些定义之后,我发现如果我使用glFlush() ,那么我可能会遇到向OpenGL提交更多操作的问题。 所以,试试看,我把glFinish()换成了glFlush() ,然后看,我的程序跑了(据我所知),完全一样; 帧率,资源使用情况,一切都是一样的。 所以我想知道这两个调用之间是否有很大差别,或者如果我的代码使它们运行没有什么不同。 或者应该使用哪一个而不是另一个。 我还想到OpenGL会有一些像glIsDone()这样的调用来检查glIsDone()所有缓冲命令是否完成(所以不会比OpenGL更快地发送操作),但是我找不到这样的function。 我的代码是典型的游戏循环: while (running) { process_stuff(); render_stuff(); }

glu,glew,glut,qt,sdl,openGL和webGL有什么区别?

所以我意识到,有各种各样的职位,包括对这些,但我很难理解他们如何融合在一起。 请解释以下各项用法以及它们如何相互关联: 谷氨酸 GLEW 充斥 SDL QT openGL的 WebGL的

glVertexAttribPointer澄清

只是想确保我正确理解这个(我会问在SO聊天,但它已经死了!): 我们有一个顶点数组,我们通过绑定来创build“当前” 然后我们有一个缓冲区,我们绑定到一个目标 那么我们通过glBufferData来填充Target,它基本上填充绑定到那个目标的东西,也就是我们的Buffer 然后我们调用glVertexAttribPointer来描述数据是如何布置的 – 数据是绑定到GL_ARRAY_BUFFER任何东西,这个描述符被保存到我们原始的顶点数组 (1)我的理解是否正确? 这个文档对于所有东西是如何相关的有点稀疏。 (2)是否有某种默认的顶点数组? 因为我忘了/省略glGenVertexArrays和glBindVertexArray和我的程序工作正常,没有它。 编辑:我错过了一个步骤… glEnableVertexAttribArray 。 (3)在调用glVertexAttribPointer ,顶点属性是否与顶点数组绑定在一起,然后我们可以随时通过glEnableVertexAttribArray启用/禁用该attrib,而不pipe当前绑定了哪个顶点数组? 或者(3b)在glEnableVertexAttribArray被调用的时候Vertex属性是绑定到顶点数组的,因此当不同的顶点数组绑定时,我们可以通过在不同的时间调用glEnableVertexAttribArray来将相同的顶点属性添加到多个顶点数组中?

Framebuffer和Renderbuffer在OpenGL中的概念和区别是什么?

我对Framebuffer和Renderbuffer的概念感到困惑。 我知道他们需要渲染,但我想在使用前了解它们。 我知道一些位图缓冲区是需要存储临时绘图结果。 后台缓冲区。 当这些图纸正在进行时,需要在屏幕上看到另一个缓冲区。 前台缓冲区。 把它们翻过来再画一遍。 我知道这个概念,但很难将这些对象连接到这个概念上。 他们的概念和差异是什么?

glActiveTexture和glBindTexture之间的差异和关系

从我所收集的, glActiveTexture设置活动的“纹理单元”。 每个纹理单元可以有多个纹理目标(通常是GL_TEXTURE_1D,2D,3D或CUBE_MAP)。 如果我理解正确,您必须先调用glActiveTexture来设置纹理单元(初始化为GL_TEXTURE0 ),然后将(纹理目标)绑定到(一个或多个)纹理单元? 可用纹理单元的数量取决于系统。 我在库中看到多达32个枚举。 我想这基本上意味着我可以拥有我的GPU的极限(我认为是这样) 16 8)和32个纹理在GPU内存中的任何一个时间? 我想有一个额外的限制,我不超过我的GPU的最大内存(据说1 GB)。 我是否正确理解纹理目标和纹理单元之间的关系? 假设我有16个单位和4个目标,这是否意味着有16 * 4 = 64个目标的空间,还是不能这样工作? 接下来你通常要加载一个纹理。 你可以通过glTexImage2D来做到这一点。 其中的第一个参数是纹理目标。 如果像glBufferData这样工作 ,那么我们将“handle”/“texture name”绑定到纹理目标,然后将纹理数据加载到该目标中,从而间接将其与该句柄关联。 那么glTexParameter呢? 我们必须绑定纹理目标,然后再select同一个目标作为第一个参数? 或者只要我们拥有正确的活动纹理单元,纹理目标就不需要绑定了。 glGenerateMipmap也在目标上运行…目标必须仍然绑定到纹理名称才能成功? 那么当我们想要绘制具有纹理的对象时,我们是否必须同时select一个活动的纹理单元,然后select一个纹理目标? 或者我们select一个纹理单元,然后我们可以从与这个单元相关的4个目标中的任何一个中获取数据? 这是真的让我困惑的部分。

什么是GLSL着色器的正确文件扩展名?

我正在学习glsl着色,并且遇到了不同的文件格式。 我看到有人给他们的顶点和片段着色器.vert和.frag扩展名。 但是我也看到.vsh和.fsh扩展名,甚至两个着色器都放在一个.glsl文件中。 所以我想知道是否有一个标准的文件格式,或者哪个方法是“正确”的?