为什么sf :: Shader导致分段错误。我将展示代码,我告诉那些看起来我使用引擎的代码并且它工作正常。所以它不会导致崩溃除了使用sf :: Shader.And加载着色器时代码停止。
的main.cpp
#include <iostream>
#include "CoreEngine.h"
#include "maingame.h"
int main()
{
//CoreEngine e(new MainGame(new Vector2i(800, 600), "Mama"));
//e.start();
Window::createWindow(800, 600, "Mama");
Window::clearColor(124, 32, 125);
bool running = true;
while(running){
if(Window::isWindowClosed())
running = false;
sf::RectangleShape shape(sf::Vector2f(20, 20));
shape.setPosition(10, 10);
sf::Shader shader;
if(!shader.loadFromFile("fragment.fs", sf::Shader::Fragment))
std::cout << "dfsfsdf";
Window::clear();
Window::getDrawer()->draw(shape, &shader);
Window::render();
}
}
这是代码的编译版本。
#include <iostream>
#include <SFML/Graphics.hpp>
int main()
{
//CoreEngine e(new MainGame(new Vector2i(800, 600), "Mama"));
//e.start();
sf::RenderWindow window(sf::VideoMode(800, 600), "Msadama");
sf::Shader shader;
if(!shader.loadFromFile("fragment.fs", sf::Shader::Fragment)){
std::cerr << "Shader failed to load" << std::endl;
return 0;
}
sf::RectangleShape shape(sf::Vector2f(20, 20));
shape.setPosition(10, 10);
while(window.isOpen()){
sf::Event event;
while(window.pollEvent(event)){
if(event.type == sf::Event::Closed)
window.close();
}
window.clear();
window.draw(shape);
window.display();
}
}
答案 0 :(得分:1)
您对sf::Shader::loadFromFile
的调用失败,触发您的if语句,因为您正在检查错误的情况。你真正想要的是:
sf::Shader shader;
if(!shader.loadFromFile("fragment.fs", sf::Shader::Fragment))
std::cerr << "Shader failed to load" << std::endl;
return 0;
}
std::cout << "dfsfsdf";
Window::clear();
Window::getDrawer()->draw(shape, &shader);
Window::render();
无论如何,您不应该每帧都从文件中加载着色器。执行一次,检查错误,然后进入主循环。像这样(未经测试):
int main()
{
Window::createWindow(800, 600, "Mama");
Window::clearColor(124, 32, 125);
sf::Shader shader;
if(!shader.loadFromFile("fragment.fs", sf::Shader::Fragment))
{
std::cerr << "Failed to load shader" << std::endl;
return 0;
}
bool running = true;
while(running){
if(Window::isWindowClosed())
running = false;
sf::RectangleShape shape(sf::Vector2f(20, 20));
shape.setPosition(10, 10);
Window::clear();
Window::getDrawer()->draw(shape, &shader);
Window::render();
}
}