Articles of 索引缓冲区

如何在OpenGL中实现具有纹理坐标的索引缓冲对象(IBO)?

我正在使用IBO在OpenGL中从波前文件(.obj)渲染网格(例如立方体),而没有纹理坐标或法线。 在此之后,我试图实施纹理。 由于索引没有引用正确的顶点,因此网格失真。 纹理坐标和顶点之间有一对一的关系。 因此,通过实现纹理坐标,额外的顶点已被添加到顶点数组/缓冲区(具有相同位置但具有不同纹理坐标的顶点)。 因此,现有的顶点已经被偏移,不再对应于索引数组/缓冲区。 相关的渲染代码: private int vbo; private int ibo; private int size; public Mesh() { vbo = glGenBuffers(); ibo = glGenBuffers(); size = 0; } public void addVertices(Vertex[] vertices, int[] indices) { size = indices.length; glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData(GL_ARRAY_BUFFER, Util.createFlippedBuffer(vertices), GL_STATIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); glBufferData(GL_ELEMENT_ARRAY_BUFFER, Util.createFlippedBuffer(indices), GL_STATIC_DRAW); } public void draw() { glEnableVertexAttribArray(0); […]

关于SharpDx彩色立方体的问题

最近我开始学习SharpDx,所以我是一个新手。 我尝试创建一个在每个顶点具有不同颜色的立方体,例如下面的图片。 但是,我编码后创建的东西,我不明白,如下图。 我已经检查了我的代码很多时间,但仍然无法找出什么是错的。 我希望有人能为我指出。 非常感谢。 听到是我的代码 InitializeDirectX: int width = renderForm.ClientSize.Width; int height = renderForm.ClientSize.Height; Rational rational = new Rational(60, 1); ModeDescription backBufferDesc = new ModeDescription(width, height, rational, Format.R8G8B8A8_UNorm); SwapChainDescription swapchainDesc = new SwapChainDescription { ModeDescription = backBufferDesc, SampleDescription = new SampleDescription(1, 0), Usage = Usage.RenderTargetOutput, BufferCount = 1, OutputHandle = renderForm.Handle, IsWindowed = […]

DirectX11:绘制多个对象

如何使用DrawIndexed()在屏幕上一次绘制多个不同的对象,并使用多个顶点缓冲区? (绘制相同的对象很简单,我不期待实例) …但我正在寻找转换两个不同的顶点缓冲区。 (是的,我正在使用索引顶点)

将波前数据加载到VAO中并进行渲染

我已经成功地将一个三角波前(.obj)加载到6个vector中,前3个vector包含顶点,UV坐标和法线的位置。 最后三个具有为每个面存储的索引。 我一直在考虑使用VAO和VBO来渲染,我不太清楚如何加载和渲染数据。 我最大的担忧之一是索引渲染只允许你有一个索引数组,这意味着我必须使前三个向量的所有大小相同,我想这样做的唯一方法是使3新大小相同的顶点,并加载每个面的数据,但是这将完全破坏索引的目的。 任何帮助,将不胜感激。

OpenGL VAO索引没有正确绘制

我疯了,试图找出为什么我无法使用VAO和索引绘制三角形。 我有一堆的多余的顶点,所以我可以切换我的索引数组来testing绘图。 std::vector<glm::vec3> vertices; //bot left vertices.push_back(glm::vec3(-0.75,0.9,1)); //0 vertices.push_back(glm::vec3(-0.5, 0.9, 1)); //1 vertices.push_back(glm::vec3(-0.25, 0.9, 1)); //2 vertices.push_back(glm::vec3(-0.0, 0.9, 1)); //3 //mid right vertices.push_back(glm::vec3(0.75, 0, 1)); //4 vertices.push_back(glm::vec3(0.5, 0, 1)); //5 vertices.push_back(glm::vec3(0.25, 0, 1)); //6 vertices.push_back(glm::vec3(0.0, 0, 1)); //7 //top left vertices.push_back(glm::vec3(-0.75, -0.9, 1)); //8 vertices.push_back(glm::vec3(-0.5, -0.9, 1)); //9 vertices.push_back(glm::vec3(-0.25, -0.9, 1)); //10 vertices.push_back(glm::vec3(-0.0, -0.9, -1)); […]

碰到glDrawElements

这里是我初始化VAO,顶点属性(也是主要的VBO)和EBO(即时通讯使用我自己的包装类为这些“数据缓冲区”隐藏一些APIfunction,使生活更轻松的代码,所以我不认为这个问题会在没有任何问题的情况下进入generics类) void initVAOManager(const bool& ebo) { if (_vaoID == 0) glGenVertexArrays(1, &_vaoID); glBindVertexArray(_vaoID); /** Here is the main data buffer (positions,colors,UVs) If it doesn´t exist a new one is created **/ if (!_mainBuffer) _mainBuffer = new DataBuffer<T>(GL_ARRAY_BUFFER); _mainBuffer->bindBuffer(); if (!_eboBuffer && ebo) { _eboBuffer = new DataBuffer<eboData>(GL_ELEMENT_ARRAY_BUFFER); _eboBuffer->bindBuffer(); } //This is the position glEnableVertexAttribArray(0); glVertexAttribPointer(0, […]

我怎样才能将我的地形分割成四边形,以便每个四边形都有一个可渲染的顶点/索引缓冲区? (DirectX11,C ++)

我正在创建一个四叉树来将我的地形分块存储,目前有一定程度的实现。 我现在从一个三角形对的网格开始,使正方形和分裂成四边形。 我有我的顶点分成四边形,但我正在努力与指数。 这是我如何生成飞机 snip 这给了我一个索引列表和一个顶点列表。 这是由四叉树分割并分割成不同的顶点列表并存储在不同的节点中。 这工作得很好,顶点似乎是正确的,但是我不知道如何根据整个地形的高度和宽度来创建每个顶点列表的索引。 我将如何为四叉树中的每个节点创建索引列表,还是有更好的方法来做到这一点? 如果我只是使用每个节点的整个索引列表,我会得到奇怪的结果 编辑 :有一个问题,生成我的飞机,我正在解决这个问题,看看它是否能解决我的问题。 编辑 :我已经编辑了主题标题更适合的东西。 我已经解决了与网格生成问题,我正在使用更小的网格来使问题更清楚。 我正在使用2×2网格(9个垂直,24个索引,8个三角形),这个网格被分成4个四边形(每个四边形4个垂直,每个四边形2个三角形),几乎可以工作,只是一个边的一个小问题。 我知道这可能是小规模的复制,但在大规模淘汰时,实际上应该可以节省性能。 任何人都可以发现是怎么回事? 顶点问题? 拆分四边形时,应该用三角形,顶点还是索引? 如果我们用三角形分割并且三角形重叠2个四边形会发生什么(尽管这不应该发生)

从(静态)索引缓冲区读取Direct3D11

早上好, 我有一个使用D3D11_USAGE_DEFAULT和CPUAccessFlags 0创建的Indexbuffer。现在我想从这个缓冲区定期读取数据(这是一个地形索引缓冲区)。 但问题是我不允许从缓冲区中读取数据,因为缓冲区不是用标志D3D11_CPU_ACCESS_READ创建的。 即使我使缓冲区dynamic,我仍然不允许从缓冲区读取。 这是因为CPUAccessFlag D3D11_CPU_ACCESS_READ不允许与使用D3D11_USAGE_DYNAMIC一起使用。 任何人都可以请给我建议如何正确读取Direct3D11中的顶点或索引缓冲区的数据。 在我的情况下,我想经常从它读取数据。

如何绘制非三角网格?

我正在使用DirectX(C#/ C ++)。 我想知道是否有可能不三角网格和案件之间的区别(在加载和渲染代码)? 如果是的话,该怎么做? 我知道DrawIndexed需要设置primitive_topology – 我应该使用哪个值呢? 我总是使用三角网格,没有问题,但它是有趣的.. 谢谢。

是否只能在显示器上显示16k的顶点?

我在riemers.net做了第一个3D教程 ,偶然发现我的显卡只支持Shader 2.0(XNA中的Reach profile),这意味着我只能使用Int16来存储索引 (三角形到顶点)。 这意味着我只能存储2 ^ 16 = 65536个顶点。 另外我在互联网上阅读,你应该更喜欢16位超过32位,因为并不是所有的硬件(如我的)都支持32位。 然而,我想知道:所有的游戏场景是否只有这么小的顶点才能相处? 我虽然已经有人脸上使用了很多多边形(由顶点组成)? 这与我无关,但我感兴趣: 游戏场景只使用65536个顶点吗? 您是否使用一些权衡来显示更多(例如,RAM中的GPU缓冲区中的64k) 有没有办法让GPU缓冲区更多? 我已经阅读了其他一些post,似乎也有每个网格64k的限制,所以也许你可以紧凑的东西网格?