簡體   English   中英

SFML Shader為什么會導致分段錯誤?

[英]Why does SFML Shader cause segmentation fault?

為什么sf :: Shader會導致分段錯誤。我將顯示代碼,並告訴那些看了我使用引擎的代碼的代碼,它可以正常工作,因此除了sf ::不會導致崩潰。着色器。加載着色器時代碼停止。

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

您對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();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM