Tag: opengl

我是否应该在一个线程中锁定一个变量,如果我只需要在其他线程中使用它的值,为什么我不这样做呢?

我知道这个问题 ,但我相信我的担忧是非常不同的。 我最近使用线程和OpenGL创建了一个SDL应用程序。 我有一个线程在循环中运行,它不断更新我绘制到屏幕的对象的状态。 状态非常简单,它只是一个布尔数组(当数组值为true时,我绘制它,当它为假时,我没有)。 目前,我的任何变量都没有互斥锁,一切正常。 即使只有一半的状态数组在绘制之间更新,帧速率也要高得多(或至少等于)更新速率,因此具有半更新状态是可以接受的。 现在,我最初在使用中断的嵌入式系统上开始研究类似的想法。 每隔一段时间,一个中断就会触发,更新状态数组,执行将继续。 现在我正在使用多核桌面,并同时更新arrays,我想知道为什么没有发生任何不好的事情,因为我在技术上同时读取和写入相同的内存位置。 是偶然的,还是有没有原因导致没有发生内存访问冲突? 如果在使用该值之前,期间或之后变量的状态是可以接受的,那么我是否应该使用互斥锁? 谢谢您的帮助。 编辑:附加信息 – 数组是动态创建的,但是当它被创建/删除时,我确实使用了互斥锁(我认为访问已删除的内存不会看起来很友好:P)。

OpenGL如何进行unit testing?

