-2

我正在编写一个简单的着色器管理器,因此我不必一直编写涉及我的着色器的重复代码并且我遇到了一些问题,这里是出现错误的函数:

void ShaderManager::create_program(std::string name)  {
    GLuint vertexshader;
    GLuint fragmentshader;

    GLint link_ok = GL_FALSE;

    if ((vertexshader = create_shader(name + ".v.glsl", GL_VERTEX_SHADER)) == 0)  {
        print_shader_errors(&vertexshader);
    }

    if ((fragmentshader = create_shader(name + ".f.glsl", GL_FRAGMENT_SHADER)) == 0)  {
        print_shader_errors(&fragmentshader);
    }

    program_values.emplace_back(glCreateProgram());
    program_keys.emplace_back(name);
    glAttachShader(program_values.at(program_values.size()), vertexshader);
    glAttachShader(program_values.at(program_values.size()), fragmentshader);
    glLinkProgram(program_values.at(program_values.size()));

    glGetProgramiv(program_values.at(program_values.size()), GL_LINK_STATUS, &link_ok);

    if (!link_ok)  {
        std::cout << "The shaders did not link correctly." << "\n";
    }
}

我尝试访问的每个私有静态成员都说同样的话:

Generator\src\ShaderManager.cpp|33|undefined reference to ShaderManager::program_values'

我的头文件如下所示:

#ifndef SHADERMANAGER_H
#define SHADERMANAGER_H

#include <string>
#include <vector>

#include <GL/glew.h>
#include <GL/glu.h>
#include <GL/gl.h>

class ShaderManager {
    public:
        ShaderManager();
        virtual ~ShaderManager();

        static GLuint get_program(std::string shader_name);
        static int get_index_of_program_key(std::string program_name);

        static void create_program(std::string name);
        static bool bind_attribute(std::string shader_name, std::string attribute_name);
        static bool bind_uniform(std::string shader_name, std::string uniform_name);

    protected:
    private:
        static std::vector<GLuint> program_values;
        static std::vector<std::string> program_keys;

        static std::vector<GLuint> attribute_values;
        static std::vector<std::string> attribute_keys;

        static std::vector<GLuint> uniform_values;
        static std::vector<std::string> uniform_keys;


        static void print_shader_errors(GLuint *shader);
        static const char* file_read(std::string filename);
        static GLuint create_shader(std::string filename, GLenum type);
};

#endif // SHADERMANAGER_H
4

2 回答 2

3

首先,您正在program_values.at( program_values.size() )访问,它正在访问最后一个元素之后的元素(索引从 0 而不是 1 开始)并且std::vector::at()函数将引发 out_of_range 异常。这是访问最后一个元素的正确代码:program_values.at( program_values.size() - 1 )或更短program_values.back()

其次,如果你声明任何静态成员,你需要在一个cpp 文件中定义它,像这样:

std::vector<GLuint> ShaderManager::program_values;
std::vector<std::string> ShaderManager::program_keys;

std::vector<GLuint> ShaderManager::attribute_values;
std::vector<std::string> ShaderManager::attribute_keys;

std::vector<GLuint> ShaderManager::uniform_values;
std::vector<std::string> ShaderManager::uniform_keys;
于 2012-08-07T11:38:31.337 回答
1

在类定义中,您只声明了静态成员program_values。在某些 .cpp 文件(最好的选择是包含所有类方法定义的文件)中,您需要定义它 - 像这样

std::vector<GLuint> ShaderManager::program_values;

或者

std::vector<GLuint> ShaderManager::program_values(some_constructor_parameters);
于 2012-08-07T11:34:47.300 回答