3.6 KiB
3.6 KiB
OpenGLTexture
OpenGL 纹理的实现,封装 OpenGL texture object。
头文件
#include <XCEngine/RHI/OpenGL/OpenGLTexture.h>
继承关系
RHITexture (interface)
└── OpenGLTexture (implementation)
枚举
OpenGLTextureType
| 值 | 描述 |
|---|---|
Texture1D |
1D 纹理 |
Texture2D |
2D 纹理 |
Texture2DArray |
2D 纹理数组 |
Texture3D |
3D 纹理 |
TextureCube |
立方体贴图 |
TextureCubeArray |
立方体贴图数组 |
OpenGLFormat / OpenGLInternalFormat
| OpenGLFormat | OpenGLInternalFormat | 描述 |
|---|---|---|
R8 |
1 |
单通道 8-bit |
RG8 |
2 |
双通道 8-bit |
RGBA8 |
4 |
四通道 8-bit |
RGBA16F |
11 |
四通道 16-bit float |
RGBA32F |
16 |
四通道 32-bit float |
Depth24Stencil8 |
38 |
24-bit depth + 8-bit stencil |
Depth32F |
31 |
32-bit float depth |
CompressedDXT1 |
21 |
DXT1 压缩 |
CompressedDXT5 |
22 |
DXT5 压缩 |
公共成员函数
构造函数与析构函数
OpenGLTexture()
~OpenGLTexture() override
初始化
bool Initialize(OpenGLTextureType type, int width, int height, int depth, int mipLevels, OpenGLFormat format, const void* data = nullptr)
通用初始化。
bool Initialize2D(int width, int height, int channels, const void* data, bool generateMipmap = true)
便捷的 2D 纹理初始化。
channels: 通道数 (1-4)
bool InitializeCubeMap(int size, int mipLevels, OpenGLFormat format, const void* data = nullptr)
初始化立方体贴图。
bool LoadFromFile(const char* path, bool flipVertical = true)
从图片文件加载纹理(需要 stb_image)。
void Shutdown() override
绑定操作
void Bind(int slot = 0) const
绑定纹理到纹理单元。
void Unbind() const
void BindImage(int slot, bool read, bool write) const
绑定为 image texture(用于 compute shader)。
纹理操作
void GenerateMipmap()
生成 Mipmap。
void SetFiltering(int minFilter, int magFilter)
设置过滤模式。
void SetWrapping(int wrapS, int wrapT, int wrapR = -1)
设置纹理环绕模式。
属性
unsigned int GetID() const
获取 OpenGL texture ID。
OpenGLTextureType GetOpenGLType() const
获取纹理类型。
uint32_t GetWidth() const override
uint32_t GetHeight() const override
uint32_t GetDepth() const override
uint32_t GetMipLevels() const override
TextureType GetTextureType() const override
转换为 RHI TextureType。
void* GetNativeHandle() override
Format GetFormat() const override / void SetFormat(Format format)
const std::string& GetName() const override / void SetName(...)
内部成员
| 成员 | 类型 | 描述 |
|---|---|---|
m_texture |
unsigned int |
GL texture ID |
m_type |
OpenGLTextureType |
纹理类型 |
m_width/height/depth |
int |
尺寸 |
m_mipLevels |
int |
Mipmap 级别 |
m_channels |
int |
通道数 |
m_format |
Format |
RHI 格式 |
m_name |
std::string |
名称 |
使用示例
// Load from file
OpenGLTexture diffuse;
diffuse.LoadFromFile("textures/diffuse.png");
// Create from data
OpenGLTexture texture;
unsigned char pixels[] = { ... };
texture.Initialize2D(512, 512, 4, pixels);
texture.SetFiltering(GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR);
texture.SetWrapping(GL_REPEAT, GL_REPEAT);
texture.GenerateMipmap();
// Bind
texture.Bind(0);
glBindTextureUnit(0, texture.GetID());
// Compute image binding
texture.BindImage(0, true, false);