OpenGL着色器错误:0:1:'':语法错误#version

时间:2013-12-14 12:23:39

标签: opengl glsl shader

我正在使用xcode与OpenGL制作游戏。我用GLUT初始化了一个窗口。我有希望实现的着色器,但是当我尝试编译它们时,我在信息日志中得到两个编译错误。我的着色器看起来像这样:

//FirstShader.vsh
#version 150 core

in vec3 position;

void main()
{
    gl_Position = vec4(position, 1.0);
}

//FirstShader.fsh
#version 150 core

out vec4 fragData;

void main()
{
    fragData = vec4(0.0, 0.0, 1.0, 1.0);
}         

我正在阅读该文件并使用以下代码进行编译:

GLuint createShaderFromFile(const GLchar *path, GLenum shaderType){
GLuint shaderID = glCreateShader(shaderType);
std::ifstream fin;
fin.open(path);
if(!fin.is_open()){
    fin.close();
    std::cout << "Shader Not Found" << std:: endl;
    return 0;
}
std::string source((std::istreambuf_iterator<GLchar>(fin)),std::istreambuf_iterator<GLchar> ());

fin.close();

const GLchar* shaderSource = source.c_str();


glShaderSource(shaderID, 1, &shaderSource, NULL);

glCompileShader(shaderID);
GLint compileStatus;
glGetShaderiv(shaderID, GL_COMPILE_STATUS, &compileStatus);

if (compileStatus != GL_TRUE) {
    std::cout << "Shader failed to compile" << std::endl;
    GLint infoLoglength;
    glGetShaderiv(shaderID, GL_INFO_LOG_LENGTH, &infoLoglength);
    GLchar* infoLog = new GLchar[infoLoglength + 1];
    glGetShaderInfoLog(shaderID, infoLoglength, NULL, infoLog);
    std::cout << infoLog << std::endl;
    delete infoLog;
    return 0;
}


return shaderID;
}

我收到这些错误:

ERROR: 0:1: '' :  version '150' is not supported
ERROR: 0:1: '' : syntax error #version

我的OpenGL版本是2.1,而我的glsl版本是1.20。有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

通过在创建上下文时以像素格式设置,可以告诉OSX使用较新版本的OpenGL。 Here is an example如何设置它。

或者,如果您使用过剩,我认为您希望glutInitContextVersion(x, y); xy是主要和次要版本号。我认为OpenGL 3.2支持GLSL 1.5。 (我想你也可能想要glutInitContextProfile(GLUT_CORE_PROFILE);。)

答案 1 :(得分:1)

我重新编写了着色器,它们实际上可以在GLSL 1.20中使用。

  • in必须在GLSL 1.20顶点着色器中替换为attribute
  • 片段着色器输出的
  • out无效,请改用gl_FragColorgl_FragData [n]
  • 将顶点属性声明为vec3然后执行类似vec4 (vtx, 1.0)的操作完全是多余的
    • 如果您将属性声明为vec4并使用少于4个组件为其提供数据,GLSL将自动以这种方式填写属性缺失的组件:vec4 (0.0, 0.0, 0.0, 1.0)

Fragment Shader:

#version 120

attribute vec4 position;

void main()
{
  gl_Position = position;
}

顶点着色器:

#version 120

void main()
{
  gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0);
}

当然这并没有真正解决您的问题,因为如果您有OS X 10.7或更新版本,它支持OpenGL 3.2,因此支持GLSL 1.50核心。您需要请求核心配置文件上下文才能使用 - 否则您将获得OpenGL 2.1和GLSL 1.20。