Articles of opengl

计算vertex_normals(vn)会导致难看的线条C ++ / openGL

我试图为我正在进行的一个项目程序化地产生行星。 通过添加噪声到每个顶点,我能够生成海拔,但没有更新我的着色器的顶点法线。 它最初看起来像下面的图片。 当我尝试重新计算顶点法线时,我得到了一些难看的尖锐线条,这很可能是我parsing模型的结果。 这是我用来重新计algorithm线的代码: for (auto &x : normals)x = vec3(0); //zero normals vec3 facenormal; //buffer //indices is the faces/triangles indexed, in pairs of 3. for (size_t i = 0; i<indices.size();) { facenormal = cross( (shape[indices[i + 1]] – shape[indices[i]]), (shape[indices[i + 2]] – shape[indices[i]]) ); normals[indices[i++]] += facenormal; normals[indices[i++]] += facenormal; normals[indices[i++]] += […]

使用glm :: lookAt()创建一个可移动的相机

我碰到这个教程 ,如何使用glm::lookAt(glm::vec3 position, glm::vec3 target, glm::vec3 up)在OpenGL中创建可移动摄像头。 在教程中,为了保持摄像机在移动时始终面向一个方向,视图matrix创建为: view = glm::lookAt(cameraPos, cameraPos + cameraFront, cameraUp); 其中cameraPos,cameraFront和cameraUp都是glm::vec3types。 我想问的是为什么第二个参数必须是cameraPos + cameraFront ? 如果相机的位置向右移动而不改变cameraFront ,那么cameraPos + cameraFront会有向右旋转的效果,而是保持在相同的方向(我认为应该是需要的(?)?任何帮助是赞赏,谢谢!

为什么一个模型可以有不同的顶点和正常大小?

我正在使用TinyObj来加载模型。 我发现许多obj文件有不同的顶点和正常大小,怎么会发生? 我认为在obj文件中一个正常应该对应一个顶点。 例如,我正在加载一个苹果模型,顶点大小为6492,正常大小为6557.如何处理这种情况? 有些文件有更多的顶点,有些有更多的法线。 这是否意味着我必须放弃模型的某些属性? 我也发现obj文件有正常的索引,但我不知道如何使用它。 这个问题是否重要? 在opengl / directx我只使用索引缓冲区中的顶点索引。 你能给我一些想法或参考吗?

如何处理OpenGL和SDL2中的分辨率变化?

如何处理OpenGL和SDL2中的分辨率变化? 假设我有一个固定位置的GUI窗口,所以它会在窗口的右上角,在分辨率改变之后它会处于相同的位置,只是由于分辨率的改变而改变了大小。 如何处理分辨率更改? 我如何将这些变化应用于我的游戏物理? 例如,对于碰撞盒,我是否需要定义一些像resolutionRatio这样的variables,并将其乘以碰撞矩形尺寸?

什么是最好的方式来存储顶点缓冲区对象数据?

到目前为止,我一直在使用vertexData结构来存储顶点缓冲对象(VBO)的数据。 vertexData包含6个顶点(2个三角形)的静态数组。 然后我将它们保存到vertexDatatypes的vector中,最后在缓冲方法中使用这个vertexData : struct vertexData { Vertex vertices[6]; // position, color, UVs }; std::vector<vertexData> _DATA; void SpriteBatch::createVBO() { glBindBuffer(GL_ARRAY_BUFFER,_VBO); glBufferData(GL_ARRAY_BUFFER,_DATA.size()*sizeof(vertexData),nullptr,GL_DYNAMIC_DRAW); glBufferSubData(GL_ARRAY_BUFFER,0,_DATA.size()*sizeof(vertexData),_DATA.data()); glBindBuffer(GL_ARRAY_BUFFER,0); } 这很好,因为我的vector中的所有东西都是连续的。 但是,我想与其他顶点大小,为不同的形状。 我尝试了一个vectortypes的vector ,在oder中使用dynamic分配的数组,但它不起作用,因为它不是连续的。 起初,我想过使用一个多态类作为一个vector存储,其中每个孩子将有一个不同的数组大小; 但后来我认识到,这个顶点缓冲区不适用于指针 第二个想法是创建一个通用的SpriteBatch 。 例如,一个6个顶点的批次,然后是2个顶点的批次等。 什么是最好的方式来存储顶点缓冲区对象数据?

将武器模型与第一人称相机alignment

我使用的工具是: gcc , opengl es 2和glm 。 我正在尝试将武器模型与第一人称相机alignment。 主要的问题是,我似乎无法弄清楚如何利用相机空间和偏移和旋转物体来“ 将武器固定在相机上 ”,这样就像在FPS游戏中一样。 相反,我使用Camera类的成员variables来相应地alignment和旋转武器。 在GDN的帮助下,我创建了这个相机类: #pragma once #include <GLES2/gl2.h> #include "deps/glm/glm.hpp" #include "deps/glm/gtc/matrix_transform.hpp" #define DEFAULT_YAW -90.f #define DEFAULT_PITCH 0.f #define DEFAULT_SPEED 15.f #define DEFAULT_SCROLL_SPEED 0.04f #define DEFAULT_SENSE .24f #define DEFAULT_FOV_Y 45.f #define DEFAULT_RATIO 16.f/9.f #define DEFAULT_NEAR .1f #define DEFAULT_FAR 1024.f #define MIN_FOV 44.3f #define MAX_FOV DEFAULT_FOV_Y #define […]

碰撞检测和边界框创建

我正在尝试创建边界框。 我的目标不是用x,y和z坐标来创建它们。 但是,我会加载一个模型或者渲染一个形状 – 比如飞机。 那么algorithm应该能够在它周围创建有效的边界框。 我在编写opengl。 你能帮我解决吗?

混合多个照明通行证

我正在尝试使用以下代码执行带延迟着色的阴影映射: for (auto light : m_ShadowDirs) { //render shadow map shadowDirPass(m_ShadowBuffer, light); glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE); // activate shader for non shadow casting lights m_ShadowDirLightShader.activate(); m_FrameBuffer.LightingPass(m_ShadowDirLightShader); m_ShadowDirLightShader.setUniform(("WSCamPos"), m_ActiveCamera->getPosition()); m_ShadowDirLightShader.setDirLight(("dirLight"), static_cast<DirLightData&>(light->getLightData())); m_ShadowDirLightShader.setUniform(("ShadowTransform"), m_ShadowDirMatrix); //bind depth map m_ShadowDirLightShader.bindTexture(("shadowMap"),5, m_ShadowBuffer.getDepthTexture()); //render renderQuad(); glDisable(GL_BLEND); } shadowDirPass(m_ShadowBuffer, light); 只需将几何graphics渲染到阴影贴图即可。 m_FrameBuffer.LightingPass(m_ShadowDirLightShader); 只是绑定Gbuffer纹理。 我在场景中有两个方向灯,一个是红色(1,0,0),一个是蓝色(0,0,1) 人们会认为这个场景是紫色的,但是没有。 每次渲染(对于每个)光照时,目标帧缓冲区中的图像会被完全覆盖,而不是混合在一起。 为了说明这一点,请参阅以下图像: 上面是一个红灯的场景。 上面是同一个场景,只有一个蓝色的灯光,但方向不同。 (见阴影)。 当我启用这两个灯光时,结果就好像第一个灯光从未被使用过,尽管通过代码遍历,我可以确认它肯定会经历一个渲染周期。 我敢肯定,我已经搞乱了混合,但我可以使用一些指导。

立方体贴图纹理只适用于顶点位于范围内的对象吗?

我试图纹理一个不是天空盒的.obj文件。 所以问题是,关于立方体贴图的每个教程都会创建其顶点范围为[-1,1]的硬编码立方体。 可能不是,但是有必要将我的.obj模型扩展到这个范围? 此外,为了将我的片段与正确的纹理贴图进行映射 – 我看到有人在线告诉我应该记下一个点,然后用着色器中的模型中心c将其减去。 有人说我应该正常化他们? normalize(p – c)我希望你能帮我提供一个简单的解释。

C ++ glGenBuffers在线程中调用时没有返回正确的VBOID

目前我正在学习如何在C ++中正确使用multithreading,结合OpenGL和GLFW,并且在我的应用程序中遇到了一个奇怪的错误。 我在sidethread中生成了一个程序生成的地形,但是每次我要为生成的地形(块)创建缓冲区时,glGenBuffers()只会将我放入的值给回给我! 它不会创建一个适当的缓冲区。 我甚至用gDEBugger检查过,没有创建VBO。 这里是伪代码: void init(){ //This is in the main thread! sharedWindow = glfwCreateWindow(1, 1, "shared", NULL, NULL); mainWindow = glfwCreateWindow(400, 400, "main", NULL, sharedWindow); glfwMakeContextCurrent(mainWindow); } void terrainGeneratorLoop() { //This is in another thread! glfwMakeContextCurrent(sharedWindow); while(running){ /* Generate vertex data for terrain */ //Upload generated data into GPU: unsigned int m_vbo […]