今天打开之前的程序,着色器用cg写的,但是一直在报Invalid Program Handle错误,我从代码一直检查到显卡驱动,重装了cg toolkit,升级了显卡驱动,更新了cuda,但是没用,就这样纠结了一天,还是被一个学弟看到,我之前有把OpenGL版本信息和用到的显卡信息输出出来,才发现,原来程序默认跑在HD集显上,哭瞎!
通过修改NVIDA控制面板里,将所有程序都用NVIDA显卡来跑,然后就行了!我真是蠢爆了!
附上如何输出OpenGL信息和显卡信息的代码:
cout << "OpenGL version:" << endl;
const GLubyte* name = glGetString(GL_VENDOR); //返回负责当前OpenGL实现厂商的名字
const GLubyte* biaoshifu = glGetString(GL_RENDERER); //返回一个渲染器标识符,通常是个硬件平台
const GLubyte* OpenGLVersion = glGetString(GL_VERSION); //返回当前OpenGL实现的版本号
const GLubyte* gluVersion = gluGetString(GLU_VERSION); //返回当前GLU工具库版本
printf("OpenGL实现厂商的名字:%s\n", name);
printf("渲染器标识符:%s\n", biaoshifu);
printf("OpenGL实现的版本号:%s\n", OpenGLVersion);
printf("OGLU工具库版本:%s\n", gluVersion);
对于cg shader的debug,可以输出一下错误信息:
static void checkForCgError(const char *situation, const int line, const CGcontext context)
{
CGerror error;
const char *string = cgGetLastErrorString(&error);
cout << line << " "
<< situation << " "
<< error << " "<< CG_NO_ERROR << endl;
if (error != CG_NO_ERROR)
{
cout << line << " "
<< situation << " "
<< string << endl;
if (CG_COMPILER_ERROR == error)
cout << cgGetLastListing(context) << endl;
exit(1);
}
}
调用方式就是:
checkForCgError("shader name", __LINE__, cg_context);
shader name
就是你shader的名字或者其它字符串,__LINE__
是c++输出行号的,cg_context
表示你当前使用的cg的上下文。