我是 bgfx 的新手,很长一段时间以来一直在尝试将纹理立方体渲染到屏幕上。但我没有指定纹理,而是用红色和黑色线条覆盖。
这是我的片段着色器代码,我没有发现它有什么问题:
$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()
时,我得到了相同的结果。所以我假设纹理没有正确传递到着色器。但我不知道是什么原因造成的。
createTexture
函数不会立即将纹理上传到GPU,而只是在命令缓冲区中记录创建纹理的请求,因此在stbi_image_free
之后没有任何内容可上传,数据将被损坏。所以选择是稍后释放纹理,或者调用这个:
bgfx::touch(0);
bgfx::frame();
紧接着
createTexture2D
执行命令缓冲区。