2014-11-22 83 views
-1

我正在關注arcsynthesis上的OpenGL教程。第一部分沒有給出演示工作所必需的所有代碼,所以我不得不即興發揮。無論如何,看起來一切正常,除了我的頂點和片段着色器沒有編譯。這是我與glGetShaderInfoLog獲得兩個錯誤:GLSL編譯錯誤#132

ERROR: 0:1: error(#132) Syntax error: "test" parse error 
ERROR: error(#273) 1 compilation errors. No code generated 

,這裏是我的OpenGL代碼:

#include <GL/glew.h> 
#include <GL/freeglut.h> 
#include <cstdio> 
#include <iostream> 
#include <vector> 
#include <algorithm> 

using namespace std; 

const float vertexPositions[] = { 
    0.75f, 0.75f, 0.0f, 1.0f, 
    0.75f, -0.75f, 0.0f, 1.0f, 
    -0.75f, -0.75f, 0.0f, 1.0f 
}; 

const string strVertexShader = "test.vert"; 
const string strFragmentShader = "test.frag"; 

GLuint positionBufferObject; 
GLuint theProgram; 
GLuint create_shader(GLenum, const string &); 

GLuint create_program(const vector<GLuint>&); 

void init_program() 
{ 
    vector<GLuint> shaderList; 

    shaderList.push_back(create_shader(GL_VERTEX_SHADER, strVertexShader)); 
    shaderList.push_back(create_shader(GL_FRAGMENT_SHADER, strFragmentShader)); 

    theProgram = create_program(shaderList); 

    for_each(shaderList.begin(), shaderList.end(), glDeleteShader); 
} 

GLuint create_shader(GLenum eShaderType, const std::string &strShaderFile) 
{ 
    GLuint shader = glCreateShader(eShaderType); 
    const char *strFileData = strShaderFile.c_str(); 
    glShaderSource(shader, 1, &strFileData, NULL); 

    glCompileShader(shader); 

    GLint status; 
    glGetShaderiv(shader, GL_COMPILE_STATUS, &status); 
    if (status == GL_FALSE) 
    { 
     GLint infoLogLength; 
     glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLogLength); 

     GLchar *strInfoLog = new GLchar[infoLogLength + 1]; 
     glGetShaderInfoLog(shader, infoLogLength, NULL, strInfoLog); 

     const char *strShaderType = NULL; 
     switch(eShaderType) 
     { 
     case GL_VERTEX_SHADER: strShaderType = "vertex"; break; 
     case GL_GEOMETRY_SHADER: strShaderType = "geometry"; break; 
     case GL_FRAGMENT_SHADER: strShaderType = "fragment"; break; 
     } 

     fprintf(stderr, "Compile failure in %s shader:\n%s\n", strShaderType, strInfoLog); 
     delete[] strInfoLog; 
    } 

    return shader; 
} 

GLuint create_program(const std::vector<GLuint> &shaderList) 
{ 
    GLuint program = glCreateProgram(); 

    for(size_t iLoop = 0; iLoop < shaderList.size(); iLoop++) 
     glAttachShader(program, shaderList[iLoop]); 

    glLinkProgram(program); 

    GLint status; 
    glGetProgramiv (program, GL_LINK_STATUS, &status); 
    if (status == GL_FALSE) 
    { 
     GLint infoLogLength; 
     glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLogLength); 

     GLchar *strInfoLog = new GLchar[infoLogLength + 1]; 
     glGetProgramInfoLog(program, infoLogLength, NULL, strInfoLog); 
     fprintf(stderr, "Linker failure: %s\n", strInfoLog); 
     delete[] strInfoLog; 
    } 

    for(size_t iLoop = 0; iLoop < shaderList.size(); iLoop++) 
     glDetachShader(program, shaderList[iLoop]); 

    return program; 
} 

void init(void) 
{ 
    init_program(); 

    glGenBuffers(1, &positionBufferObject); 

    glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions), vertexPositions, GL_STATIC_DRAW); 

    glBindBuffer(GL_ARRAY_BUFFER, 0); 
} 

void display(void) 
{ 
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
    glClear(GL_COLOR_BUFFER_BIT); 

    glUseProgram(theProgram); 

    glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject); 
    glEnableVertexAttribArray(0); 
    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0); 

    glDrawArrays(GL_TRIANGLES, 0, 3); 

    glDisableVertexAttribArray(0); 
    glUseProgram(0); 

    glutSwapBuffers(); 
} 

int main(int argc, char** argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA); 
    glutInitWindowSize(512, 512); 
    glutInitContextVersion(3, 3); 
    glutInitContextProfile(GLUT_CORE_PROFILE); 
    glutCreateWindow(argv[0]); 

    if (glewInit()) { 
    cerr << "Unable to initialize GLEW ... exiting" << endl; 
    exit(EXIT_FAILURE); 
    } 

    init(); 

    glutDisplayFunc(display); 

    glutMainLoop(); 
} 

我的頂點着色器 「test.vert」:

#version 330 

layout(location = 0) in vec4 position; 

void main() 
{ 
    gl_Position = position; 
} 

和我片段着色器「test.frag」:

#version 330 

out vec4 outputColor; 

void main() 
{ 
    outputColor = vec4(1.0f, 1.0f, 1.0f, 1.0f); 
} 
+0

你必須調用glShaderSource的着色器文件的內容,而不是它的路徑。 – BDL 2014-11-22 22:41:21

回答

3

OpenGL不會爲你加載文件,它甚至不知道文件的概念。 glShaderSource預計源代碼作爲一個字符串(或一系列單獨的字符串)。您只需提供一個文件名,該文件名現在被解釋爲GLSL源代碼,當然不是有效的程序。

請注意,arcsynthesis教程附帶full source code,因此不需要即興創作任何東西。