为啥找不到我的着色器属性?

Posted

技术标签:

【中文标题】为啥找不到我的着色器属性?【英文标题】:Why can't I find my shader attributes?为什么找不到我的着色器属性? 【发布时间】:2018-05-26 08:05:26 【问题描述】:

我正在创建一个简单的 opengl 程序。编译并链接我的着色器程序后,我尝试使用 glGetAttribLocation() 检索输入属性,但它返回 -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() 的任何调用都返回 0。

但是我无法检索position的位置:

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

这是为什么?

【问题讨论】:

可能是驱动问题,没有将输入属性绑定到位置 我真的不知道。我一直认为这是对编译器和程序员的提示。 进步!此代码位于我正在构建为静态库并链接到我的应用程序的单独项目中。当我将此代码直接放在我的应用程序项目中时,我可以检索我的着色器属性的位置。我需要找出为什么当我链接它时它不起作用...... 【参考方案1】:

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

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;

    .....

【讨论】:

好的,我已经验证了正确链接的程序。我仍然无法访问该职位。 @Frank 调用glIsProgram(在glGetAttribLocation之前)检查程序是否仍然有效(出于调试原因)。 @Frank 如果你在glGetAttribLocation 之后紧跟glLinkProgram,你会得到什么? 好的,我在链接后打电话给glIsProgram。它返回 1 (GL_TRUE) 同样glGetAttribLocation 仍然在glLinkProgram 之后立即返回-1

以上是关于为啥找不到我的着色器属性?的主要内容,如果未能解决你的问题,请参考以下文章

通过顶点属性指针将颜色坐标传递到顶点着色器

为啥我的着色器中的 GLSL 纹理坐标不是线性的?

为啥片段着色器没有附加?

OpenGL:为啥我不能将单个浮点数从顶点着色器传递到片段着色器?

为啥 OSX Mavericks 不能编译我的 GLSL 着色器?

为啥我的 Ray March 片段着色器反射纹理查找会减慢我的帧速率?