在我的程序中,我基本上把所有对象都放在一个缓冲区中,现在当我想要绘制多个对象时遇到了问题,如果我只绘制一个,它仍然可以工作。
当我把所有gldrawarrays
调用修改为gldrawelements
调用,当然还有所有底层基础结构时,问题就开始出现了。
到现在为止,我只是做了一个从顶点到索引的一对一映射。
我使用的是Java 8,LWJGL和OpenGL 3.3。
初始化:
//drawable vertex buffer
vertexBuffer = new StaticDrawArrayBuffer().create().bind().fillData(Drawable.putAllVertexData(drawables));
vertexArray = new VertexArrayObject().create().bind()
.setAttribute(vertexBuffer, VS_POSITION, 3, GL_FLOAT, false, 0, 0)
.enableAttributes(VS_POSITION);
//drawable elements buffer
elementBuffer = new StaticDrawElementArrayBuffer().create().bind().fillData(Drawable.putAllElementsData(drawables));
所以我做了以下操作:
array_buffer
并将所有顶点数据存储在其中。位置
数据的位置。element_array_buffer
并将所有索引存储在其中。内容如下;
顶点数据:
-400.0
0.0
-400.0
-400.0
0.0
400.0
400.0
0.0
-400.0
-400.0
0.0
400.0
400.0
0.0
-400.0
400.0
0.0
400.0
1.0
1.0
-1.0
-1.0
1.0
-1.0
-1.0
1.0
1.0
-1.0
1.0
1.0
1.0
1.0
1.0
1.0
1.0
-1.0
1.0
-1.0
-1.0
-1.0
-1.0
-1.0
-1.0
-1.0
1.0
-1.0
-1.0
1.0
1.0
-1.0
1.0
1.0
-1.0
-1.0
-1.0
1.0
-1.0
-1.0
-1.0
-1.0
-1.0
-1.0
1.0
-1.0
-1.0
1.0
-1.0
1.0
1.0
-1.0
1.0
-1.0
-1.0
1.0
1.0
-1.0
-1.0
1.0
1.0
-1.0
1.0
1.0
-1.0
1.0
1.0
1.0
1.0
-1.0
1.0
1.0
1.0
1.0
1.0
1.0
-1.0
1.0
1.0
-1.0
-1.0
1.0
-1.0
-1.0
1.0
1.0
-1.0
1.0
1.0
1.0
1.0
1.0
-1.0
1.0
-1.0
-1.0
-1.0
-1.0
-1.0
-1.0
-1.0
-1.0
-1.0
1.0
-1.0
1.0
1.0
-1.0
索引数据:
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
因此,这是126个浮点,它应该被(x,y,z)
映射到42个索引。
但是,当我随后执行以下调用时:
gl.glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0)
gl.glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 6)
这些对象被绘制成相互混合的,而不是它们应该看起来的样子,我认为代码会做的是;
有什么可能的原因导致这不起作用?
glDrawElements最后一个参数曾是指向索引数组的指针。在VBOs中,该参数作为字节大小的偏移量被重用到VBO中。因此,它不需要索引,而是将一个字节偏移到VBO的数据起始位置。在您的示例中,这将是sizeof(GLfloat)*x
,其中sizeof(GLfloat)
通常为4。因此,必须将特定的数据布局相乘,必须将偏移量索引乘以4,得到字节偏移量。
问题内容: 我已经为此奋斗了2天,尽我所能用Google搜索和stackoverflow,但是我无法解决。 我正在构建一个简单的节点应用程序(+ Express + Mongoose),其登录页面重定向到主页。这是我的服务器JS代码: 登录页面向发出POST请求,在此验证发布的数据。这可行。我可以在Node控制台中看到“我们在这里:’/ credentials’”。 然后是问题:res.redir
问题内容: 根据JavaDoc for ,该函数在比较期间不考虑比例。 现在,我有一个测试用例,看起来像这样: 我希望函数返回的值是10,小数位数为10。打印该值可显示预期的结果。但是该功能似乎并未按照我认为的方式工作。 这里发生了什么? 问题答案: 并 没有 代表0.7。 它代表0.69999999999999999999555910790149937383830547332763671875(
问题内容: 我是否错过了明显痛苦的事情?还是世界上没有人真正使用java.util.BitSet? 以下测试失败: 我真的不清楚,为什么我没有得到长度为2的BitSet和值为10的结果。我偷看了java.util.BitSet的源代码,并且在随意检查时似乎无法对两者进行足够的区分。设置为false且从未设置为任何值… (请注意,在构造函数中显式设置BitSet的大小无效,例如: 问题答案: 人们确
问题内容: 以下Dockerfile: 具有输出: 构建时(docker build命令) 看来RUN cd tmp123没有任何作用 为什么呢? 问题答案: 实际上是预期的。 泊坞窗文件不过是docker run + docker commit的包装器。 与做相同的事情: 每次运行时,都会生成一个新容器,因此pwd为’/’。 如果您愿意,可以在github上打开一个问题,以便向Dockerfil
我试着将一个双精度值四舍五入到小数点后两位: var x=0.68999995 var roundX=round(x*100.0)/100.0 println(roundX)//打印0.69 如果打印值是正确的...但var值不是我期望的,继续0.68999999999999995 我需要双值...不像其他StackOverflow答案那样字符串:(
问题内容: 当使用带点名的名称时,例如:,返回的模块不是,返回的内容几乎都是空的!这里发生了什么? 问题答案: 从python文档上: … 当name变量的形式为package.module时,通常返回顶级包(名称直到第一个点),而不是按名称命名的模块。但是,当给出非空的fromlist参数时,将返回按名称命名的模块。这样做是为了与为不同种类的import语句生成的字节码兼容。使用“ import