sfml生成的纹理未绘制到窗口

时间:2017-08-29 17:07:29

标签: c++ sfml

我想做的事情:

  • 将生成的sf :: Texture绘制到窗口

预期结果:

  • 窗口填充纹理(在示例代码中:绿色背景)

结果:

  • 空白(黑色)窗口

到目前为止我做了什么:

  • 尝试从文件加载纹理:工作
  • 尝试将生成的纹理保存到文件中:
  • 尝试在Texture.getMaximumSize()
  • 的范围内生成较小的纹理
  • 将代码缩减到最低

我使用的工具:

  • 操作系统:Kde Neon 5.10(基于Ubuntu 16.04),Linux内核4.4
  • 构建系统:qmake
  • sfml版本:2.3

示例代码(完全剥离,在此表单中无用,但它显示问题):

#include <iostream> 
#include <SFML/Graphics.hpp>

using namespace std;

int main()
{
    // width and height of the window
    // this will not exceed max size of texture
    uint width = 128;
    uint height = 128;

    // create new window
    sf::RenderWindow * window = new sf::RenderWindow(sf::VideoMode(height,width), "Mandelbrot");

    // create pixel array
    vector<sf::Uint8> * pixels = new vector<sf::Uint8>(height * width * 4);

    // fill array with collors;
    for (uint i = 0; i < height*width; i++)
    {
        pixels->at(i*4 + 2) = 255;
    }

    // create texture
    sf::Texture * texture = new sf::Texture();
    texture->create(width,height);
    texture->update(pixels->data());

    // create sprite to hold the texture
    sf::Sprite * sprite = new sf::Sprite();
    sprite->setTexture(*texture);
    sprite->setTextureRect(sf::IntRect(0, 0, width, height));

    // draw the sprite
    window->draw(*sprite);

    // draw buffer to screen
    window->display();

    // close window on system close action
    sf::Event event;
    while (window->waitEvent(event))
    {
        if (event.type == sf::Event::Closed)
        {
            // close window
            window->close();
            return 0;
        }
    }

return 1;
}

2 个答案:

答案 0 :(得分:1)

您没有设置每个像素的 alpha通道(RGBA格式)。对于完全不透明的图像,它需要为255:

for (uint i = 0; i < height*width; i++)
{
    pixels->at(i*4 + 3) = 255; // alpha
    pixels->at(i*4 + 2) = 255; // blue
}

答案 1 :(得分:0)

我认为你没有为纹理设置所有像素,而只是每隔四分之一,从2开始。试试这个:

for (uint i = 0; i < height*width; i++)
    {
        pixels.at(i*4 + 0) = 255;
        pixels.at(i*4 + 1) = 221;
        pixels.at(i*4 + 2) = 255;
        pixels.at(i*4 + 3) = 255;
    }