我试图让我的跨平台着色器编译默认渲染这只不过是基本的着色器程序更像是这样:
顶点程序:
void main()
{
//vec4 vertex = matModelView * a_vertex;
gl_Position = ftransform();//matProj * vertex;
gl_TexCoord[0] = gl_MultiTexCoord0;
}
片段程序:
uniform sampler2D colorMap;
void main()
{
gl_FragColor = texture2D(colorMap, gl_TexCoord[0].st);
}
我知道,gl_前缀已过时的功能,但是这仅仅是一个默认的着色器,所以我知道一切正常。 该样本与我Shader类windows下正常工作。
现在到我的着色器类,当我创建一个Shader对象我调用带路径没有文件扩展名的加载方法。 例如:./data/shaders/default装载机借此并搜寻字符串+ .vert .geom或.frag为适当的着色器程序。 然后,这些加载并传递到创建程序的OpenGL的一部分。 这是东西似乎出问题,我可以证实的是,着色器程序的内容被正确地从磁盘加载所以这不是问题所在,据我可以看到。
当文件被加载它进入到编译顶点和片段程序(或几何形状,但是这是可选的):
a_Type
要么GL_FRAGMENT_SHADER
或GL_VERTEX_SHADER
。 a_Source
是着色器程序文件(.vert / .frag / .geom文件)的内容。 当我加载顶点程序编译立即失败, if( success != GL_TRUE )
被击中并评价如此,我得到一个编译错误。 我不想任何得到任何输出,在“着色器编译输出的” printf不打印约编译任何信息。 (该OGLCHECK
是它检查的OpenGL错误堆栈的宏,这并不任一显示任何东西。)
GLuint Shader::Compile(const GLuint a_Type, const char* a_Source)
{
if(a_Source == NULL)
return 0;
GLuint handle = glCreateShader(a_Type); OGLCHECK
glShaderSource(handle, 1, &a_Source, NULL); OGLCHECK
glCompileShader(handle); OGLCHECK
int bufflen = 0;
GLint success = GL_FALSE;
glGetShaderiv(handle, GL_INFO_LOG_LENGTH, &bufflen); OGLCHECK
if(bufflen > 1)
{
GLchar* logString = new GLchar[bufflen + 1];
glGetShaderInfoLog(handle, bufflen, 0, logString); OGLCHECK
printf( "Shader compile output:\n%s\n", logString );
delete logString;
logString = 0;
}
glGetShaderiv(handle, GL_COMPILE_STATUS, &success); OGLCHECK
if(success != GL_TRUE)
{
printf( "Failed to compile shader!\n" );
glDeleteShader(handle); OGLCHECK
handle = 0;
}
return handle;
}
我不能确定怎么回事,这个实现windows下正常工作,因为这是我已经移植到Linux上我的渲染引擎的一部分。 任何人有关于linux下的着色器编译类似的问题?
另外,我glxinfo检查,这里的一些信息:
glxinfo | grep "OpenGL version"
OpenGL version string: 4.2.0 NVIDIA 295.49
我也grep'd上fragment_program,vertex_program,geometry_program而所有这些扩展似乎是可用的。 我运行Ubuntu 12.04。
更新:看来它无关的着色器文件,但别的东西,当我从一个终端运行它以其优良的它编译的着色器,并使用他们,但每当我从代码:: Blocks的运行它,它只是无法编译着色器..他们正在加载,并传递给OpenGL的。 不知道怎么回事。