c++ - 为什么找不到我的着色器属性?
问题描述
我正在创建一个简单的 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
为什么是这样?
解决方案
您必须验证着色器程序是否已正确链接,因为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;
.....
}
推荐阅读
- python - 如何在 python 中用方形单元格显示网格?
- javascript - 如何将数据库数据放入数组Vue.js
- angular - Visual Studio CODE for Angular CLI 版本 9.1.1 中的 angular.json 错误中的“属性不允许”
- flutter - 我在颤动中显示网格视图有问题
- django - 将熊猫上传到 django 视图时读取文件时出现问题
- c# - 如何在构建 XDocument 时执行 LINQ 查询?
- c - 什么时候为内核空间中的打开文件创建`struct file*`?
- c# - 检查对象的壁橱继承到声明的类型
- c++ - 如何从前序遍历中列出二叉搜索树中每个节点的子节点?
- python - 在 python 中编写一个不和谐的机器人