Articles of 顶点数组

具有平滑度的顶点数组

我正在使用顶点数组来绘制二维几何,但我不能达到平滑。 这是我正在使用的代码: glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glColorPointer(4, GL_UNSIGNED_BYTE, 0, shared_colors); glVertexPointer(3, GL_FLOAT, 0, shared_vertex); glDrawArrays(GL_LINES, 0, shared_counter); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_COLOR_ARRAY); glDisable(GL_BLEND); 一些忠告?

XNA游戏架构,共享对象之间的顶点

我正在练习使用XNA渲染原始图片,我想创建一些类似于管道或隧道的东西。 我有一个名为PipeSegment的基类,我从中inheritance了类RotatingSegment和NormalSegment(以及任何我想象的)。 为了组合这个段,我创建了一个名为Pipe的类,它有PipeSegment对象列表。这就是我到目前为止: 没关系,除了事实上我生成了比必要更多的顶点。 对于每个片段,我为“正面”生成36个顶点,对于“背面”生成36个顶点。 插图: 现在,我的问题。 我怎样才能优化这个,如何产生较less的顶点? 有什么办法来“分享”段之间的顶点来保存我当前的代码结构,并且是适合我的代码结构吗? 谢谢

OpenGL变换反馈输出大小

我正在使用变换反馈来研究一个粒子系统,我想知道是否可以使用变换反馈(OpenGL 3.3)渲染除浮点数以外的任何东西,比如一半。 这将节省一些字节,并可能加快一点点的过程。

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

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

如何结合VAO和着色语言?

我是新手,试图用VAO和GLSL绘制一个非常简单的四分体。 我的定义: typedef struct SPos { float x; float y; } SPos; SPos mVertices[6]; SPos mIndicies[6]; GLuint mVao; GLuint mVertexVbo; GLuint mIbo; 这些是我的步骤: 加载顶点,片段代码(我敢肯定,在这一步没有错误),并获得programID 创建VBO glGenBuffers(1, &mVertexVbo); glBindBuffer(GL_ARRAY_BUFFER, mVertexVbo); glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(SPos), mVertices, GL_STATIC_DRAW); 创建IBO。 mIndices[0] = 0; mIndices[1] = 1; mIndices[2] = 2; mIndices[3] = 3; glGenBuffers(1, &mIbo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mIbo); glBufferData(GL_ELEMENT_ARRAY_BUFFER, 4 * […]

重建Mesh.uv和Mesh.vertices时避免GC

由于统一将不允许用户遍历mesh.uv和mesh.vertices,所以在将一个uvs和顶点数组应用到网格时,我不得不使用GC密集型调用。 我遇到了高GC分配,因为每次我重建一个网格,紫外线和垂直arrays将是一个不同的大小,由于网格被修改。 反过来,这将导致不得不resize或创建新的uv / vert数组,这就是抛弃旧数组或列表时以及应用到网格时垃圾收集成为问题的地方。 示例1 – 列表:例如,为经常构建的网格构建List UVList将需要调用UVList.Add(Vert),这会在List被List.Add重新resize时为GC创建垃圾,因为当列表是resize,它创建一个新的副本,旧的副本进入GC。 此外,将这个列表应用到mesh.uv需要调用UVList.ToArray(); 这是一个讨厌的调用,如果你有一个很长的顶点列表,因为它再次被转换为数组,那么它会创建一个巨大的GC mesh.uv = UVList.ToArray()创建的UVList数组转到GC。 例2数组:我试着使用固定的数组大小,但后来得知,你不能遍历网格的顶点或uv数组。 例如,使用for循环直接将顶点数组应用到mesh.vertices将导致不显示网格(即,对于(i = 0; …){mesh.uv [i] = uvArray [i];}) 如果我不能做到这一点,那么我遇到了与例1相同的问题,因为唯一的办法是每次你想更新你的网格,具有差异/垂直长度时创建新的数组。 调整数组大小需要创建一个新的副本,然后你有与GC相同的问题。 我尝试阅读这个经常更新网格的人处理Unity GC的例子http://gamasutra.com/blogs/RobertZubek/20150504/242572/C_memory_and_performance_tips_for_Unity.php 他并没有真正解释他的辅助方法将UV应用到网格上,而当从他的例子中尝试时,它也导致了GC。 我想我的问题是,我怎么能经常更新一个网格与diff uv /垂直数组大小没有运行GC GC Alloc放慢我的项目?

在游戏引擎中,如何从网格文件中正确获取不同顶点格式的顶点缓冲区?

我是发动机编程的新手。 我有一个如何从网格文件中获取顶点格式的顶点缓冲区的问题。 例如,在OBJ文件或FBX文件中,我们分别保存位置,法线。 所以整个网格文件是不同数组的结构,它们包含顶点的不同属性。 但是,当我们将这些数据提供给显卡时,我们将提供一个顶点结构数组 ,这里的顶点结构包含一个顶点的位置,法线,UV …。 所以,假设我们想从网格文件(数组结构)为不同的着色器生成不同的顶点缓冲区,那么我认为我们可以使用2个解决scheme: 生成不同的结构数组,这里不同的结构将是不同的顶点格式。 问题是:需要大量的内存来保存不同的顶点缓冲区。 生成一个通用的结构数组,这里的结构包含了我们可以从网格文件中获得的所有顶点属性,并使用offset来获得不同顶点格式的正确数据。 问题是:着色器程序访问顶点数据的速度会慢吗? 哪一个是更好的方法? 还是有更好的解决scheme? 再次,我只是一个新鲜的,所以我希望我的描述是足够清楚的问题:-) 非常感谢你!

