我有一个非常简单的像素着色器,只写出蓝色像素。这个着色器的目的是显示我认为是一个错误或我用OpenGL无法正确执行的操作,因为当我调整此着色器使其无法编译时,我在代码中遇到了访问冲突而不是我可以检查的简单OpenGL错误。
我有以下像素着色器:
#version 420
out vec4 Out_Colou3r;
void main(void)
{
Out_Colour = vec4(0.0, 0.0, 1.0, 0.0);
}
显而易见的错误在于我拼写Out_Colou3r,它与“main”中的赋值不匹配。现在,当我使用:
编译这个着色器时const GLchar * data = shaderString.c_str();
CoreBase::Expose().glShaderSource(id, 1, &data, nullptr);
CoreBase::Expose().glCompileShader(id);
,其中CoreBase:Expose()公开了GL函数指针集,我在glCompileShader中得到以下错误。
TestCGI.exe中0x0000015E处的未处理异常:0xC0000005:Access 违规执行地点0x0000015E。
现在正确分配了glCompileShader函数指针,因为这个函数在编译前一个顶点着色器时没有问题,如果我纠正错字,它确实会编译上面的像素着色器OK。显然,如果我有访问冲突,我的代码之后不能读取glGetShaderInfoLog以获得失败的原因。访问冲突是终端。有关信息,我使用的是Visual Studio 2012和最新的ATI驱动程序。
所以我的问题如下:为什么着色器中的错误会引发访问冲突?