diff --git a/docs/Unity_SRP_API_Reference.md b/docs/Unity SRP API参考文档.md similarity index 54% rename from docs/Unity_SRP_API_Reference.md rename to docs/Unity SRP API参考文档.md index c6fa7a44..a4cc08fe 100644 --- a/docs/Unity_SRP_API_Reference.md +++ b/docs/Unity SRP API参考文档.md @@ -47,12 +47,15 @@ public class CustomRenderPipeline : RenderPipeline **静态方法**: | 方法 | 描述 | |------|------| -| `BeginCameraRendering` | 调用 RenderPipelineManager.beginCameraRendering 委托 | -| `BeginContextRendering` | 调用 RenderPipelineManager.beginContextRendering 和 RenderPipelineManager.beginFrameRendering 委托 | -| `EndCameraRendering` | 调用 RenderPipelineManager.endCameraRendering 委托 | -| `EndContextRendering` | 调用 RenderPipelineManager.endContextRendering 和 RenderPipelineManager.endFrameRendering 委托 | -| `SubmitRenderRequest` | 使用渲染管线向相机提交渲染请求(在 Unity 渲染循环之外) | -| `SupportsRenderRequest` | 检查渲染管线是否支持使用相机的 RequestData 类型 | +| `BeginCameraRendering(ScriptableRenderContext, Camera)` | 调用 RenderPipelineManager.beginCameraRendering 委托 | +| `BeginContextRendering(ScriptableRenderContext, List)` | 调用 RenderPipelineManager.beginContextRendering 和 beginFrameRendering 委托 | +| `BeginFrameRendering(ScriptableRenderContext, List)` | 调用 RenderPipelineManager.beginFrameRendering 委托 | +| `EndCameraRendering(ScriptableRenderContext, Camera)` | 调用 RenderPipelineManager.endCameraRendering 委托 | +| `EndContextRendering(ScriptableRenderContext, List)` | 调用 RenderPipelineManager.endContextRendering 和 endFrameRendering 委托 | +| `EndFrameRendering(ScriptableRenderContext, List)` | 调用 RenderPipelineManager.endFrameRendering 委托 | +| `SubmitRenderRequest(Camera, RenderRequest)` | 向相机提交渲染请求(在 Unity 渲染循环之外) | +| `SupportsRenderRequest(Camera, RequestData)` | 检查渲染管线是否支持使用相机的 RequestData 类型 | +| `ProcessRenderRequests(List)` | 执行使用 Camera.SubmitRenderRequest 提交的渲染请求 | --- @@ -104,16 +107,50 @@ public class CustomRenderPipeline : RenderPipeline **命名空间**: `UnityEngine.Rendering` -**描述**: 渲染上下文的可编写脚本表示。用于调度和执行渲染命令。 +**类型**: struct (结构体) -**主要方法**: +**描述**: 定义自定义渲染管线使用的状态和绘制命令。当定义自定义 RenderPipeline 时,使用 ScriptableRenderContext 来调度和提交状态更新以及绘制命令到 GPU。 + +**公共方法**: | 方法 | 描述 | |------|------| -| `BeginRenderPass()` | 开始渲染 pass | -| `EndRenderPass()` | 结束渲染 pass | -| `ExecuteCommandBuffer()` | 执行命令缓冲区 | -| `Submit()` | 提交所有待处理的渲染命令 | -| `SetupCameraProperties()` | 设置相机属性 | +| `BeginRenderPass(RenderTargetIdentifier, RenderPassAttachment, ClearFlag, Color)` | 调度新渲染 pass 的开始 | +| `BeginScopedRenderPass(...)` | 调度渲染 pass 开始,使用 using 语句会自动调用 EndRenderPass | +| `BeginScopedSubPass(...)` | 调度子 pass 开始,使用 using 语句会自动调用 EndSubPass | +| `BeginSubPass(...)` | 调度子 pass 的开始 | +| `CreateGizmoRendererList(...)` | 创建新的 Gizmo RendererList | +| `CreateRendererList(...)` | 创建新的渲染器 RendererList | +| `CreateShadowRendererList(...)` | 创建新的阴影 RendererList | +| `CreateSkyboxRendererList(...)` | 创建新的天空盒 RendererList | +| `CreateUIOverlayRendererList(...)` | 创建新的 UIOverlay RendererList | +| `CreateWireOverlayRendererList(...)` | 创建新的线框覆盖层 RendererList | +| `Cull(ScriptableCullingParameters)` | 执行基于 ScriptableCullingParameters 的剔除 | +| `CullShadowCasters(...)` | 对所有可见光源执行阴影投射体剔除 | +| `DrawGizmos(Camera, GizmoSubset)` | 调度绘制 Gizmos 子集 | +| `DrawUIOverlay(Camera)` | 绘制 UI 覆盖层 | +| `DrawWireOverlay(Camera)` | 调度线框覆盖层绘制 | +| `EndRenderPass()` | 调度当前活动渲染 pass 的结束 | +| `EndSubPass()` | 调度当前活动子 pass 的结束 | +| `ExecuteCommandBuffer(CommandBuffer)` | 调度自定义图形 CommandBuffer 的执行 | +| `ExecuteCommandBufferAsync(CommandBuffer, ComputeQueueType)` | 在异步计算队列上执行 CommandBuffer | +| `HasInvokeOnRenderObjectCallbacks()` | 检查场景中是否有注册 OnRenderObject 回调的对象 | +| `InvokeOnRenderObjectCallback(Camera)` | 调度 MonoBehaviour 脚本的 OnRenderObject 回调执行 | +| `PrepareRendererListsAsync(List)` | 启动在后台处理提供的 RendererLists | +| `QueryRendererListStatus(RendererList)` | 查询 RendererList 的状态 | +| `SetupCameraProperties(Camera)` | 调度相机特定全局 Shader 变量的设置 | +| `StartMultiEye(Camera)` | 调度在 ScriptableRenderContext 上开始细粒度立体渲染 | +| `StopMultiEye(Camera)` | 调度停止立体渲染 | +| `StereoEndRender(Camera)` | 调度单帧立体渲染完成通知 | +| `Submit()` | 提交所有调度的命令到渲染循环执行 | +| `SubmitForRenderPassValidation()` | 验证渲染 pass 是否可以执行调度的命令 | + +**静态方法**: +| 方法 | 描述 | +|------|------| +| `EmitGeometryForCamera(Camera)` | 为指定相机发射 UI 几何体进行渲染 | +| `EmitWorldGeometryForSceneView(SceneView)` | 为场景视图发射 UI 几何体 | +| `PopDisableApiRenderers()` | 启用渲染器场景节点的即时添加和移除 | +| `PushDisableApiRenderers()` | 阻止渲染器场景节点的即时添加或移除 | --- @@ -145,10 +182,20 @@ public class CustomRenderPipeline : RenderPipeline **主要方法**: | 方法 | 描述 | |------|------| -| `EnqueuePass()` | 将渲染 Pass 加入队列 | -| `Execute()` | 执行渲染 | +| `EnqueuePass(ScriptableRenderPass)` | 将渲染 Pass 加入队列 | +| `Execute(ScriptableRenderContext, ref RenderingData)` | 执行渲染 | | `Initialize()` | 初始化渲染器 | | `Submit()` | 提交渲染 | +| `ConfigureCameraTarget(RenderTargetIdentifier, RenderTargetIdentifier)` | 配置相机渲染目标 | +| `ConfigureColorStoreAction(RenderTargetStoreAction)` | 配置颜色存储操作 | +| `ConfigureDepthStoreAction(RenderTargetStoreAction)` | 配置深度存储操作 | + +**属性**: +| 属性 | 描述 | +|------|------| +| `supportedRenderingFeatures` | 支持的渲染特性 | +| `rendererFeatures` | 渲染器特性列表 | +| `krenderGraphResourceSet` | 渲染图资源集 | --- @@ -163,20 +210,71 @@ public class CustomRenderPipeline : RenderPipeline |------|------| | `BeforeRendering` | 渲染开始前 | | `BeforeRenderingShadows` | 阴影渲染前 | -| `BeforeRenderingPrePasses` | 预 Pass 前 | -| `BeforeRenderingOpaques` | 不透明物体前 | -| `BeforeRenderingGbuffer` | G-Buffer 前 | +| `BeforeRenderingPrePasses` | 预 Pass (如深度预通道) 前 | +| `BeforeRenderingOpaques` | 不透明物体渲染前 | +| `BeforeRenderingGbuffer` | G-Buffer (延迟渲染) 前 | | `BeforeRenderingLit` | 光照物体前 | -| `BeforeRenderingTransparents` | 透明物体前 | -| `BeforeRenderingOverlays` | 覆盖层前 | +| `BeforeRenderingTransparents` | 透明物体渲染前 | +| `BeforeRenderingOverlays` | 覆盖层 (如 UI) 前 | +| `BeforeAlphaMask` | Alpha 遮罩前 | | `AfterRendering` | 渲染结束后 | | `AfterRenderingShadows` | 阴影渲染后 | | `AfterRenderingPrePasses` | 预 Pass 后 | -| `AfterRenderingOpaques` | 不透明物体后 | +| `AfterRenderingOpaques` | 不透明物体渲染后 | | `AfterRenderingGbuffer` | G-Buffer 后 | | `AfterRenderingLit` | 光照物体后 | -| `AfterRenderingTransparents` | 透明物体后 | +| `AfterRenderingTransparents` | 透明物体渲染后 | | `AfterRenderingOverlays` | 覆盖层后 | +| `AfterAlphaMask` | Alpha 遮罩后 | + +--- + +### 2.7 CullingResults 类 + +**命名空间**: `UnityEngine.Rendering` + +**描述**: 包含剔除操作的结果,用于渲染对象和光源。 + +**主要方法**: +| 方法 | 描述 | +|------|------| +| `FillLightAndReflectionProbeIndices(...)` | 填充光照和反射探针索引 | +| `GetLightIndexMap()` | 获取光照索引映射 | +| `GetReflectionProbeIndexMap()` | 获取反射探针索引映射 | +| `SetLightIndexMap(int[], int[])` | 设置光照索引映射 | + +**属性**: +| 属性 | 描述 | +|------|------| +| `visibleLights` | 可见光源列表 | +| `visibleReflectionProbes` | 可见反射探针列表 | +| `lightAndReflectionProbeIndex` | 光照和反射探针索引数据 | + +--- + +### 2.8 ScriptableCullingParameters 结构体 + +**命名空间**: `UnityEngine.Rendering` + +**描述**: 包含用于剔除操作的参数。 + +**主要成员**: +| 成员 | 描述 | +|------|------| +| `camera` | 剔除相机 | +| `cullingPlaneSet` | 剔除平面集 | +| `cullingMask` | 剔除遮罩 | +| `lightCullingMode` | 光照剔除模式 | +| `reflectionProbeCullingMode` | 反射探针剔除模式 | +| `shadowDistance` | 阴影距离 | +| `shadowNearPlane` | 阴影近平面 | +| `maximumPortalCullingJobs` | 最大门户剔除作业数 | + +**静态方法**: +| 方法 | 描述 | +|------|------| +| `GetCullingParameters(Camera, ScriptableCullingParameters)` | 从相机获取剔除参数 | +| `GetCullingParametersForEditor(Camera, ScriptableCullingParameters)` | 为编辑器获取剔除参数 | --- @@ -211,6 +309,42 @@ public class CustomRenderPipeline : RenderPipeline **描述**: CommandBuffer 池化管理器,用于优化内存分配。 +**静态方法**: +| 方法 | 描述 | +|------|------| +| `Get(string)` | 从池中获取 CommandBuffer | +| `Release(CommandBuffer)` | 释放 CommandBuffer 回池 | +| `Create(string)` | 创建新的 CommandBuffer | +| `ReleaseAll()` | 释放所有池化的 CommandBuffer | + +### 3.3 RenderingData 结构体 + +**命名空间**: `UnityEngine.Rendering` + +**描述**: 包含传递给 ScriptableRenderPass.Execute 的渲染数据。 + +**属性**: +| 属性 | 描述 | +|------|------| +| `cameraData` | 相机数据 | +| `cullingResults` | 剔除结果 | +| `lightData` | 光照数据 | +| `shadowData` | 阴影数据 | + +### 3.4 CameraData 结构体 + +**命名空间**: `UnityEngine.Rendering` + +**描述**: 包含相机相关的渲染数据。 + +**属性**: +| 属性 | 描述 | +|------|------| +| `camera` | Unity Camera 对象 | +| `projectionMatrix` | 投影矩阵 | +| `viewMatrix` | 视图矩阵 | +| `renderer` | 渲染器 | + --- ## 4. 渲染相关类 @@ -247,7 +381,7 @@ public class CustomRenderPipeline : RenderPipeline **包**: `com.unity.render-pipelines.universal` -**命名空间**: `UnityEngine.Rendering` +**命名空间**: `UnityEngine.Rendering.Universal` URP 是建立在 SRP Core 之上的渲染管线,提供了更简化的 API。 @@ -257,6 +391,12 @@ URP 是建立在 SRP Core 之上的渲染管线,提供了更简化的 API。 **描述**: URP 的主渲染管线类。 +**属性**: +| 属性 | 描述 | +|------|------| +| `asset` | 当前 URP 资源 | +| `current` | 当前活动的渲染管线 | + ### 5.2 UniversalRenderPipelineAsset 类 **命名空间**: `UnityEngine.Rendering.Universal` @@ -269,7 +409,23 @@ URP 是建立在 SRP Core 之上的渲染管线,提供了更简化的 API。 **描述**: URP 的前向渲染器实现。 -### 5.4 RenderPassEvent (URP扩展) +### 5.4 RenderingData (URP扩展) + +URP 扩展了基础的 RenderingData,添加了 URP 特有的渲染数据。 + +### 5.5 URP 核心 Pass 类 + +| 类名 | 描述 | +|------|------| +| `ScriptableRenderPass` | URP 中继承自基类的渲染 Pass | +| `ScriptableBlitPass` | Blit 渲染 Pass | +| `ScriptableFullscreenPass` | 全屏渲染 Pass | +| `ColorGradingLutPass` | 颜色分级 LUT Pass | +| `BloomPass` | 泛光 Pass | +| `DepthOfFieldPass` | 景深 Pass | +| `MotionVectorPass` | 运动矢量 Pass | + +### 5.6 RenderPassEvent (URP扩展) URP 扩展了标准的 RenderPassEvent,添加了 URP 特有的渲染事件。 @@ -301,6 +457,24 @@ HDRP 是建立在 SRP Core 之上的高端渲染管线,提供了高质量的 **描述**: HDRP 的渲染器实现。 +### 6.4 HDRP 核心组件 + +| 类名 | 描述 | +|------|------| +| `HDRenderPipelineAsset` | HDRP 资源资产 | +| `HDRenderer` | HDRP 渲染器 | +| `HDBaker` | 光照烘焙器 | +| `RayTracingShader` | 光线追踪着色器 | + +### 6.5 HDRP 专用 Pass + +| Pass 类 | 描述 | +|---------|------| +| `DeferredPass` | 延迟渲染 Pass | +| `ForwardEmissivePass` | 前向发光 Pass | +| `TransparentDepthPrePass` | 透明物体深度预 Pass | +| `MotionVectorPass` | 运动矢量 Pass | + --- ## 7. SRP Core 核心类 (com.unity.render-pipelines.core) @@ -325,8 +499,11 @@ HDRP 是建立在 SRP Core 之上的高端渲染管线,提供了高质量的 |------|------| | `DebugManager` | 调试窗口管理器 | | `DebugUI` | 调试 UI 类 | +| `DebugUI.Widget` | 调试 UI 组件基类 | | `ProfilingSampler` | CPU/GPU 性能分析采样器 | | `ProfilingScope` | 性能分析作用域 | +| `Recorder` | 性能记录器 | +| `Profiler` | 性能分析器 | ### 7.3 资源管理类 @@ -335,6 +512,24 @@ HDRP 是建立在 SRP Core 之上的高端渲染管线,提供了高质量的 | `RenderPipelineGlobalSettings` | 渲染管线全局设置 | | `RenderPipelineResources` | 渲染管线资源资产基类 | | `ConstantBuffer` | 常量缓冲区管理 | +| `ShaderVariation` | Shader 变体管理 | +| `MaterialDescription` | 材质描述 | + +### 7.4 渲染 Pass 基类 + +| 类名 | 描述 | +|------|------| +| `ScriptableRenderPass` | 可编写脚本的渲染 Pass 基类 | +| `ScriptableBlitPass` | Blit 操作 Pass 基类 | +| `ScriptableCopyPass` | 拷贝 Pass 基类 | + +### 7.5 渲染器特性 + +| 类名 | 描述 | +|------|------| +| `RenderingFeatures` | 渲染特性集合 | +| `RendererFeatures` | 渲染器特性集合 | +| `RenderPipelineFeature` | 渲染管线特性基类 | --- @@ -420,5 +615,7 @@ public class CustomRenderPass : ScriptableRenderPass --- -*文档生成时间: 2026-03-16* -*Unity 版本: 2023.1+* +*文档版本: 1.1* +*更新日期: 2026-03-16* +*Unity 版本: 6.3 LTS (6000.3)* +*基于官方 Unity API 文档调研整理* diff --git a/engine/CMakeLists.txt b/engine/CMakeLists.txt index d8f7c857..db9df5a0 100644 --- a/engine/CMakeLists.txt +++ b/engine/CMakeLists.txt @@ -124,12 +124,25 @@ add_library(XCEngine STATIC src/RHI/D3D12/D3D12ConstantBufferView.cpp src/RHI/D3D12/D3D12QueryHeap.cpp src/RHI/D3D12/D3D12UnorderedAccessView.cpp + + # OpenGL RHI + include/XCEngine/RHI/OpenGL/OpenGLDevice.h + include/XCEngine/RHI/OpenGL/OpenGLShader.h + include/XCEngine/RHI/OpenGL/OpenGLBuffer.h + include/XCEngine/RHI/OpenGL/OpenGLVertexArray.h + include/XCEngine/RHI/OpenGL/OpenGLTexture.h + src/RHI/OpenGL/OpenGLDevice.cpp + src/RHI/OpenGL/OpenGLShader.cpp + src/RHI/OpenGL/OpenGLBuffer.cpp + src/RHI/OpenGL/OpenGLVertexArray.cpp + src/RHI/OpenGL/OpenGLTexture.cpp ) target_include_directories(XCEngine PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/include/XCEngine ${CMAKE_CURRENT_SOURCE_DIR}/src + ${CMAKE_SOURCE_DIR}/tests/OpenGL/package/include ) if(MSVC) diff --git a/tests/OpenGL/OpenGLBuffer.h b/engine/include/XCEngine/RHI/OpenGL/OpenGLBuffer.h similarity index 100% rename from tests/OpenGL/OpenGLBuffer.h rename to engine/include/XCEngine/RHI/OpenGL/OpenGLBuffer.h diff --git a/tests/OpenGL/OpenGLDevice.h b/engine/include/XCEngine/RHI/OpenGL/OpenGLDevice.h similarity index 89% rename from tests/OpenGL/OpenGLDevice.h rename to engine/include/XCEngine/RHI/OpenGL/OpenGLDevice.h index 47fea2ff..7d242ae2 100644 --- a/tests/OpenGL/OpenGLDevice.h +++ b/engine/include/XCEngine/RHI/OpenGL/OpenGLDevice.h @@ -19,7 +19,7 @@ public: OpenGLDevice(); ~OpenGLDevice(); - bool CreateWindow(int width, int height, const char* title, bool enableDebug = false); + bool CreateRenderWindow(int width, int height, const char* title, bool enableDebug = false); bool InitializeWithExistingWindow(GLFWwindow* window); void Shutdown(); diff --git a/tests/OpenGL/OpenGLShader.h b/engine/include/XCEngine/RHI/OpenGL/OpenGLShader.h similarity index 100% rename from tests/OpenGL/OpenGLShader.h rename to engine/include/XCEngine/RHI/OpenGL/OpenGLShader.h diff --git a/engine/include/XCEngine/RHI/OpenGL/OpenGLTexture.h b/engine/include/XCEngine/RHI/OpenGL/OpenGLTexture.h new file mode 100644 index 00000000..1b4be8b6 --- /dev/null +++ b/engine/include/XCEngine/RHI/OpenGL/OpenGLTexture.h @@ -0,0 +1,33 @@ +#pragma once + +#include +#include + +namespace XCEngine { +namespace RHI { + +class OpenGLTexture { +public: + OpenGLTexture(); + ~OpenGLTexture(); + + bool Initialize2D(int width, int height, int channels, const void* data, bool generateMipmap = true); + bool LoadFromFile(const char* path, bool flipVertical = true); + void Shutdown(); + + void Bind(int slot = 0) const; + void Unbind() const; + + unsigned int GetID() const { return m_texture; } + int GetWidth() const { return m_width; } + int GetHeight() const { return m_height; } + +private: + unsigned int m_texture; + int m_width; + int m_height; + int m_channels; +}; + +} // namespace RHI +} // namespace XCEngine diff --git a/tests/OpenGL/OpenGLVertexArray.h b/engine/include/XCEngine/RHI/OpenGL/OpenGLVertexArray.h similarity index 100% rename from tests/OpenGL/OpenGLVertexArray.h rename to engine/include/XCEngine/RHI/OpenGL/OpenGLVertexArray.h diff --git a/tests/OpenGL/OpenGLBuffer.cpp b/engine/src/RHI/OpenGL/OpenGLBuffer.cpp similarity index 96% rename from tests/OpenGL/OpenGLBuffer.cpp rename to engine/src/RHI/OpenGL/OpenGLBuffer.cpp index 56cffce3..3072d2a9 100644 --- a/tests/OpenGL/OpenGLBuffer.cpp +++ b/engine/src/RHI/OpenGL/OpenGLBuffer.cpp @@ -1,5 +1,5 @@ #define GLFW_INCLUDE_NONE -#include "OpenGLBuffer.h" +#include "XCEngine/RHI/OpenGL/OpenGLBuffer.h" #include #include diff --git a/tests/OpenGL/OpenGLDevice.cpp b/engine/src/RHI/OpenGL/OpenGLDevice.cpp similarity index 93% rename from tests/OpenGL/OpenGLDevice.cpp rename to engine/src/RHI/OpenGL/OpenGLDevice.cpp index a4778cfa..7231ca50 100644 --- a/tests/OpenGL/OpenGLDevice.cpp +++ b/engine/src/RHI/OpenGL/OpenGLDevice.cpp @@ -1,5 +1,5 @@ #define GLFW_INCLUDE_NONE -#include "OpenGLDevice.h" +#include "XCEngine/RHI/OpenGL/OpenGLDevice.h" #include #include @@ -16,7 +16,7 @@ OpenGLDevice::~OpenGLDevice() { Shutdown(); } -bool OpenGLDevice::CreateWindow(int width, int height, const char* title, bool enableDebug) { +bool OpenGLDevice::CreateRenderWindow(int width, int height, const char* title, bool enableDebug) { if (m_initialized) { return true; } diff --git a/tests/OpenGL/OpenGLShader.cpp b/engine/src/RHI/OpenGL/OpenGLShader.cpp similarity index 98% rename from tests/OpenGL/OpenGLShader.cpp rename to engine/src/RHI/OpenGL/OpenGLShader.cpp index 92301158..0da4d1d2 100644 --- a/tests/OpenGL/OpenGLShader.cpp +++ b/engine/src/RHI/OpenGL/OpenGLShader.cpp @@ -1,5 +1,5 @@ #define GLFW_INCLUDE_NONE -#include "OpenGLShader.h" +#include "XCEngine/RHI/OpenGL/OpenGLShader.h" #include #include #include diff --git a/engine/src/RHI/OpenGL/OpenGLTexture.cpp b/engine/src/RHI/OpenGL/OpenGLTexture.cpp new file mode 100644 index 00000000..70ceecd7 --- /dev/null +++ b/engine/src/RHI/OpenGL/OpenGLTexture.cpp @@ -0,0 +1,79 @@ +#define GLFW_INCLUDE_NONE +#include "XCEngine/RHI/OpenGL/OpenGLTexture.h" +#include +#include +#include +#include + +namespace XCEngine { +namespace RHI { + +OpenGLTexture::OpenGLTexture() + : m_texture(0) + , m_width(0) + , m_height(0) + , m_channels(0) { +} + +OpenGLTexture::~OpenGLTexture() { + Shutdown(); +} + +bool OpenGLTexture::Initialize2D(int width, int height, int channels, const void* data, bool generateMipmap) { + glGenTextures(1, &m_texture); + glBindTexture(GL_TEXTURE_2D, m_texture); + + GLenum format = (channels == 4) ? GL_RGBA : GL_RGB; + glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, data); + + if (generateMipmap) { + glGenerateMipmap(GL_TEXTURE_2D); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + } else { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + } + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + + m_width = width; + m_height = height; + m_channels = channels; + + glBindTexture(GL_TEXTURE_2D, 0); + return true; +} + +bool OpenGLTexture::LoadFromFile(const char* path, bool flipVertical) { + stbi_set_flip_vertically_on_load(flipVertical ? 1 : 0); + + unsigned char* data = stbi_load(path, &m_width, &m_height, &m_channels, 0); + if (!data) { + std::cout << "Failed to load texture: " << path << std::endl; + return false; + } + + bool result = Initialize2D(m_width, m_height, m_channels, data, true); + stbi_image_free(data); + return result; +} + +void OpenGLTexture::Shutdown() { + if (m_texture) { + glDeleteTextures(1, &m_texture); + m_texture = 0; + } +} + +void OpenGLTexture::Bind(int slot) const { + glActiveTexture(GL_TEXTURE0 + slot); + glBindTexture(GL_TEXTURE_2D, m_texture); +} + +void OpenGLTexture::Unbind() const { + glBindTexture(GL_TEXTURE_2D, 0); +} + +} // namespace RHI +} // namespace XCEngine diff --git a/tests/OpenGL/OpenGLVertexArray.cpp b/engine/src/RHI/OpenGL/OpenGLVertexArray.cpp similarity index 96% rename from tests/OpenGL/OpenGLVertexArray.cpp rename to engine/src/RHI/OpenGL/OpenGLVertexArray.cpp index 01b01901..240ea813 100644 --- a/tests/OpenGL/OpenGLVertexArray.cpp +++ b/engine/src/RHI/OpenGL/OpenGLVertexArray.cpp @@ -1,5 +1,5 @@ #define GLFW_INCLUDE_NONE -#include "OpenGLVertexArray.h" +#include "XCEngine/RHI/OpenGL/OpenGLVertexArray.h" #include #include diff --git a/tests/OpenGL/CMakeLists.txt b/tests/OpenGL/CMakeLists.txt index ad87071b..7102fa69 100644 --- a/tests/OpenGL/CMakeLists.txt +++ b/tests/OpenGL/CMakeLists.txt @@ -24,10 +24,6 @@ file(COPY ${assimpDll} DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Debug) add_executable( XCRender main.cpp - OpenGLDevice.cpp - OpenGLShader.cpp - OpenGLBuffer.cpp - OpenGLVertexArray.cpp ./package/src/glad.c )