glDrawElements只会导致与GL_PATCHES的访问冲突
glDrawElements causes access violation with GL_PATCHES only
我最近一直在摆弄glsl着色器,刚刚开始了一个奇特的新镶嵌阶段。它完美地工作了一段时间,然后突然,砰,它失败了。每当我用原始参数运行它时,它就会中断,在0x00000054处具有访问冲突的glDrawElements(GL_PATCHES, numIndicies, GL_UNSIGNED_INT, 0)
。
我已经梳理了我的代码,从我所看到的来看,一切都很顺利。但问题是,当我将GL_PATCHES
更改为GL_TRIANGLES
时,它可以完美地工作。当然,在禁用镶嵌控制和eval着色器之后。我也尝试过glDrawArrays
,但GL_PATCHES
仍然失败,所以我很有信心这与此有关。
目前,我在几何着色器中使用基本的镶嵌,但这很快就会过时。
我运行的是带有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设置不正确时会这样做。您的初始化代码看起来是正确的,但问题可能是您没有在函数结束时解除VAO的绑定。这意味着对glBindBuffer等的任何后续调用都可以更改VAO状态。尝试在CreateIcosahedron()结束时解除VAO的绑定,看看这是否有帮助。
[编辑]如果你的代码看起来和你上面发布的一模一样,那么这可能不会有帮助。似乎您没有解除VAO的绑定,但在函数返回后立即进行绑定。为了帮助您缩小问题范围,您应该知道glDrawElements的行为会随着调用时是否有元素数组缓冲区绑定而变化。如果有数组绑定,最后一个参数将被解释为元素数组中的字节偏移量。否则,它被解释为一个指针,我认为这就是你的情况。
- 写入位置0x0000000C时发生访问冲突
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 链表中写入访问冲突的未知原因
- C++中的openCV Mat访问冲突
- C++尝试深度复制唯一指针时出现内存访问冲突
- C++ 中动态二维数组的访问冲突
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 写入访问冲突异常
- 在类 12.exe 中0x7B37FF80 (ucrtbased.dll) 引发异常: 0xC0000005:访问冲突读
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- 读取访问冲突.这0xCDCDCDCD
- 0xC0000005:访问冲突读取位置 0x00000000. 重载 == 运算符的问题
- 插入数组时违反写访问冲突
- 使用 ReadProcessMemory 获取字符串值的访问冲突
- 尝试通过共享指针使用变量时读取访问冲突
- 堆栈上的 C++ 访问冲突写入异常
- 引发异常:写访问冲突. temp 为 nullptr
- 将静态字符数组中的字符分配给动态分配的字符数组 - 访问冲突
- 在C++中删除双向链表的头节点后出现访问冲突异常
- C++ 读取访问冲突,0xCDCDCDCD