由于OpenGL在着色器方面,C++没有对应的查找错误的方法,在此简单总结一下纠错方法,法,希望对后来者有帮助:
- 1.检测着色器能否编译成功,即在语法上能不能通过。
这里要用到glGetShaderiv()函数,具体用法如下,可以用来检测编译状态的。
int success1 = 0;
glGetShaderiv(vertexShader,GL_COMPILE_STATUS,&success1);
if(!success1)
{
cout << "failed to compile VertexShader" << endl;
}
但有时候明明知道某个着色器编译没通过,但就是不知道在哪出错,这个时候可以用glGetShaderInfoLog:
int success1 = 0;
glGetShaderiv(vertexShader,GL_COMPILE_STATUS,&success1);
if(!success1)
{
cout << "failed to compile VertexShader" << endl;
char log[512];
glGetShaderInfoLog(vertexShader,512,NULL,log);
cout << log << endl;
}
举个例子,比如fragmentShader这样写:
#version 330 core
out vec4 ourColor;
void main()
{
ourColor=vec4(0.2f,0.5f,0.6f,1.0f);s
}
就会这样报错:
这里的0:5,的5是行数,这样就容易找到报错的位置啦。
- 2.还有一种错误,就是两个着色器都编译成功,但是最后没有颜色,或者linkProgram失败,这需要注意什么呢?
(1)检查着色器之间的衔接部分,需要注意着色器之间传递的变量名一定要一模一样。
(2)很多没有颜色出现,都是片元着色器出了问题,可以检查片元着色器。
最后仍然可以用glGetProgramiv和glGetProgramInfoLog来找到错误。
‘ - 3还有的错误就要靠自己来找了
比如报错:Fragment shader Function already has a body: main ERROR:
检查一下自己的glGetShaderSource 写错了没,
或者是跟我一样犯的低级错误:
本来的程序就写了10行,但是下拉滚动后发现在98行莫名有个main函数
把它删掉就行。
PS
如果是用的Vs studio,可以安装如下文本工具,达到如下颜色效果,帮助自己编码:
具体方法如下:
1.点击工具---->拓展和更新
2.选择联网----->输入GLSL,搜索后下载安装,之后重启visual studio就行。