2013-09-10 3 views
0

Я пытаюсь реализовать очень простые шейдеры в моем OpenGL. К сожалению, я продолжать работать в:Ошибка шейдера SFML с OpenGL

Cannot access private member declared in class 'sf::NonCopyable 

Я попытался выяснить это сам, и я думаю, что где-то я вновь объявить НФ :: Shader где-то.

sf::Shader compile_shaders(void) 
{ 
sf::Shader shader; 

const std::string vertex_shader_source = \ 
    "#version 430 core "\ 
    "     "\ 
    "void main(void){ "\ 
    " gl_position = vec4(0.0, 0.0, 0.5, 1.0);"\ 
    "}     "; 

const std::string fragment_shader_source = \ 
    "#version 430 core     "\ 
    "         "\ 
    "out vec4 color;     "\ 
    "         "\ 
    "void main(void){     "\ 
    " color = vec4(0.0, 0.8, 1.0, 1.0);"\ 
    "}         "; 

shader.loadFromMemory(vertex_shader_source, fragment_shader_source); 

return shader; 
} 

int main(){ 
int width = 800; 
int height = 450; 
sf::Window window(sf::VideoMode(width, height), "OpenGL Test", sf::Style::Default, sf::ContextSettings(32)); 

resize(width, height); 
init(); 
window.setVerticalSyncEnabled(true); 


sf::Shader shader = compile_shaders(); 


bool running = true; 
while (running){ 
    sf::Event event; 
    while (window.pollEvent(event)){ 
     if (event.type == sf::Event::Closed) 
      running = false; 
     else if (event.type == sf::Event::Resized){ 
      width = event.size.width; 
      height = event.size.height; 
      resize(width, height); 
     } 
     else if (event.type == sf::Event::KeyPressed & event.key.code == sf::Keyboard::Escape) 
      running = false; 
    } 
    sf::Shader::bind(&shader); 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 

    glTranslatef(-1.5f,0.0f,-6.0f); 

    glBegin(GL_TRIANGLES); 

     glColor3f(1.0f,0.0f,0.0f); 
     glVertex3f(0.0f, 1.0f, 0.0f); 

     glColor3f(0.0f,1.0f,0.0f); 
     glVertex3f(-1.0f,-1.0f, 0.0f); 

     glColor3f(0.0f,0.0f,1.0f); 
     glVertex3f(1.0f,-1.0f, 0.0f); 
    glEnd(); 

    glTranslatef(3.0f, 0.0f, 0.0f); 

    glColor3f(0.5f,0.5f,1.0f); 
    glBegin(GL_QUADS); 
     glVertex3f(-1.0f, 1.0f, 0.0f); 
     glVertex3f(1.0f, 1.0f, 0.0f); 
     glVertex3f(1.0f,-1.0f, 0.0f); 
     glVertex3f(-1.0f,-1.0f, 0.0f); 
    glEnd(); 
    window.display(); 

    sf::Shader::bind(NULL); 
} 

return 0; 
} 

размера() и инициализации() только для установки некоторых OpenGL переменные, поэтому я уверен, что они не являются проблемой.

ответ

1

Похоже, что надзор за проектами у sfml ребята. Это будет работать, если sf::Shader будет реализовывать конструктор перемещения. В его нынешнем виде вы не можете переместить или скопировать sf::Shader, потому что его конструктор копирования объявлен как private, а конструктор перемещения не определен.

Все, что вы можете сделать, это выделить его в кучу и вернуть указатель на нее из функции.

Я бы порекомендовал вам использовать

std::unique_ptr<sf::Shader> compile_shaders(void){ 
    auto shader = std::make_unique<sf::Shader>(); 
    //or auto shader = std::unique_ptr<sf::Shader>(new sf::Shader()); if you don't have make_unique available 

    //... code ommitted     

    shader->loadFromMemory(vertex_shader_source, fragment_shader_source); 

    return shader; 
} 

, а затем сделать вызов с

auto shader = compile_shaders(); 
//... code omitted 
sf::Shader::bind(shader.get()); 

Если вы хотите, чтобы обойти шейдера несколько больше использовать вместо этого std::shared_ptr из std::unique_ptr

+0

Спасибо очень! Мне придется потратить некоторое время на то, чтобы понять, что все это на самом деле делает, но у вас есть работа, чтобы вы качались! –

Смежные вопросы