Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGl顶点属性指针奇怪的行为_Opengl_Graphics - Fatal编程技术网

OpenGl顶点属性指针奇怪的行为

OpenGl顶点属性指针奇怪的行为,opengl,graphics,Opengl,Graphics,在我把显卡从AMD换成AMD后,我有一些非常奇怪的行为。我在着色器程序中使用了两个单独的顶点属性布局。首先,我有: layout (location = 0) in vec3 inPosition; layout (location = 1) in vec3 inNormal; layout (location = 2) in vec2 inTexCoords; 我将attrib指针设置为: glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 *

在我把显卡从AMD换成AMD后,我有一些非常奇怪的行为。我在着色器程序中使用了两个单独的顶点属性布局。首先,我有:

layout (location = 0) in vec3 inPosition;
layout (location = 1) in vec3 inNormal;
layout (location = 2) in vec2 inTexCoords;
我将attrib指针设置为:

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)nullptr);
glEnableVertexAttribArray(0);

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));
glEnableVertexAttribArray(1);

glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));
glEnableVertexAttribArray(2);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)nullptr);
glEnableVertexAttribArray(0);

glVertexAttribIPointer(1, 1, GL_INT, 5 * sizeof(float), (void*) (4 * sizeof(float)));
glEnableVertexAttribArray(1);
然后,我有另一个顶点属性布局,在着色器中看起来像这样:

layout (location = 0) in vec4 inPosAndCoords;
layout (location = 1) in int inColour;
我将属性指针设置为:

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)nullptr);
glEnableVertexAttribArray(0);

glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float)));
glEnableVertexAttribArray(1);

glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));
glEnableVertexAttribArray(2);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)nullptr);
glEnableVertexAttribArray(0);

glVertexAttribIPointer(1, 1, GL_INT, 5 * sizeof(float), (void*) (4 * sizeof(float)));
glEnableVertexAttribArray(1);
所以问题是,在我的nVidia GTX 980和Intel integrated graphics上,我会像上面一样从3属性布局切换到2属性布局,一切正常。然而,由于我安装了Radeon RX570,我在atio6axx.dll上引发了一个异常,访问冲突读取位置

我有几种方法可以解决这个问题。我可以:

glDisableVertexAttribArray(2);
或者将索引2(第三个属性)的VertexAttributePointer设置为看似无关紧要的值,例如:

glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float)));
由于从3属性布局切换到2属性布局似乎与nVidia和Intel一起工作,而不是与此Radeon卡一起工作,因此我认为这种行为是此卡的一个怪癖

我使用相同的VAO,绑定不同的VBO,然后设置glVertexAttributePointer和GlenableVertexAttributeArray

这里有人问了一个类似的问题,但在我的例子中,如果我不禁用第三个属性(索引2),只要我为索引2调用glvertexattributepointer,它就会起作用。我对正确的流程感到困惑

由于从3属性布局切换到2属性布局似乎与nVidia和Intel一起工作,而不是与此Radeon卡一起工作,因此我认为这种行为是此卡的一个怪癖


OpenGL规范不支持这一结论。如果访问
i
-th顶点索引,GL可能会访问每个启用顶点数组的
i
-th元素。如果没有指向有效的位置,您将得到未定义的行为。在Nvidia上工作是偶然的,英特尔并没有改变这一切。只需为未提供有效数据的属性禁用顶点属性数组。

如果这些对象使用的是这种不同的顶点格式,则它们应该使用不同的VAO。