我刚刚开始学习OpenGL,并且正在学习本教程.我在编译本教程使用的GLSL文件时遇到了困难.
原来,当我试图编译它们编译器说,台面不支持GLSL版本330,所以我改变#version 330 core
来#version 130
.现在,当我运行它时,它给我以下错误:
3.0 Mesa 10.0.20Compiling shader : SimpleVertexShader.vertexshader 0:3(1): error: syntax error, unexpected NEW_IDENTIFIER Compiling shader : SimpleFragmentShader.fragmentshader Linking program error: linking with uncompiled shader
我在谷歌搜索过,找不到有这个问题的人.无论如何,这里是所有有问题的文件:
SimpleVertexShader.vertexshader:
#version 130 layout(location = 0) in vec3 vertexPosition_modelspace; void main(){ gl_Position.xyz = vertexPosition_modelspace; gl_Position.w = 1.0; }
SimpleFragmentShader.fragmentshader:
#version 130 out vec3 color; void main() { color = vec3(1,0,0); }
loadShader.cpp:
#include#include #include #include #include #include using namespace std; #include #include #include GLuint LoadShaders(const char * vertex_file_path,const char * fragment_file_path){ // Create the shaders GLuint VertexShaderID = glCreateShader(GL_VERTEX_SHADER); GLuint FragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER); // Read the Vertex Shader code from the file std::string VertexShaderCode; std::ifstream VertexShaderStream(vertex_file_path, std::ios::in); if(VertexShaderStream.is_open()) { std::string Line = ""; while(getline(VertexShaderStream, Line)) VertexShaderCode += "\n" + Line; VertexShaderStream.close(); } // Read the Fragment Shader code from the file std::string FragmentShaderCode; std::ifstream FragmentShaderStream(fragment_file_path, std::ios::in); if(FragmentShaderStream.is_open()){ std::string Line = ""; while(getline(FragmentShaderStream, Line)) FragmentShaderCode += "\n" + Line; FragmentShaderStream.close(); } GLint Result = GL_FALSE; int InfoLogLength; // Compile Vertex Shader printf("Compiling shader : %s\n", vertex_file_path); char const * VertexSourcePointer = VertexShaderCode.c_str(); glShaderSource(VertexShaderID, 1, &VertexSourcePointer , NULL); glCompileShader(VertexShaderID); // Check Vertex Shader glGetShaderiv(VertexShaderID, GL_COMPILE_STATUS, &Result); glGetShaderiv(VertexShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); std::vector VertexShaderErrorMessage(InfoLogLength); glGetShaderInfoLog(VertexShaderID, InfoLogLength, NULL, &VertexShaderErrorMessage[0]); fprintf(stdout, "%s\n", &VertexShaderErrorMessage[0]); // Compile Fragment Shader printf("Compiling shader : %s\n", fragment_file_path); char const * FragmentSourcePointer = FragmentShaderCode.c_str(); glShaderSource(FragmentShaderID, 1, &FragmentSourcePointer , NULL); glCompileShader(FragmentShaderID); // Check Fragment Shader glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result); glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); std::vector FragmentShaderErrorMessage(InfoLogLength); glGetShaderInfoLog(FragmentShaderID, InfoLogLength, NULL, &FragmentShaderErrorMessage[0]); fprintf(stdout, "%s\n", &FragmentShaderErrorMessage[0]); // Link the program fprintf(stdout, "Linking program\n"); GLuint ProgramID = glCreateProgram(); glAttachShader(ProgramID, VertexShaderID); glAttachShader(ProgramID, FragmentShaderID); glLinkProgram(ProgramID); // Check the program glGetProgramiv(ProgramID, GL_LINK_STATUS, &Result); glGetProgramiv(ProgramID, GL_INFO_LOG_LENGTH, &InfoLogLength); std::vector ProgramErrorMessage( max(InfoLogLength, int(1)) ); glGetProgramInfoLog(ProgramID, InfoLogLength, NULL, &ProgramErrorMessage[0]); fprintf(stdout, "%s\n", &ProgramErrorMessage[0]); glDeleteShader(VertexShaderID); glDeleteShader(FragmentShaderID); return ProgramID; }
main.cpp中:
#include#include #include #include //#define GLFW_DLL // maybe some glu problems - look up #include #include GLuint LoadShaders(const char * vertex_file_path,const char * fragment_file_path); int main() { GLFWwindow * window; if (!glfwInit()) { std::cout << "Failed to initiate GLFW\n"; return -1; } glfwWindowHint(GLFW_SAMPLES, 4); //4x antialiasing glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); //version 3 //open a window and create context window=glfwCreateWindow(1024,768,"Lerning", glfwGetPrimaryMonitor(), NULL); if (!window) { std::cout << "Failed to open window\n"; glfwTerminate(); return -1; } glfwMakeContextCurrent(window); std::cout << glGetString(GL_VERSION); // initialize GLEW glewExperimental=GL_TRUE; //needed GLenum err = glewInit(); std::cout << err; if (err != GLEW_OK) { std::cout << "Failed to initialize\n" << glewGetErrorString(err); return -1; } GLuint VertexArrayID; glGenVertexArrays(1, &VertexArrayID); glBindVertexArray(VertexArrayID); static const GLfloat g_vertex_buffer_data[] = { -1.0f, -1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, }; GLuint vertexbuffer; glGenBuffers(1, &vertexbuffer); glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW); GLuint programID = LoadShaders("SimpleVertexShader.vertexshader", "SimpleFragmentShader.fragmentshader"); while (!glfwWindowShouldClose(window)) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glUseProgram(programID); glEnableVertexAttribArray(0); glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0 ); glDrawArrays(GL_TRIANGLES, 0, 3); glDisableVertexAttribArray(0); glfwSwapBuffers(window); glfwPollEvents(); } glfwTerminate(); return 0; }
Andon M. Col.. 11
layout(location = 0)
在GLSL 1.30中无效.布局限定符在GLSL 1.40中引入.在链接着色器之前,您需要在C++代码中手动绑定该顶点属性位置.
// Check Fragment Shader glGetShaderiv(FragmentShaderID, GL_COMPILE_STATUS, &Result); glGetShaderiv(FragmentShaderID, GL_INFO_LOG_LENGTH, &InfoLogLength); std::vectorFragmentShaderErrorMessage(InfoLogLength); glGetShaderInfoLog(FragmentShaderID, InfoLogLength, NULL, &FragmentShaderErrorMessage[0]); fprintf(stdout, "%s\n", &FragmentShaderErrorMessage[0]); // Create the program fprintf(stdout, "Linking program\n"); GLuint ProgramID = glCreateProgram(); glAttachShader(ProgramID, VertexShaderID); glAttachShader(ProgramID, FragmentShaderID); // Setup Vertex Attributes [NEW] glBindAttribLocation (ProgramID, 0, "vertexPosition_modelspace"); // Link the program glLinkProgram(ProgramID);
有可能这个属性将被GLSL实现自动分配0,一旦你删除了layout (location = 0)
,但你应该继续并绑定位置以正确的方式做事.