有没有一种使用OpenGL命令对函数或类进行unit testing的好方法? 对于c ++,我知道我可以使该类成为模板并传递一个直接进行opengl调用的类: namespace myNamespace { struct RealOpenglCall { static inline void glVertex2fv( const GLfloat * v) { ::glVertex2fv( v ); } }; template class SomeRendering { public: SomeRendering() : v() { // set v } void Draw() { T::glVertex2fv(v); } GLfloat v[4]; }; } 在C和c ++中,我可以将函数指针传递给调用opengl函数的函数(然后用于将指针传递给mock函数的unit testing)。 我也可以链接不同的库(而不是opengl),但这听起来像是一个很大的复杂function。 那么,什么是unit testing代码调用opengl函数的其他技术呢?

了解OpenGL

我有一些关于OpenGL的基本要点/问题,不是所有涉及代码而是概念。 如果你能回答,肯定或扩展他们中的任何一个,我将不胜感激。 我警告你,有些人可能天真,所以请耐心等待。 我知道OpenGL只是一个标准,而不是一个软件。 例如,“获取”OpenGL实际上涉及获得第三方实现,而不一定必须得到Khronos的认可。 OpenGL通常指GL实用程序(GLU)和GL实用工具包(GLUT)的组合。 他们有从glu和glut开始的方法,resp。 而那些以简单的gl开头的’基本’OpenGL方法是由那些制作图形驱动程序的人实现的,即NVIDIA? 我假设glut方法是特定于操作系统的助手,例如glutKeyboardFunc()必须是,以解释键盘。 因此,如果我想要一种更强大的替代方法来解释键盘输入,我只会使用OS API。 OpenGL本身纯粹是关于图形的,但glut有这种东西,因为图形并没有太多没有实时的人为控制。 在我看来, glu方法可能与调用一系列低级gl方法相同。 我想引用的一个例子是glOrtho()和gluPerspective() 。 在我看来他们有类似的工作方式,但计算透视可能更复杂,所以gluPerspective()是为了方便,但可能只解决一些gl方法。 我在大学时使用freeglut学习了基本的OpenGL,并且我一直只使用低级方法来实现使用OpenGL的“硬核”方式。 我不知道这是否是一个完全天真的想法,但是有一种“专业”的方式来编写OpenGL,以获得它的最大function吗? 比如,据推测,游戏开发者不会使用glutPostRedisplay() ,对吧? 它似乎太容易和方便,就像它隐藏了很多正在发生的事情。 我怀疑C ++也是如此,因为GLUT回调与命名空间中的方法不友好(正如我在其他问题中看到的那样)。

如何在OpenGL中计算FPS?

void CalculateFrameRate() { static float framesPerSecond = 0.0f; // This will store our fps static float lastTime = 0.0f; // This will hold the time from the last frame float currentTime = GetTickCount() * 0.001f; ++framesPerSecond; if( currentTime – lastTime > 1.0f ) { lastTime = currentTime; if(SHOW_FPS == 1) fprintf(stderr, “\nCurrent Frames Per Second: […]

四元数“lookAt”function

我正在努力解决以下问题。 我正在使用骨骼动画,我希望(即)玩家的头部跟随太空中的另一个物体。 我的上轴是+ Z我的前轴是+ Y,四元数的大小是W.我试图使用gluLookAt的mesa代码并使用3×3矩阵转换为四元数但它不能按预期工作所以我走向另一个方向…… 到目前为止,我得到了以下代码“几乎”工作,至少玩家的头部正在旋转(但是X角度似乎影响Y旋转轴)在良好的方向上,但它直视向上而不是跟随一个物体约65度的地板: qt LookRotation( v3 lookAt, v3 upDirection ) { qt t; v3 forward = lookAt; v3 up = upDirection; OrthoNormalize( &forward, &up ); v3 right = v3_cross( up, forward ); mat3 m = mat3_make( right.x, up.x, forward.x, right.y, up.y, forward.y, right.z, up.z, forward.z ); tw = sqrtf( 1.0f + mr[ […]

在OpenGL中glRotate旋转相机或旋转世界轴还是旋转模型对象?

我想知道glRotate是否旋转相机,世界轴或物体。 解释它们与示例的不同之处。

OpenGL中的矩阵堆栈有什么意义?

为什么我会使用OpenGL的矩阵堆栈(而不是包装我自己的矩阵类并只使用它)? 我不确定为什么这么简单的任务会如此复杂。 它有一些特殊用例吗? 如果没有必要,有什么好的替代品呢?

行主要与列主要混淆

我一直在阅读很多关于此事的内容,我读的越多,我就越困惑。 我的理解:在行主要行连续存储在内存中,列主要列连续存储在内存中。 因此,如果我们有一系列数字[1, …, 9]并且我们想将它们存储在行主矩阵中,我们得到: |1, 2, 3| |4, 5, 6| |7, 8, 9| 而专栏(如果我错了,请纠正我)是: |1, 4, 7| |2, 5, 8| |3, 6, 9| 这实际上是前一个矩阵的转置。 我的困惑:嗯,我没有看到任何区别。 如果我们迭代两个矩阵(按第一个中的行和第二个中的列),我们将以相同的顺序覆盖相同的值: 1, 2, 3, …, 9 即使矩阵乘法是相同的,我们采用第一个连续元素并将它们与第二个矩arrays相乘。 所以说我们有矩阵M : |1, 0, 4| |5, 2, 7| |6, 0, 0| 如果我们将前一行主矩阵R乘以M ,即R x M我们将得到: |1*1 + 2*0 + 3*4, 1*5 + […]

恒定的游戏速度独立于OpenGL与GLUT中的可变FPS?

我一直在阅读Koen Witters关于不同游戏循环解决方案的详细文章 ,但是我在使用GLUT实现最后一个时遇到了一些问题,这是推荐的。 在阅读了几篇关于如何实现恒定游戏速度的文章,教程和代码之后,我认为我目前已实现的内容(我将在下面发布代码)是Koen Witters所谓的Game Speed依赖于可变FPS ,第二篇关于他的文章。 首先,通过我的搜索经验,有几个人可能有帮助,但不知道什么是GLUT,我将尝试解释(随意纠正我)相关的function我的这个OpenGL工具包的问题。 如果您知道GLUT是什么以及如何使用它,请跳过此部分。 GLUT工具包: GLUT是一个OpenGL工具包,可以帮助完成OpenGL中的常见任务。 glutDisplayFunc(renderScene)接受一个指向renderScene()函数回调的指针,该回调将负责渲染所有内容。 renderScene()函数仅在回调注册后调用一次。 glutTimerFunc(TIMER_MILLISECONDS, processAnimationTimer, 0)在调用回调processAnimationTimer()之前需要经过的毫秒数。 最后一个参数只是一个传递给计时器回调的值。 processAnimationTimer()不会在每个TIMER_MILLISECONDS而只需调用一次。 glutPostRedisplay()函数请求GLUT渲染一个新帧,所以每当我们改变场景中的某些东西时我们都需要调用它。 glutIdleFunc(renderScene)可用于向renderScene()注册回调(这不会使glutDisplayFunc()无关)但应避免使用此函数,因为在未接收到事件时会持续调用空闲回调,从而增加CPU负载。 glutGet(GLUT_ELAPSED_TIME)函数返回自调用glutGet(GLUT_ELAPSED_TIME)或首次调用glutGet(GLUT_ELAPSED_TIME) )以来的毫秒数。 那是GLUT的计时器。 我知道高分辨率计时器还有更好的选择,但是现在让我们继续使用这个计时器。 我认为这是关于GLUT如何渲染帧的足够信息,所以那些不了解它的人也可以在这个问题中投入试图帮助它们如果它们像它一样堕落。 目前的实施: 现在,我不确定我是否正确实施了Koen提出的第二种解决方案, 游戏速度依赖于可变FPS 。 相关代码如下: #define TICKS_PER_SECOND 30 #define MOVEMENT_SPEED 2.0f const int TIMER_MILLISECONDS = 1000 / TICKS_PER_SECOND; int previousTime; int currentTime; int elapsedTime; void renderScene(void) { (…) // Setup […]

OpenGL NURBS表面

我正在学习OpenGL,我希望在中间有一个轻微的驼峰表面。 我目前正在使用此代码,我不知道如何调整ctrl点以使其成为我想要的方式。 它目前喜欢 我想这样: 我不完全确定我应该使用什么控制点,我对它是如何工作感到困惑。 #include #include GLfloat ctrlpoints[4][4][3] = { {{-1.5, -1.5, 4.0}, {-0.5, -1.5, 2.0}, {0.5, -1.5, -1.0}, {1.5, -1.5, 2.0}}, {{-1.5, -0.5, 1.0}, {-0.5, -0.5, 3.0}, {0.5, -0.5, 0.0}, {1.5, -0.5, -1.0}}, {{-1.5, 0.5, 4.0}, {-0.5, 0.5, 0.0}, {0.5, 0.5, 3.0}, {1.5, 0.5, 4.0}}, {{-1.5, 1.5, -2.0}, {-0.5, 1.5, -2.0}, {0.5, 1.5, […]