OpenGL- glDrawElements只绘制第一个元素
OpenGL- glDrawElements only draws first element
大家好,我正在为我的游戏制作一个小的3D引擎,并为顶点数组和VBO创建了一个类。它一直在工作,直到我尝试将索引添加到顶点数组。现在它只绘制索引的第一个元素!
这是生成 VAO 和 VBO 的函数构建。
void build() {
vboID = new GLuint[vboS];
if (vertexIndexing) {
for (int n = 0, m = 0, i = 0; n < vertexes.size(); m++) {
if (i + m >= vertexes.size()) {
break;
}
indices.push_back((GLushort)(i+m));
if (m >= s) {
m = 0;
n++;
i+=s/2;
std::cout << "n";
}
std::cout << i + m << " , ";
}
std::cout << "n";
}
shader->use();
glGenVertexArrays(1, &vaoID);
glBindVertexArray(vaoID);
glGenBuffers(vboS, vboID);
if (vertexIndexing) {
glGenBuffers(1, &IBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(GLushort), &indices[0], GL_STATIC_DRAW);
}
int n = 0;
if (options.vertex) {
shader->addAttribute("vertex");
glBindBuffer(GL_ARRAY_BUFFER, vboID[n]);
glBufferData(GL_ARRAY_BUFFER, pos.size() * sizeof(GLfloat), &pos[0], GL_STATIC_DRAW);
glVertexAttribPointer(shader->attribute("vertex"), 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(shader->attribute("vertex"));
n++;
}
if (options.color) {
shader->addAttribute("color");
glBindBuffer(GL_ARRAY_BUFFER, vboID[n]);
glBufferData(GL_ARRAY_BUFFER, colors.size() * sizeof(GLfloat), &colors[0], GL_STATIC_DRAW);
glVertexAttribPointer(shader->attribute("color"), 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(shader->attribute("color"));
n++;
}
if (options.normal) {
shader->addAttribute("normal");
glBindBuffer(GL_ARRAY_BUFFER, vboID[n]);
glBufferData(GL_ARRAY_BUFFER, normals.size() * sizeof(GLfloat), &normals[0], GL_STATIC_DRAW);
glVertexAttribPointer(shader->attribute("normal"), 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(shader->attribute("normal"));
n++;
}
if (options.texcoord) {
shader->addAttribute("texcoord");
glBindBuffer(GL_ARRAY_BUFFER, vboID[n]);
glBufferData(GL_ARRAY_BUFFER, texcoords.size() * sizeof(GLfloat), &texcoords[0], GL_STATIC_DRAW);
glVertexAttribPointer(shader->attribute("texcoord"), 2, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(shader->attribute("texcoord"));
n++;
}
glBindVertexArray(0);
shader->disable();
}
这是函数绘制,绘制 VAO。
void draw() {
glBindVertexArray(vaoID);
if (vertexIndexing) {
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
shader->use();
glDrawElements(mode, indices.size(), GL_UNSIGNED_SHORT, 0);
shader->disable();
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
else {
shader->use();
glDrawArrays(mode, 0, vertexes.size());
shader->disable();
}
glBindVertexArray(0);
}
注意:我删除了glEnableClientState(GL_VERTEX_ARRAY(,因为它没有做任何事情。
好的,我修复了它。这不是openGL的问题。这是与指数生成。
新指数生成:
for (int n = 0, m = 0, i = 0; n < vertexes.size(); m++) {
if (i + m >= vertexes.size()) {
break;
}
if (m >= s) {
m = 0;
n++;
i+=s/2;
}
indices.push_back((GLushort)(i + m));
}
相关文章:
- 如何实现 Front() 方法以返回模板化双向链表C++的第一个元素?
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- C++ queue.front();为什么不从第一个元素开始呢?
- 指向数组基址的指针而不是指向第一个元素的指针有什么优点?
- 静态堆栈函数不会 1) 输入第一个元素 2)添加新元素时识别旧元素
- 从队列中删除第一个元素C++
- 如果第一个元素包含任何零,则我的程序以不希望的方式运行
- 为什么数组不打印第一个元素?
- 在数组中显示第一个元素用户输入
- 消除集合的第一个元素
- 为什么指向矢量第一个元素的指针会丢失?
- 如何打印出常量字符串的第一个元素?
- 读取数组的第一个元素还是第 4000 个元素更快?
- 如何在数组的一部分中查找特定值的第一个元素
- 对数组进行排序的算法,先是第一个元素,然后是前 2 个元素,然后是前 3 个元素,依此类推
- 访问指向对象指针向量的指针的第一个元素?
- 引用保留向量中的第一个元素
- 指向数组的指针是否应该等于指向其第一个元素的指针?
- 尝试将参数包的第一个元素作为函数调用,并将包的其余部分作为参数传递给它
- 代码是否有效.如果我想显示第一个元素?如果不是,那么 s.begin() 会返回什么?