gpt4 book ai didi

c++ - glDrawElements 仅导致 GL_PATCHES 的访问冲突

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:58:45 25 4
gpt4 key购买 nike

我最近一直在研究 glsl 着色器,并且刚刚开始使用花哨的新曲面 segmentation 阶段。有一段时间它工作得很好,然后突然间,砰的一声,它失败了。每当我使用原始参数等运行它时,它就会中断,glDrawElements(GL_PATCHES, numIndicies, GL_UNSIGNED_INT, 0) 在 0x00000054 处存在访问冲突。

我梳理了我的代码,从我所看到的来看,一切都已通过。但问题是,当我将 GL_PATCHES 更改为 GL_TRIANGLES 时,它可以完美运行。当然在禁用曲面 segmentation 控制和评估着色器之后。我也尝试过 glDrawArrays,但仍然因 GL_PATCHES 而失败,所以我相当有信心它与此有关。

目前我在几何着色器中使用基本的曲面 segmentation ,但这很快就过时了。

我正在运行带有 ATI Mobility Radeon HD 5650 的 Windows 7 x64,据我所知,这是最新的驱动程序。它说如果有帮助,异常发生在 atioglxx.dll 的某处。这是一些代码。

GLuint CreateIcosahedron(vec3, unsigned int&);

void DrawScene(){
static unsigned int numindices = 0;
static GLuint vao = CreateIcosahedron(vec3(0,0,0), vec3(1,2,1), numindices);

glBindVertexArray(vao);
glDrawElements(GL_PATCHES, numindices, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
}

GLuint CreateIcosahedron(vec3 center, unsigned int& numindices){
GLuint vaoID;
GLuint vboID;
GLuint iboID;

const int indices[] = {
// indices omitted for your viewing pleasure
};
const vec3 vertices[] = {
// vertices omitted for your viewing pleasure
};

const GLuint uPosition = 0;
numindices = sizeof(indices)/sizeof(indices[0]);

glGenVertexArrays(1, &vaoID);
glBindVertexArray(vaoID);

glGenBuffers(1, &vboID);
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

glVertexAttribPointer(uPosition, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(uPosition);

glGenBuffers(1, &iboID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, iboID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

return vaoID;
}

我做错了什么? :c

最佳答案

我以前见过 glDrawElements 在 VAO 设置不正确时执行此操作。您的初始化代码看起来是正确的,但问题可能是您没有在函数末尾解除绑定(bind)您的 VAO。这意味着对 glBindBuffer 等的任何后续调用都可以更改 VAO 状态。尝试在 CreateIcosahedron() 结束时取消绑定(bind) VAO,看看是否有帮助。

[编辑]如果您的代码看起来与上面发布的完全一样,那么这可能无济于事。看起来你没有取消绑定(bind) VAO,但是你在函数返回后立即绑定(bind)它。为了帮助您缩小问题范围,您应该知道 glDrawElements 的行为会根据调用时是否存在元素数组缓冲区绑定(bind)而发生变化。如果存在数组绑定(bind),则最后一个参数被解释为元素数组中的字节偏移量。否则它被解释为一个指针,我认为这就是你的情况。

关于c++ - glDrawElements 仅导致 GL_PATCHES 的访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13493536/

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