纹理在 BGFX 中显示为黑色和红色线条

问题描述 投票:0回答:1

我是 bgfx 的新手,很长一段时间以来一直在尝试将纹理立方体渲染到屏幕上。但我没有指定纹理,而是用红色和黑色线条覆盖。 screenshot of the weird lines

这是我的片段着色器代码,我没有发现它有什么问题:

$input v_texcoord0

#include "../common.sh"

SAMPLER2D(s_tex, 0);

void main()
{
    gl_FragColor = vec4(texture2D(s_tex, v_texcoord0).rgb, 1.0);
}

这就是我设置纹理的方式:

inline void SetTexture(const std::string &name, uint8_t stage, const Texture& texture)
    {
        bgfx::setTexture(stage, m_uniforms.at(name).handle, texture.m_handle);
    }

这就是我创建纹理的方式:

Texture::Texture(const std::string& path)
    : valid(true)
{
    static const std::string basePath = "res/textures/";
    std::string fullPath = basePath + path;
    uint8_t *data = stbi_load("./res/textures/atlas.png", &size.x, &size.y, &channels, STBI_rgb_alpha);
    channels = 4;
    if (stbi_failure_reason()) std::cout << stbi_failure_reason();

    auto res =
        bgfx::createTexture2D(
            size.x, size.y,
            false, 1,
            bgfx::TextureFormat::RGBA8,
            BGFX_SAMPLER_U_CLAMP
            | BGFX_SAMPLER_V_CLAMP
            | BGFX_SAMPLER_MIN_POINT
            | BGFX_SAMPLER_MAG_POINT,
            bgfx::copy(data, size.x * size.y * channels));

    if (!bgfx::isValid(res)) {
        std::cout << ("Error loading texture " + path) << std::endl;
        valid = false;
    }

    stbi_image_free(data);
    std::cout << "created texture\n";
}

奇怪的是,当我通过传入

bgfx::setTexture
作为第三个参数来将空着色器句柄传递给
bgfx::TextureHandle()
时,我得到了相同的结果。所以我假设纹理没有正确传递到着色器。但我不知道是什么原因造成的。

c++ shader bgfx
1个回答
0
投票

createTexture
函数不会立即将纹理上传到GPU,而只是在命令缓冲区中记录创建纹理的请求,因此在
stbi_image_free
之后没有任何内容可上传,数据将被损坏。所以选择是稍后释放纹理,或者调用这个:

bgfx::touch(0);
bgfx::frame();

紧接着

createTexture2D
执行命令缓冲区。

© www.soinside.com 2019 - 2024. All rights reserved.