使用OpenGL Direct State Access进行实例化,stream式传输到VAO VertexBuffer

如何使用直接状态访问stream到顶点缓冲区? 我想每帧更新我的matrix的顶点缓冲区,所以我可以在我的着色器中使用它。 这是我如何指定我的缓冲区。 我在我的应用程序中做了一次,当我初始化我的VAO。 glNamedBufferStorage(StaticModelData::instanceDataID, sizeof(InstanceData)*10, nullptr, 0); glMapNamedBufferRange(StaticModelData::instanceDataID, 0, sizeof(InstanceData) * 10, GL_MAP_UNSYNCHRONIZED_BIT); glVertexArrayVertexBuffer(StaticModelData::vaoID, 1, StaticModelData::instanceDataID, 0, 0); glVertexArrayAttribBinding(StaticModelData::vaoID, 3, 1); glVertexArrayAttribFormat(StaticModelData::vaoID, 3, 4, GL_FLOAT, GL_FALSE, 0); glVertexArrayAttribBinding(StaticModelData::vaoID, 4, 1); glVertexArrayAttribFormat(StaticModelData::vaoID, 4, 4, GL_FLOAT, GL_FALSE, sizeof(float) * 4); glVertexArrayAttribBinding(StaticModelData::vaoID, 5, 1); glVertexArrayAttribFormat(StaticModelData::vaoID, 5, 4, GL_FLOAT, GL_FALSE, sizeof(float) * 8); glVertexArrayAttribBinding(StaticModelData::vaoID, 6, 1); glVertexArrayAttribFormat(StaticModelData::vaoID, 6, […]

与VBO照明

介绍 我使用的是一个名为processing.org的Java JOGL包装器,而且我已经编写了一些环境,即使它有一些库函数(我不知道任何关于它的情况)(== LIGHTS),我也很自豪。 现在,对于某些几何体,我决定使用VBO。 我不得不艰难地通过并重新编码所有的灯。 但是我不能达到同样的结果。 有了这个环境,如果我使用标准灯我得到这个结果: 这个环境包装了opengl函数,我无法理解纯OPENGL调用。 我知道processing.org环境中的标准光源代码是: public void lights() { enableLighting(); // need to make sure colorMode is RGB 255 here int colorModeSaved = colorMode; colorMode = RGB; lightFalloff(1, 0, 0); lightSpecular(0, 0, 0); ambientLight(colorModeX * 0.5f, colorModeY * 0.5f, colorModeZ * 0.5f); directionalLight(colorModeX * 0.5f, colorModeY * 0.5f, colorModeZ * […]

将即时绘图函数重构为VBO,访问冲突错误

我有一个MD2模型加载器,我试图用一个顶点缓冲对象replace它的即时绘图function…. 我得到一个非常恼人的访问违规读取错误,我不明白为什么,但主要是我想看看这是否看起来是正确的(以前从未使用VBOs)。 这是计算关键帧并同时绘制的原始函数(即编译好的): glBegin(GL_TRIANGLES); for(int i = 0; i < numTriangles; i++) { MD2Triangle* triangle = triangles + i; for(int j = 0; j < 3; j++) { MD2Vertex* v1 = frame1->vertices + triangle->vertices[j]; MD2Vertex* v2 = frame2->vertices + triangle->vertices[j]; Vec3f pos = v1->pos * (1 – frac) + v2->pos * frac; Vec3f normal = […]