我是OpenGL的新手,我有点不知所措的代码中的所有随机函数。 他们工作,我知道什么时候使用他们,但我不知道为什么我需要他们或他们实际上做什么。 我知道glLoadIdentity()用当前matrixreplace当前matrix,但是到底是什么呢? 如果每个程序都需要它,为什么默认情况下不是身份matrix,除非另有说明? 我不喜欢在我的代码中有function,除非我知道他们做了什么。 我应该注意到,我正在使用OpenGL专门用于丰富的2D客户端,所以如果这对于3D来说非常明显,那么请原谅我的无知。 还有一点困惑glMatrixMode(GL_PROJECTION) VS glMatrixMode(GL_MODELVIEW) 。
我需要debugging一个GLSL程序,但我不知道如何输出中间结果。 是否有可能使用GLSL进行一些debugging跟踪(如使用printf)?
如何在OpenGL中将图元渲染为线框?
有一些我从来没有明白。 一个像GTA IV这样伟大的大型PC游戏如何使用我的CPU的50%,以60fps的速度运行,而一个旋转的茶壶@ 60fps的DX演示使用高达30%?
我正在阅读一个很棒的OpenGL教程 。 真是太好了,相信我。 我目前的主题是Z缓冲。 除了解释这一切之外,作者还提到我们可以执行自定义的深度testing,比如GL_LESS,GL_ALWAYS等等。他还解释说,深度值的实际意义(也就是顶部而不是)也可以是定制。 我明白迄今为止。 然后作者说了一些不可思议的事情: 范围zNear可以大于范围zFar; 如果是这样的话,则窗口空间值将被颠倒,从观察者的距离最近或最远的angular度来看。 早些时候,有人说,0的窗口空间Z值最接近,1是最远的。 但是,如果我们的剪辑空间Z值被否定,则1的深度将最接近视图,并且0的深度将最远。 然而,如果我们翻转深度testing的方向(GL_LESS到GL_GREATER等),我们得到完全相同的结果。 所以这只是一个惯例。 事实上,翻转Z的标志和深度testing曾经是许多游戏的重要性能优化。 如果我理解正确的话,性能方面,翻转Z的符号和深度testing只不过是改变一个比较。 所以,如果我理解正确并且作者不是在说谎或者做出反应,那么改变< to >曾经是许多游戏的重要优化 。 作者是不是在写东西,是我误解了什么,或者确实是这样,一旦<作者所说的慢(比作者所说的)要严重> ? 感谢澄清这个相当好奇的事情! 免责声明:我完全知道algorithm的复杂性是优化的主要来源。 而且,我怀疑现在肯定不会有什么区别,我也不是要求这个来优化任何东西。 我只是非常,痛苦,也许令人难以置信的好奇。
我用C ++编写了一个OpenGL的模型加载器。 我已经使用std::vector来存储我的顶点数据,但是现在我想把它传递给glBufferData() ,但是数据types是非常不同的。 我想知道是否有一种方法来在std::vector之间转换glBufferData()logging的const GLvoid * 。 顶点types typedef struct { float x, y, z; float nx, ny, nz; float u, v; } Vertex; vector<Vertex> vertices; glBufferData()调用 glBufferData(GL_ARRAY_BUFFER, vertices.size() * 3 * sizeof(float), vertices, GL_STATIC_DRAW); 我得到以下(预期)的错误: error: cannot convert 'std::vector<Vertex>' to 'const GLvoid*' in argument passing 如何将vector转换为与glBufferData()兼容的types? NB。 我现在不关心正确的内存分配。 vertices.size() * 3 * sizeof(float)最有可能是段错误,但我想先解决types错误。
我想从glReadPixels()的animation中获取每个OpenGL帧,并将数据转换为OpenCV :: Mat 。 我知道glReadPixels()从左到右从下到上的行获取数据。 另一方面,OpenCV以不同的方式存储数据。 有没有人知道任何图书馆或任何教程/例子,可以帮助我将数据从glReadPixels转换为C + +中的OpenCV:Mat ? 概要 OpenGL frame ———————–> CV::Mat Data from left to right, Data from left to right, bottom to top. top to bottom.
我只想在平面图像上尝试一些着色器。 结果写了一个C程序,它只是把一张图片作为纹理应用,让我们说一个高斯模糊,作为一个片段着色器并不是那么容易:你必须初始化OpenGL,就像100行代码,然后了解GLBuffers等。另外与窗口系统的沟通还必须使用另一个框架GLUT。 原来,Nvidia的Fxcomposer php很喜欢使用着色器。但我仍然想要一个简单的C或C ++程序,它只是将给定的片段着色器应用于图像并显示结果。 有没有人有一个例子或有框架?
在OpenGL着色语言(GLSL)中谈论凹凸贴图,镜面高光和这些东西, 我有: 顶点数组(例如{0.2,0.5,0.1,0.2,0.4,0.5,…}) 一组法线(例如{0.0,0.0,1.0,0.0,1.0,0.0,…}) 世界空间中点光源的位置(例如{0.0,1.0,-5.0}) 观众在世界空间中的位置(例如{0.0,0.0,0.0})(假设观众处于世界的中心) 现在,我怎样才能计算每个顶点的Binormal和Tangent? 我的意思是,计算二元法的公式是什么,基于这些信息我必须使用什么? 而关于切线? 无论如何,我将构buildTBNmatrix,所以如果你知道一个基于这些信息直接构buildmatrix的公式将是很好的! 哦,是的,我也有纹理坐标,如果需要的话。 就我所说的GLSL而言,每个顶点解决scheme都是很好的,我的意思是,一次不需要访问多个顶点信息。 —-更新—– 我发现这个解决scheme: vec3切线; vec3 binormal; vec3 c1 = cross(a_normal,vec3(0.0,0.0,1.0)); vec3 c2 = cross(a_normal,vec3(0.0,1.0,0.0)); 如果(长度(c1)>长度(c2)) { tangent = c1; } 其他 { tangent = c2; } tangent = normalize(tangent); binormal = cross(v_nglNormal,tangent); binormal = normalize(binormal); 但是我不知道这是否是100%正确的。
如预期,从着色器中的深度缓冲区采样返回值介于0和1之间。 鉴于相机的近平面和远平面,我该如何计算真实的z值,即距相机的距离?