草庐IT

c++ - 模型在窗口调整 OpenGL 3.2 大小时拉伸(stretch)

我已经设置了一个包含OpenGL3.2渲染上下文的窗口(在MFC中)。因为它与OpenGL3.2一起使用,所以我想使用着色器等,所以我手动构建投影和View矩阵。我用过this教程作为构建它们并将它们传递给我的着色器的输入。现在的问题是(即使在教程的示例中)当我调整窗口大小时,模型被拉伸(stretch)。这是我用来构建矩阵的代码(我重建它们并在每次刷新窗口时将它们发送到我的着色器)。查看矩阵:floatzAxis[3],xAxis[3],yAxis[3];floatlength,result1,result2,result3;//zAxis=normal(lookAt-positio

c++ - 写入 OpenGL 模板缓冲区

我一直在阅读OpenGL中的模板缓冲区。基本概念是有道理的;只有在与模板缓冲区中的值按位与运算后满足特定条件时,才会绘制片段。但是我不明白的一件事是你实际上是如何写入模板缓冲区的。是否有我在这里缺少的功能?附言当我说写入时,我的意思是在模板缓冲区中指定特定的值。 最佳答案 没有人回答这个问题,这是一个有效的问题,所以一年多后,这里是您问题的答案。stencilbuffer理论上和backbuffer、depthbuffer一样是一个缓冲区。他们三个被同时写入(启用时)。您可以通过特定调用启用/禁用写入它们:glColorMask(r

c++ - 如何找到鼠标单击和 3D 网格的交集?

在我的程序中,我正在加载3D网格以进行查看和交互。用户可以旋转和缩放View。我将使用旋转矩阵进行旋转并调用multmatrix来旋转View,并使用glScalef进行缩放。用户还可以绘制网格,这就是为什么我需要平移鼠标坐标以查看它是否与网格相交。我读过http://www.opengl.org/resources/faq/technical/selection.htm以及我在近平面和远平面上使用gluUnproject并进行减法的方法,我取得了一些成功,但只有当gluLookAt的位置为(0,0,z)时,其中z可以是任何合理的数字。当我移动位置说(0,1,z)时,它变得困惑并返回一

c++ - OpenGL:顶点索引缓冲区的问题

我刚开始使用VBO,除了顶点索引缓冲区外,一切似乎都很好。如果我在启用索引缓冲区后调用glDrawElements,我会收到访问冲突错误(找不到索引),如果我只是用指向内存中索引数组开头的指针调用它,它就可以工作..//DOESN'TWORKglBindBuffer(GL_ELEMENT_ARRAY_BUFFER,indices);glDrawElements(GL_TRIANGLES,stripIndices.size(),GL_UNSIGNED_INT,0);//WORKSglDrawElements(GL_TRIANGLES,stripIndices.size(),GL_UNSI

c++ - 尝试在 OpenGL/SFML 中实现鼠标外观 "camera"

我将OpenGL与SFML1.6结合使用已有一段时间了,效果非常好!除了一个异常(exception):我似乎无法正确实现相机类。你看,我正在尝试创建一个名为“Camera”的C++类。这是我的功能:Camera::Strafe(floatfSpeed)检查是否按下了WASD键,如果是,则以“fSpeed”向各自的方向移动相机。Camera::MouseMove(intcurrentX,intcurrentY)应提供第一人称鼠标外观,采用当前鼠标坐标并相应地旋转相机。我的Strafe()实现工作正常,但我似乎无法正确使用MouseMove()。通过阅读有关OpenGL鼠标外观实现的其他

c++ - glGetUniformLocation OpenGL ES 2.0 (ipad 3 iOS 7.0.3 返回结果错误)

这是我的顶点着色器:attributevec4a_position;uniformmat4u_projection;uniformvec4u_origin_translation;uniformvec4u_translation;attributevec2a_texCoord;varyingvec2v_texCoord;uniformvec4u_color;varyingvec4v_color;attributevec4a_color;voidmain(){vec4pos=a_position+u_origin_translation+u_translation;gl_Position

c++ - GLSL 中光线行进曲面的实现

我一直在阅读很多关于GLSL着色器中光线行进的文章(例如这篇文章:http://www.iquilezles.org/www/articles/rmshadows/rmshadows.htm),其中提出了一些我想问的问题。在我的应用程序中,我正在渲染一个带有几个网格的场景,我想尝试使用阴影。虽然我似乎有点理解raymarching如何工作的概念,但我不太了解如何在GLSL中正确实现它。我知道如何计算光线和平面的交点,但如何通过GLSL着色器处理它?根据此处的此线程:(https://gamedev.stackexchange.com/questions/67719/how-do-ray

c++ - 相同的着色器在 Nvidia 和 ATI 卡上表现不同

我和一个friend正在开发一个编辑器(类似CAD)以用于我们future的游戏。我们正在使用Qt框架和OpenGL。我们遇到的问题是,在他的带有集成nVidia卡的笔记本电脑上,阴影按预期工作并且渲染良好。在我的带有集成ATI卡的笔记本电脑上,以及在我的带有RadeonHD5850的台式机上,phong照明的行为略有不同。有更多的亮点和暗点,图像看起来不太好。此外,我们正在使用卡通着色器在边缘绘制轮廓并限制颜色可以具有的阴影量。卡通着色器使用2-pass渲染-第一个pass渲染对象为黑色,比原始对象稍大(在其法线方向稍微移动每个顶点)以制作轮廓,然后第二个pass正常渲染对象(仅限制

c++ - 三角剖分 3D 算法

我在3D空间中有数千个多边形,其中包含超过3个顶点。我想将每个多边形划分为一组三角形。我一直在整个互联网上寻找,但我找不到任何3D算法可以做到这一点。我发现许多算法都适用于2D,例如earclipping和Delaunaytriangulation。但是我找不到任何3D算法。我在这个网站上看到许多相同的问题,它们的回答是“使用Delaunay三角剖分算法”。但我看到这个算法是针对二维的:http://www.geom.uiuc.edu/~samuelp/del_project.htmlImplementanalgorithmforfindingtheconstrainedDelauna

c++ - 不破坏上下文的常见 OpenGL 清理操作

最近,我一直在为我的实时程序做屏幕外GPU加速。我想创建一个上下文并多次重复使用它(100+)。我正在使用OpenGL2.1和GLSL1.20版。每次重用上下文时,我都会做以下事情:编译shaders,链接program然后glUsePrograme(问题1:我应该重新链接program还是重新链接program?每次都创建程序?)生成FBO和Texture,然后绑定(bind)它们以便进行离屏渲染。(问题2:我应该销毁那些FBO和Texture)生成GL_Array_BUFFER并将一些顶点数据放入其中。(问题3:我什至需要清洁这个吗?)glDrawArraybluhbluh...调