2013-11-27 17 views
0

我在編譯程序時遇到問題,找不到任何錯誤。有問題的代碼和錯誤消息現介紹如下:Shader類中的語法錯誤?

我的錯誤信息:

- 錯誤2錯誤C4430:缺少類型說明符 - 假定爲int。注:C++ 不支持默認int C:\用戶\ codasm \桌面\諾威 projekty \ glfwframework1 \ system.h中9 1 GLFWFramework1

- 錯誤1個錯誤C2143:語法錯誤:缺少 ';'前 '' C:\用戶\ codasm \桌面\諾威 projekty \ glfwframework1 \ system.h中9 1 GLFWFramework1 *

錯誤消息鏈接我system.h中第9行,我不明白什麼是錯的:

Shader* shader; 

system.h中:

#ifndef System_h 
#define System_h 

#include "Core.h" 

class System 
{ 
    GLFWwindow* window; 
    Shader* shader; 
    // GLuint shader; 
    GLenum error; 
    GLuint VAO, VBO, TBO; 
    vector<vec3> vertices; 
    vector<vec2> uvs; 
    vector<vec3> normals; 
public: 
    System(); 
    ~System(); 
    bool InitWindow(); 
    bool InitExtensions(); 
    bool InitShaders(); 
    bool InitVertices(); 
    bool InitTextures(); 
    bool InitModels(); 

    void Resize(GLFWwindow* window); 
    void BeginScene(); 
    void EndScene(GLFWwindow* window); 
    void Display(GLFWwindow*); 

    void Run(); 

    void ShutdownWindow(); 
    void ShutdownShaders(); 
    void ShutdownVertices(); 
    void ShutdownTextures(); 
}; 

static void KeyPress(GLFWwindow* window, int key, int scancode, int action, int mods); 
static void ErrorProc(int error, const char* description); 

#endif 

Shader.cpp:

#pragma once 

    #include "Core.h" 

    class Shader 
    { 
     GLuint shader; 
    public: 
     Shader(void); 
     ~Shader(void); 
     bool ConfigureShaders(string vsName, string fsName); 
     void SetShaderVar(string name, mat4 MVP); 

     void EnableShader(bool enable); 
     GLuint GetShader(); 
    }; 

Shader.h:

#include "Shader.h" 


Shader::Shader(void) 
{ 
} 


Shader::~Shader(void) 
{ 
} 

bool Shader::ConfigureShaders(string vsName, string fsName) 
{ 
     // Wielkosc buforow na bledy moze powodowac problemy w przypadku dluzszych komunikatow 
    // Utworz Shadery 
    GLuint VS = glCreateShader(GL_VERTEX_SHADER); 
    GLuint FS = glCreateShader(GL_FRAGMENT_SHADER); 
    // Czytaj Shadery 
    string LineBuffer; 

    fstream VSFile(vsName.c_str(),ios::in); 
    string VSSource; 
    if(VSFile.is_open()) 
    { 
     while(getline(VSFile,LineBuffer)) 
      VSSource += "\n"+LineBuffer; 
     VSFile.close(); 
    } 

    fstream FSFile(fsName.c_str(),ios::in); 
    string FSSource; 
    if(FSFile.is_open()) 
    { 
     LineBuffer.clear(); 
     while(getline(FSFile,LineBuffer)) 
      FSSource += "\n"+LineBuffer; 
     FSFile.close(); 
    } 

    GLint result; 
    // int infoLogLength; 
    // Wprowadz, Kompiluj i Sprawdz Shadery 
    char const* VSSrc = VSSource.c_str(); 
    glShaderSource(VS,1,&VSSrc,NULL); 
    glCompileShader(VS); 
    glGetShaderiv(VS,GL_COMPILE_STATUS,&result); 
    // glGetShaderiv(VS,GL_INFO_LOG_LENGTH,&infoLogLength); 

    char VSErrMsg[256]; 
    glGetShaderInfoLog(VS,1024,NULL,VSErrMsg); 
    cout<<VSErrMsg<<endl; 

    char const* FSSrc = FSSource.c_str(); 
    glShaderSource(FS,1,&FSSrc,NULL); 
    glCompileShader(FS); 
    glGetShaderiv(VS,GL_COMPILE_STATUS,&result); 
    // glGetShaderiv(VS,GL_INFO_LOG_LENGTH,&infoLogLength); 

    char FSErrMsg[256]; 
    glGetShaderInfoLog(FS,1024,NULL,FSErrMsg); 
    cout<<FSErrMsg<<endl; 

    // Polacz Shadery 
    shader = glCreateProgram(); 
    glAttachShader(shader,VS); 
    glAttachShader(shader,FS); 

    glBindAttribLocation(shader,0,"vertexPos"); 
    glBindAttribLocation(shader,1,"vertexUV"); 

    glLinkProgram(shader); 
    // Sprawdz Program 
    glGetProgramiv(shader,GL_LINK_STATUS,&result); 
    // glGetProgramiv(Shader,GL_INFO_LOG_LENGTH,&infoLogLength); 

    char PrgErrMsg[256]; 
    glGetProgramInfoLog(shader,1024,NULL,PrgErrMsg); 
    cout<<PrgErrMsg<<endl; 

    // Kasuj Shadery 
    glDeleteShader(VS); 
    glDeleteShader(FS); 
    return true; 
} 

void Shader::SetShaderVar(string name, mat4 MVP) 
{ 
    GLuint MatrixLocation = glGetUniformLocation(shader,"MVP"); 
    glUniformMatrix4fv(MatrixLocation,1,GL_FALSE,&MVP[0][0]); 
} 

void Shader::EnableShader(bool enable) 
{ 
    if(!shader) 
    { 
     if(enable) 
      glUseProgram(shader); 
     else 
      glUseProgram(0); 
    } 
} 

GLuint Shader::GetShader() 
{ 
    return shader; 
} 
+1

你真的在'Shader.h'中包含「#Shader.h」嗎? –

+0

@LuchianGrigore:我想最後兩個文件的標籤已經混在一起了,''Shader.h''包含在「Shader.cpp」中'就像你期望的那樣。 –

回答

7

您還沒有System.h使用它之前宣佈Shader。它看起來像你可以擺脫一個forward declaration

class Shader; 
class System定義之前

,因爲你只需要一個指針聲明它。如果你需要對課程做任何事情,那麼你需要包含頭部以獲得完整的定義;但你不需要在這裏,所以你不應該。

+0

是的,這是解決方案,謝謝! – CppMonster