OpenGL glAttachShader 1281 错误
Posted
技术标签:
【中文标题】OpenGL glAttachShader 1281 错误【英文标题】:OpenGL glAttachShader 1281 Error 【发布时间】:2018-08-24 02:05:20 【问题描述】:我正在尝试为包含解析顶点着色器和顶点片段的着色器函数的游戏创建 OpenGL 框架。
使用 OpenGL 调用隔离错误并在该行报告错误中断。
#define ASSERT(x) if (!(x)) __debugbreak();
#define GLCall(x) GLClearError();\
x;\
ASSERT(GLLogCall(#x, __FILE__, __LINE__))
当调试报告“[OPENGL Error]: ”时,我在这个代码处得到一个错误:
GLCall(glAttachShader(program, vs));
在这个函数中使用的:
static unsigned int CreateShader(const std::string& vertexShader, const
std::string& fragmentShader)
GLCall(unsigned int program = glCreateProgram());
GLCall(unsigned int vs = CompileShader(GL_VERTEX_SHADER, vertexShader));
GLCall(unsigned int fs = CompileShader(GL_FRAGMENT_SHADER, fragmentShader));
GLCall(glAttachShader(program, vs));
GLCall(glAttachShader(program, fs));
GLCall(glLinkProgram(program));
GLCall(glValidateProgram(program));
GLCall(glDeleteShader(vs));
GLCall(glDeleteShader(fs));
return program;
在控制台窗口上显示:
"Failed to compile shader! vertex"
ERROR: 0:7 'position' : undeclared indentified
ERROR: 0:7 'assign' : cannot convert from 'float' to 'Position 4-component vector of float'"
但是,它仍然会在我的屏幕上生成一个蓝色四边形。
【问题讨论】:
听起来像一个糟糕的着色器。在minimal reproducible example 中编辑。随意使用this 作为基础。 你的问题是,为什么我在着色器没有编译时得到输出?或者为什么我的着色器无法编译?undeclared indentified
:-) 你应该已经复制/粘贴了。它看起来有点……不正宗。
CompileShader
是做什么的?顶点着色器不编译。你会因此删除它吗?如果程序对象或着色器对象无效,glAttachShader
会导致 GL_INVALID_VALUE
(1281) 错误。
您仍然看到蓝色四边形,因为加载了不同的着色器,或者(更有可能)您正在运行兼容性配置文件 OpenGL 上下文,并且正在回退到固定函数管道(本质上是现代 GPU 的一种默认着色器,通过状态设置函数设置的大量遗留 OpenGL 参数进行控制)。
【参考方案1】:
确保在构建代码时正确更新着色器。打开构建目录并查找您正在使用的着色器文件,并确保您对源着色器所做的更改反映在构建版本中。着色器的一个常见错误是它们在文件首次创建时被复制,然后没有更新。
我和你一样关注TheCherno on YouTube 的同一系列,我一直使用 CMake 作为我的构建系统。当我第一次创建它时,它复制了着色器文件,但从那以后就没有了。通过将以下行添加到我的 CMakeLists.txt 中,我确保如果着色器文件有任何更改,CMake 将更新该文件。
configure_file($PROJECT_SOURCE_DIR/res/shaders/shader.shader $PROJECT_BINARY_DIR/res/shaders/shader.shader COPYONLY)
【讨论】:
以上是关于OpenGL glAttachShader 1281 错误的主要内容,如果未能解决你的问题,请参考以下文章