gpt4 book ai didi

c++ - 自动生成的顶点缓冲区和索引缓冲区不工作

转载 作者:行者123 更新时间:2023-11-30 04:51:19 26 4
gpt4 key购买 nike

简而言之,我在 C++ 中创建了一个函数,用于根据顶点 vector 为我创建一个顶点缓冲区数组和一个索引缓冲区数组,即如果您在顶点 vector 中输入 4 个点,该函数理论上应该返回 2 个数组在顶点缓冲区和索引缓冲区中使用。然而,这就是问题所在。在函数返回数组、初始化缓冲区并调用 glDrawElements 之后,仅绘制构成正方形的 2 个(对于正方形)三角形之一。我很困惑为什么。

这是代码,

定义函数返回内容的结构:

struct ResultDataBuffer {
std::vector<float> positions;
std::vector<unsigned int> indices;
unsigned int psize;
unsigned int isize;
unsigned int bpsize;
unsigned int bisize;
};
//positions and indices are the vectors for the buffers (to be converted to arrays)
//psize and isize are the sizes of the vectors
//bpsize and bisize are the byte size of the vectors (i.e. sizeof())

函数本身:

static ResultDataBuffer CalculateBuffers(std::vector<float> vertixes) {
std::vector<float> positions = vertixes;
std::vector<unsigned int> indices;
int length = vertixes.size();
int l = length / 2;
int i = 0;
while (i < l - 2) { //The logic for the index buffer array. If the length of the vertexes is l, this array(vector here) should be 0,1,2 , 0,2,3 ... 0,l-2,l-1
i += 1;
indices.push_back(0);
indices.push_back(i + 1);
indices.push_back(i + 2);
}
return{ vertixes,indices, positions.size(), indices.size(), sizeof(float)*positions.size(), sizeof(unsigned int)*indices.size() };

}

主函数中的代码(缓冲区和东西的定义):

    std::vector<float> vertixes = {
-0.5f, -0.5f,
0.5f, -0.5f,
0.5f, 0.5f,
-0.5f, 0.5f,
};

ResultDataBuffer rdb = CalculateBuffers(vertixes);
float* positions = rdb.positions.data(); //Convert vector into array
unsigned int* indices = rdb.indices.data(); //Ditto above

unsigned int buffer;
glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, rdb.bpsize, positions, GL_STATIC_DRAW);

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0);

unsigned int ibo;
glGenBuffers(1, &ibo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, rdb.bisize, indices, GL_STATIC_DRAW);

主函数中的内容(在游戏循环中):

glDrawElements(GL_TRIANGLES, rdb.isize, GL_UNSIGNED_INT, nullptr);

对于这篇文章的篇幅,我深表歉意,我试图缩短它。

C++ 完整代码:https://pastebin.com/ZGLSQm3b

着色器代码(位于/res/shaders/Basic.shader):https://pastebin.com/C1ahVUD9

总而言之,这段代码没有绘制正方形 - 2 个三角形,而是只绘制了一个三角形。

最佳答案

问题是由生成索引数组的循环引起的:

while (i < l - 2) { 
i += 1;
indices.push_back(0);
indices.push_back(i + 1);
indices.push_back(i + 2);
}

这个循环生成索引

0, 2, 3, 0, 3, 4

但是你必须生成索引

0, 1, 2, 0, 2, 3

这是原因,因为控制变量在索引附加到 vector 之前递增。
在循环结束时增加控制变量,解决问题:

while (i < l - 2) { 
indices.push_back(0);
indices.push_back(i + 1);
indices.push_back(i + 2);
i += 1;
}

或者使用for循环:

for (unsigned int i = 0; i < l-2; ++ i)
{
unsigned int t[]{ 0, i+1, i+2 };
indices.insert(indices.end(), t, t+3);
}

关于c++ - 自动生成的顶点缓冲区和索引缓冲区不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54842290/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com