C++ 为什么可以';我找不到我的着色器属性?

C++ 为什么可以';我找不到我的着色器属性?,c++,opengl,attributes,shader,C++,Opengl,Attributes,Shader,我正在创建一个简单的opengl程序。编译并链接着色器程序后,我尝试使用glGetAttriblLocation()检索输入属性,但它返回-1 我编译并链接我的程序,如下所示: GLuint vsID = glCreateShader(GL_VERTEX_SHADER); GLuint fsID = glCreateShader(GL_FRAGMENT_SHADER); char vsSource[] = "#version 330 core\n\ in vec4 position;\ voi

我正在创建一个简单的opengl程序。编译并链接着色器程序后,我尝试使用
glGetAttriblLocation()
检索输入属性,但它返回-1

我编译并链接我的程序,如下所示:

GLuint vsID = glCreateShader(GL_VERTEX_SHADER);
GLuint fsID = glCreateShader(GL_FRAGMENT_SHADER);

char vsSource[] = "#version 330 core\n\
in vec4 position;\
void main(void)\
{\
  gl_Position = position;\
}";

char fsSource[] = "#version 330\n\
out vec4 color;\
void main(void)\
{\ 
  color = vec4(1.0, 0.0, 0.0, 1.0);\
}";

const char *p_vsSrc = &vsSource[0];
const char *p_fsSrc = &fsSource[0];

glShaderSource(vsID, 1, &p_vsSrc, nullptr);
glShaderSource(fsID, 1, &p_fsSrc, nullptr);

glCompileShader(vsID);
glCompileShader(fsID);

//Check shader for errors
GLint vsCompiled = GL_FALSE;
GLint fsCompiled = GL_FALSE;
glGetShaderiv(vsID, GL_COMPILE_STATUS, &vsCompiled);
glGetShaderiv(fsID, GL_COMPILE_STATUS, &fsCompiled);
if (vsCompiled != GL_TRUE)
{
  //Error...
}
if (fsCompiled != GL_TRUE)
{
  //Error...
}

GLuint shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vsID);
glAttachShader(shaderProgram, fsID);
glLinkProgram(shaderProgram);
这可以很好地编译和链接。对
glGetError()
I的任何调用都将返回0

但是,我无法检索
位置的位置

GLuint vPosition = glGetAttribLocation(shaderProgram, "position");
//position == -1

这是为什么?

您必须验证着色器程序是否已正确链接,因为查询链接程序的属性变量的位置。属性(或程序输入)是程序资源,其位置在链接程序时确定:

glLinkProgram( shaderProgram );
GLint status = GL_TRUE;
glGetProgramiv( shaderProgram, GL_LINK_STATUS, &status );
if ( status == GL_FALSE )
{
    GLint logLen;
    glGetProgramiv( shaderProgram, GL_INFO_LOG_LENGTH, &logLen );
    std::vector< char >log( logLen );
    GLsizei written;
    glGetProgramInfoLog( shaderProgram, logLen, &written, log.data() );
    std::cout  << "link error:" << std::endl << log.data() << std::endl;

    .....
}
glLinkProgram(shaderProgram);
闪烁状态=GL_TRUE;
glGetProgramiv(着色器程序、GL链接状态和状态);
如果(状态==GL\U FALSE)
{
闪烁logLen;
glGetProgramiv(着色器程序、GL_信息、LOG_长度和logLen);
标准:向量log(logLen);
葛思哲写的;
glGetProgramInfoLog(shaderProgram,logLen,&write,log.data());

std::cout可能是驱动程序问题,没有将输入属性绑定到location我真的不知道。我一直认为这是对编译器和程序员的提示。进度!这段代码在一个单独的项目中,我正在构建一个静态库并链接到我的应用程序中。当我将这段代码直接放在我的应用程序项目中时,我可以检索我的shad的位置er属性。我需要找出链接时它不起作用的原因…好的,我已经验证了程序链接正确。我仍然无法访问该位置。@Frank调用(在
glGetAttriblLocation
之前)检查程序是否仍然有效(出于调试原因)@Frank如果你在
glLinkProgram
之后立即调用
glIsProgram
,你会得到什么?好的,我在链接之后调用了
glIsProgram
。它返回1(GL_TRUE)并且
glgetattriblation
仍然在
glLinkProgram
之后立即返回-1