【问题标题】:Syntax error in Shader class?着色器类中的语法错误?
【发布时间】:2013-11-28 01:07:50
【问题描述】:

我在编译程序时遇到问题,我找不到任何错误。有问题的代码和错误信息如下:

我的错误信息:

- 错误 2 错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持默认整数 c:\users\codasm\desktop\nowe 项目\glfwframework1\system.h 9 1 GLFWFramework1

- 错误 1 ​​错误 C2143:语法错误:缺少 ';'前 '' c:\users\codasm\desktop\nowe 项目\glfwframework1\system.h 9 1 GLFWFramework1*

将我链接到 System.h 第 9 行的错误消息,我不明白出了什么问题:

Shader* shader;

系统.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();
    };

着色器.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;
}

【问题讨论】:

  • 你真的在Shader.h#include "Shader.h"吗?
  • @LuchianGrigore:我猜最后两个文件的标签混淆了,"Shader.h" 包含在 "Shader.cpp" 中,正如您所料。

标签: c++ opengl


【解决方案1】:

System.h 中使用之前,您尚未声明Shader。看起来你可以通过forward declaration 逃脱。

class Shader;

class System的定义之前,因为你只需要声明一个指向它的指针。如果您需要对类做任何花哨的事情,那么您需要包含标题以获得完整的定义;但你不需要在这里,所以你不应该。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多