草庐IT

c++ - 为什么我在 OpenGL 的透视投影中将 Z 除以 W?

我想这与其说是一个OpenGL问题,不如说是一个数学问题,但我离题了。无论如何,如果透视除法的全部目的是获得可用的x和y坐标,为什么还要用w除以z?另外,我如何首先获得w? 最佳答案 实际上,解释更多的是与深度缓冲区的限制有关,而不是数学。简单来说,“深度缓冲区是一种纹理,其中每个屏幕上的像素都根据其与相机的距离分配一个灰度值。这使得视觉效果可以随距离轻松改变。”Source更准确地说,深度缓冲区是包含每个fragment的z/w值的纹理。,其中:Z是近裁剪平面到片段的距离。W是相机到片段的距离。在下图中说明了z、w和z/w之间的关

c++ - 如何将类方法作为 GLUT 回调传递?

我知道这个东西有用:voidmyDisplay(){...}intmain(){...glutDisplayFunc(myDisplay)...}所以我尝试将myDisplay()函数包含到我创建的类中。因为我想在将来用不同的类重载它。然而,编译器提示说argumentoftype'void(ClassBlah::)()'doesnotmatch'void(*)()'.这是我尝试做的:classClassBlah{....voidmyDisplay()....}......intmain(){...ClassBlahblahglutDisplayFunc(blah.myDisplay)

c++ - 调用 glGenVertexArrays 时程序崩溃

我正在尝试学习如何在opengl中编程并且正在使用thistutorial.教程1工作正常,教程2崩溃并返回1。它失败了:GLuintVertexArrayID;glGenVertexArrays(1,&VertexArrayID);glBindVertexArray(VertexArrayID);具体来说:glGenVertexArrays(1,&VertexArrayID);有什么建议吗?也相关但从未解决OpenGL,FreeGlutandGlewcrashwithglGenVertexArrayscall 最佳答案 看完这篇t

c++ - 将 openGL 上下文保存为视频输出

我目前正在尝试将openGL中制作的动画保存到视频文件中。我曾尝试使用openCV的videowriter但没有任何优势。我已经成功地能够使用SDL库生成快照并将其保存为bmp。如果我保存所有快照,然后使用ffmpeg生成视频,这就像收集4GB的图像。不实用。如何在渲染过程中直接写入视频帧?这是我在需要时用来拍摄快照的代码:voidsnapshot(){SDL_Surface*snap=SDL_CreateRGBSurface(SDL_SWSURFACE,WIDTH,HEIGHT,24,0x000000FF,0x0000FF00,0x00FF0000,0);char*pixels=ne

c++ - 如何从 3D 点获取屏幕坐标? OpenGL

我看过很多屏幕坐标到世界坐标的帖子,但没见过相反的。有没有一种简单的方法可以从任何角度从3d点获取屏幕坐标?我正在使用C++和opengl 最佳答案 erjot的回答不完整。还有两件事需要考虑。与homogeneous=P。米。world,homogeneousvector是齐次空间中的4维vector。特别是,要将它带回[-1:1]^3立方体,您需要将它的前3个坐标除以homogeneous.w。cube.x=homogeneous.x/homogeneous.w(有些人称之为投影分界线)。然后,您需要通过对其应用视口(viewp

c++ - OpenGL glBegin ... glEnd

按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我想知道如果使用glBegin而不是GLSL、VBO和VAO等等,我的游戏会受到多严重的影响。他们只是看起来如此难以实现我可以更轻松地完成的事情。我的选择会产生什么影响?

windows - 多窗口 OpenGL/Glut

我想知道如何打开多个OpenGL/Glut窗口。我的意思是同时有多个窗口不是子窗口和不更新同一个窗口 最佳答案 虽然我相信上面的答案是准确的,但它比需要的要复杂一些,而且当以后不得不处理窗口之间的移动时(例如,当绘制到它们中时)可能会很困难。这是我们刚刚在类里面所做的:GLintWindowID1,WindowID2;//windowIDnumbersglutInitWindowSize(250.0,250.0);//setawindowsizeglutInitWindowPosition(50,50);//setawindowpo

c++ - 不打开窗口的 OpenGL 上下文 - 当使用由 GetDesktopWindow 制作的 HWND 时,wglMakeCurrent 因 HDC 和 HGLRC 而失败

这有点重复thisquestion.我正在尝试制作一个无窗口控制台应用程序来检查支持的OpenGL版本。为此,我需要设置渲染上下文——但不创建窗口。我正在尝试使用我不会写入的桌面句柄。我忘记在前面的示例中设置像素格式-这可能是创建渲染上下文失败的原因-但是即使设置了像素格式,我也无法激活它。wglMakeCurrent(hDC,hRC)只返回0。这是完整的源代码转储:#include#include#includeHDChDC=NULL;HGLRChRC=NULL;HWNDhWnd=NULL;HINSTANCEhInstance;intres=0;intpf=0;PIXELFORMAT

c++ - ld.exe 找不到-lGL

我最近买了一本关于OpenGL的书,并试图按照示例进行操作,但我无法让OpenGL正常工作。例如,它给我错误:ld.exe||cannotfind-lGL|.我的编译器是GNU-GCCMinGW,使用IDECode::Blocks,我的操作系统是Windows764位。我已经链接了库:opengl32、glu32、glut32,在其他链接器选项中我有:-lmingw32-lSDLmain-lSDL,因为这是在code::blockswiki上建议的。我有一些使用C++的经验,但在链接和设置编译器方面一无所知,因为这过去非常自动。如何修复此错误? 最佳答案

c++ - 后处理窗口视频输出

我正在尝试看看是否/如何制作一个Windows(甚至是Mac/Linux)应用程序,该应用程序将对屏幕上的所有内容进行后处理。如果可能的话,我希望能够使用glsl着色器对屏幕上的所有内容执行颜色反转和sobel过滤等操作。有谁知道如何做到这一点? 最佳答案 CompizLinux的合成器看起来可以做你想做的事。它已经包含许多后期处理效果(作为包含的插件),并允许您通过自定义插件添加自己的效果。看起来这些插件可以使用GLSL像素着色器。根据thissite,以下命令应该在Ubuntu13.04上设置CompizConfig设置管理器s