我正在使用OpenGL 4.2,我無法弄清楚爲什麼我在這個程序中得到一個GL_INVALID_VALUE錯誤。我在調用glBindAttribLocation時遇到錯誤。根據OpenGL 4 reference page,爲什麼GL_INVALID_VALUE應該由glBindAttribLocation生成,只有兩個原因。如果指數等於或大於MAX_VERTEX_ATTRIBS更大產生OpenGL 4.2 glBindAttribLocation無效值?
void glBindAttribLocation(GLuint program, GLuint index, const GLchar *name);
- INVALID_VALUE。
- 如果程序不是OpenGL生成的值,則會生成INVALID_VALUE。
正如你可以從下面的程序看,條件1不設置,因爲index
爲20
和GL_MAX_VERTEX_ATTRIBS
是34921
。條件2未被滿足,因爲program
由OpenGL使用glCreateProgram()
生成。那麼我怎麼可能得到一個GL_INVALID_VALUE
錯誤?
// test.cpp
#include <GL/glew.h>
#include <GL/glut.h>
#include <iostream>
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutCreateWindow("Test");
glewInit();
std::cout << "Max Vertex Attributes : " << GL_MAX_VERTEX_ATTRIBS << std::endl;
// create program
GLuint program = glCreateProgram();
if (program == 0)
std::cout << "Program error" << std::endl;
// clear existing errors
if (glGetError() != GL_NO_ERROR)
std::cout << "Pre-existing error" << std::endl;
// bind attribute location to index 20
glBindAttribLocation(program, 20U, "DoesNotExist");
// why is this generating an INVALID_VALUE error?
if (glGetError() == GL_INVALID_VALUE)
std::cout << "Invalid value error" << std::endl;
glDeleteProgram(program);
return 0;
}
端子輸出
$ g++ test.cpp -lGLEW -lglut
$ ./a.out
Max Vertex Attributes : 34921
Invalid value error
而且驗證的OpenGL 4.2
$ glxinfo | grep OpenGL
OpenGL vendor string: NVIDIA Corporation
OpenGL renderer string: GeForce GT 540M/PCIe/SSE2
OpenGL version string: 4.2.0 NVIDIA 304.64
OpenGL shading language version string: 4.20 NVIDIA via Cg compiler
OpenGL extensions:
注意:根據reference page。 「在任何頂點着色器對象綁定到指定的程序對象之前,可以調用glBindAttribLocation,也可以將通用屬性索引綁定到在頂點着色器中從不使用的屬性變量名稱。」所以沒有着色器被加載和DoesNotExist
不存在的事實不是問題。
可能是一個驅動程序錯誤,但爲什麼你這樣做?我沒有看到任何一點......也有4.2你有明確的屬性位置。 – yngccc
這只是一個虛擬程序,用於複製更大程序中的錯誤。我知道在4.2中,我可以在我的着色器中定義屬性位置,但我已經按照綁定位置的方式來構建我的程序是最佳的。此外,這是我的另一臺運行OpenGL 4.2與Nvidia 560 GTX的機器上可重複。我會嘗試更新驅動程序 – jodag