草庐IT

c++ - SDL2 OpenGL3 如何在函数内初始化 SDL

我正在试验新的SDL2beta和OpenGL3上下文,我遇到了一个奇怪的问题:如果我在main()函数中运行SDL初始化代码,它工作正常,但我想将此代码放在单独的init_sdl()函数中。如果我将初始化代码放在单独的init_sdl()函数中,并从main()调用此函数,则永远不会绘制背景颜色,并且程序开始疯狂消耗我所有的系统资源。有人能给我指出一个工作示例,其中SDL在单独的函数中初始化吗?我似乎找不到一个......也许这是不可能的?我想我依稀记得在使用SDL1.2时遇到过类似的问题,但自从我使用它以来已经有几年了,而且我认为我从未找到解决方案。事实上,这可能是我选择改用SFML

c++ - Sun 作为光源使用 opengl 和 c++

我正在研究太阳系,我试图让太阳成为这个程序的中心光源,但它并没有像我想象的那样工作。这是我没有照明的照片。这是带照明的相同程序。这里换一个角度,这样你就可以看到地球应该没有阴影(忽略月亮上的红色,这是我的引用)我不知道你能不能看出来,但看起来光线集中在每个球体上,而不是在太阳上。地球上的影子就好像光是从上面来的一样。与太阳相同。这里的太阳不是光源,它只是一个也被某些光源照亮的球体。在月球上没有地球的影子,在地球上没有月球的影子。这是绘制系统的代码GLfloatlight_diffuse[]={1.0,1.0,1.0,1.0};GLfloatpos[]={0.0,0.0,1.0,0.0}

c++ - OpenGL 获取距离当前鼠标位置最近的世界 3D 点的 3D 坐标

在OpenGL上下文中,我发现可以将鼠标坐标转换为3D世界坐标(例如MFCwithOpenglget3dcoordinatefrom2dcoordinateofmouse)。但是,当我只有一组GLPoint和大量空白空间时,这不起作用:当我将鼠标悬停在空白空间上时,3D坐标没有意义。如何获取离鼠标位置最近的3D点的坐标? 最佳答案 认识到将2D鼠标坐标“取消投影”到3D世界需要额外的信息。屏幕上的2D位置对应于一条直线上的无限数量的点,从3D中的近平面到远平面。这意味着要获得3D点,您还需要提供深度值。gluUnProject函数是

c++ - 在 OpenGL 中投影纹理

通过将近裁剪平面设置为1而不是0来修复(不确定为什么一开始就是这样)。请参阅框架代码的问题,以及Adrian的回答,了解其工作原理和原因。我有几个不同的相机位置,我的场景由一个四边形组成。四边形是这样的,它在第一帧中准确地投影到视口(viewport)/窗口上。我想将这个相机位置的纹理转换到四边形上。纹理也完全覆盖了视口(viewport)。我做的第一件事是//GL_QUADS...glTexCoord2f(/*onecornerofs,tspace*/);glVertex3f(/*appropriatevertex*/);;最后得到了类似的东西(图片不是我的)然后我意识到是的,当然,

c++ - OpenGL 统一缓冲区?

我正在尝试使用统一缓冲区,但它没有按预期工作。我有两个统一的缓冲区,一个是照明,另一个是Material。问题是颜色不是它们应该的颜色,每次我移动相机时它们都会改变。当我使用普通uniform时,这个问题不存在。这里的图片显示了我的意思:Whenusinguniformbuffers和whenusingnormaluniforms!这是我的片段着色器:#version400//FragmentShaderuniformlayout(std140);invec3EyePosition;invec3EyeNormal;invec2TexCoord;outvec4FragColor;unif

c++ - 对数深度缓冲区 OpenGL

我已经成功地在OpenGL中实现了对数深度缓冲区,主要是来自Outerra的文章(您可以阅读它们here、here和here)。但是,我遇到了一些问题,我不确定这些问题是否是使用对数深度缓冲区所固有的,或者是否有一些我想不到的解决方法。刚开始,我是这样计算顶点着色器中的对数深度的:gl_Position=MVP*vec4(inPosition,1.0);gl_Position.z=log2(max(ZNEAR,1.0+gl_Position.w))*FCOEF-1.0;flogz=1.0+gl_Position.w;这就是我在片段着色器中修复深度值的方法:gl_FragDepth=lo

c++ - 如何检查 OpenGL 版本一致性?

我想确保我的应用程序符合OpenGL2.1。我该如何检查?因为我的电脑支持GL4.4,所以即使我使用,例如glGenVertexArrays(),它也会成功运行。但是glGenVertexArrays()仅适用于GL3+。因此,我想验证我的应用是否仅使用GL2.1功能。一种方法是在我仅支持GL2.1的旧PC上运行它,但我正在寻找一种更简单的方法。 最佳答案 如果您找到支持生成版本特定header的扩展加载器,如@datenwolf所述,那可能是您最简单的解决方案。如有必要,您可以尝试其他选项。您可以在https://www.open

c++ - 带 OpenGL/Eigen3 的反向运动学 : unstable Jacobian pseudoinverse

我正在尝试使用OpenGL、Eigen3和"Jacobianpseudoinverse"实现简单的反向运动学测试方法。系统使用“Jacobiantranspose”算法运行良好,但是,一旦我尝试使用“pseudoinverse”,关节就会变得不稳定并开始抽动(最终它们完全卡住-除非我使用“Jacobiantranspose”回退计算).我调查了这个问题,结果发现在某些情况下Jacobian.inverse()*Jacobian的行列式为零,无法反转。但是,我在互联网(Youtube)上看到其他声称使用相同方法的演示,但他们似乎没有这个问题。所以我不确定问题的原因在哪里。代码附在下面:*

c++ - 在 OpenGL 上延迟渲染 Qt

我是关于this的问题,并且知道可以做得更好。问题:当用Qt小部件覆盖QGLWidget(QtOpenGLcontextview)时,Qt在每个Qt帧之后重绘这些小部件。Qt并不是为了不断地以>60fps重绘整个窗口而构建的,因此速度非常慢。我的想法:让Qt使用其他东西来绘制:透明纹理。使OpenGL在重绘时使用此纹理并将其绘制在其他所有内容之上。让Qt将与OpenGL上下文View的所有交互重定向到绘制到纹理上的小部件。优点是Qt只需在必要时重绘(例如,悬停或单击小部件,或者文本字段中的文本光标闪烁),并且可以更快地进行部分重绘。我的问题:如何解决这个问题?我怎样才能告诉Qt绘制纹理

c++ - SDLSurface 的 OpenGL 纹理太暗

我遇到的问题与这个OpenGlgoestoodark完全相同但答案对我不起作用。由于表面转换为纹理,我正在尝试显示图像,但结果太暗了:原文:在openGL之后左边是原图,右边是OpenGlimg。这是我的代码:voidTexturedRect::draw(intscroll){glMatrixMode(GL_MODELVIEW);glLoadIdentity();glBindTexture(GL_TEXTURE_2D,_texture);glEnable(GL_TEXTURE_2D);glBegin(GL_QUADS);//Beginingthecube'sdrawingintx=th