我正在编写一个简单的着色器管理器,因此我不必一直编写涉及着色器的重复代码,而且遇到了一些问题,这里是错误出现的函数:
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
答案 0 :(得分: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;
答案 1 :(得分:1)
在类定义中,只有声明了静态成员program_values
。在一些.cpp文件中(最好的选择是带有所有类方法定义的文件)你需要定义它 - 比如这个
std::vector<GLuint> ShaderManager::program_values;
或
std::vector<GLuint> ShaderManager::program_values(some_constructor_parameters);