OpenGL 着色器不与着色器程序链接
OpenGL shaders don't link with shader program
我正在尝试使用 GLFW/GLEW 添加着色器。
我收到一个错误,指出着色器已加载,但它们没有有效的目标代码。
这是我用于加载着色器的代码:
class SHADER {
public:
void LoadShaders(const char *vertexFile, const char *fragmentFile);
char *vertexShader;
char *fragmentShader;
private:
int Load(const char *filename, char*&shaderSource);
fstream file;
};
int SHADER::Load(const char *filename, char *&shaderSource) {
file.open(filename, ios::in);
if(file.is_open()) {
file.tellg();
file.seekg(0,ios::end);
unsigned long len = file.tellg();
file.seekg(ios::beg);
if(len == 0 ) {
return -2;
} else {
shaderSource = new char[len + 1];
file.read(shaderSource,len);
file.close();
printf("%sn",shaderSource);
}
} else {
return -1;
}
return 0;
}
void SHADER::LoadShaders(const char *vertexFile, const char *fragmentFile) {
int resultVertex = this->Load(vertexFile, vertexShader);
int resultFragment = this->Load(fragmentFile, fragmentShader);
if(resultVertex ==0 && resultFragment ==0) {
printf("Shaders loaded succesfully.n");
}
if(resultVertex == -2) {
printf("VertexShader is empty!n");
}
if(resultFragment == -2) {
printf("FragmentShader is empty!n");
}
if(resultVertex == -1) {
printf("Unable to load VertexShader!n");
}
if(resultFragment == -1) {
printf("Unable to load FragmentShader!n");
}
}
这是初始化着色器的代码:
SHADER Shaders;
GLhandleARB vertexShader, fragmentShader, shaderProgram;
Shaders.LoadShaders("vertexShader.vert","fragmentShader.frag");
const char* vertTemp = Shaders.vertexShader;
vertexShader = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
glShaderSourceARB(vertexShader, 1, &vertTemp, NULL);
glCompileShaderARB(vertexShader);
traceShaderInfoLog(vertexShader);
const char* fragTemp = Shaders.fragmentShader;
fragmentShader = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
glShaderSourceARB(fragmentShader, 1, &fragTemp, NULL);
glCompileShaderARB(fragmentShader);
traceShaderInfoLog(fragmentShader);
delete[] Shaders.vertexShader;
delete[] Shaders.fragmentShader;
shaderProgram = glCreateProgramObjectARB();
glAttachObjectARB(shaderProgram,vertexShader);
glAttachObjectARB(shaderProgram,fragmentShader);
glLinkProgramARB(shaderProgram);
traceProgramInfoLog(shaderProgram);
glUseProgramObjectARB(shaderProgram);
这是 vertexShader.vert 和 fragmentShader.frag:
void main(){
gl_Position = ftransform();
}
void main(){
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
这是我打印日志时遇到的错误,我在脚本末尾得到这个非常奇怪的符号,每次我再次编译另一个符号时都会得到这个符号:
void main(){
//gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
gl_Position = ftransform();
}┘
void main(){
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}♣
Shaders loaded succesfully.
Vertex shader was successfully compiled to run on hardware.
Fragment shader failed to compile with the following errors:
ERROR: 0:3: error(#132) Syntax error: '<' parse error
ERROR: error(#273) 1 compilation errors. No code generated
Fragment shader(s) were not successfully compiled before glLinkProgram() was called.
Link failed.
你的 Load 函数很可能是问题所在:签名应为
int SHADER::Load(const char *filename, char *&shaderSource) // Note the &
快速修复。您正在该函数中分配内存并重新分配给指针 - 您只将源加载到该地址 - 但这永远不会离开该函数。
由于内存初始化为零,编译器很可能会得到一个空字符串(您是否在调试中运行它?)并且不会失败,因为这有时没问题。但是链接器注意到实际上没有任何代码要链接!
当链接失败时,检索链接错误日志,其中可能有其他线索。
请参阅glGetProgramInfoLog
。
相关文章:
- 基于boost的程序的静态链接——zlib问题
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 将gsl c++程序与"英特尔MKL"链接
- 将 glade 文件与程序 g++ 链接
- Qt creator 4.11,在应用程序输出面板中创建一个链接
- 在树莓派上用libtorch构建程序时的链接问题
- 我的应用程序无法在安卓上使用OpenSSL进行链接
- C++实用程序::转换在静态链接库中不起作用
- 使用动态链接加载程序 <dlfcn.h> 而不是直接函数调用的目的是什么?
- 如何使用QtCreator将应用程序与"libqsqlpsql.so"链接?
- 为什么当我在 C 程序中链接静态库时会"undefined symbol"?
- 如何在 debian 下正确链接一个 opengl 程序?
- 在发布模式下启动使用库的静态链接编译的应用程序时出错
- C++ 为什么在定义的编译和链接之前引用外部实例的程序
- 检查G 是否可以链接程序
- C链接程序并在主函数上使用其他程序的方法(数独)
- 使用g++链接程序集和C++时未定义的引用
- 如何在c++中链接程序
- 链接C程序到c++共享库
- 无法使用 Boost.File system 链接程序