我正在使用OpenGL编写我的第一个程序,并且我已经到了我想要编译我非常简单的着色器程序的地步。我总是得到它无法编译着色器的错误。我使用以下代码编译着色器:
struct Shader
{
const char* filename;
GLenum type;
GLchar* source;
};
...
static char* readShaderSource(const char* shaderFile)
{
FILE* fp = fopen(shaderFile, "r");
if ( fp == NULL ) { return NULL; }
fseek(fp, 0L, SEEK_END);
long size = ftell(fp);
fseek(fp, 0L, SEEK_SET);
char* buf = new char[size + 1];
fread(buf, 1, size, fp);
buf[size] = '\0';
fclose(fp);
return buf;
}
...
Shader s;
s.filename = "<name of shader file>";
s.type = GL_VERTEX_SHADER;
s.source = readShaderSource( s.filename );
GLuint shader = glCreateShader( s.type );
glShaderSource( shader, 1, (const GLchar**) &s.source, NULL );
glCompileShader( shader );
我的着色器文件源如下:
#version 150
in vec4 vPosition;
void main()
{
gl_Position = vPosition;
}
我也尝试用“属性”替换“in”以及删除版本行。什么都没有编译。 注意:我的实际C程序编译并运行。在GPU上运行的着色器程序是无法编译的。
我还确保下载显卡的最新驱动程序。我有一台NVIDIA 8800 GTS 512;
关于如何获取我的着色器程序(用GLSL编写)进行编译的任何想法?
答案 0 :(得分:0)
正如在评论中写的那样,编译着色器是否输出到控制台?令我惊讶的是,当我使用ATI时,我得到了着色器程序成功编译的消息,但是当我开始使用Nvidia时,我第一次盯着屏幕,因为没有输出......但着色器正在工作。那么也许你是成功编译而且不接受它?如果他们不在上下文中工作,你尝试使用着色器程序并没有任何反应,我认为你错过了着色器的链接(但它可能在代码中更进一步)。 Google对如何正确执行每一步都有一些很好的答案,您可以将代码与此example进行比较。我还创建了一个用于处理whit着色器的界面,你可以查看我的UniShader。 Project缺少英文文档,主要用于GPGPU,但你可以轻松加载任何着色器,代码本身是用英文命名的,所以应该很舒服。在该zip文件夹中查看UniShader文件夹中的源代码。也有一些例子,一个名为Ukazkovy的程序NA GPGPU也包含了来源,所以你可以看看如何使用这些类..祝你好运!