Move OpenGL backend classes from tests/OpenGL to engine/

- Relocated OpenGLDevice, OpenGLShader, OpenGLBuffer, OpenGLVertexArray, OpenGLTexture to engine/
- Updated engine/CMakeLists.txt to include OpenGL backend source files
- Updated tests/OpenGL/CMakeLists.txt to use engine backend
- Added OpenGLTexture class implementation
This commit is contained in:
2026-03-16 17:22:45 +08:00
parent 434ba0f336
commit fee738b0b9
13 changed files with 354 additions and 36 deletions

View File

@@ -47,12 +47,15 @@ public class CustomRenderPipeline : RenderPipeline
**静态方法**: **静态方法**:
| 方法 | 描述 | | 方法 | 描述 |
|------|------| |------|------|
| `BeginCameraRendering` | 调用 RenderPipelineManager.beginCameraRendering 委托 | | `BeginCameraRendering(ScriptableRenderContext, Camera)` | 调用 RenderPipelineManager.beginCameraRendering 委托 |
| `BeginContextRendering` | 调用 RenderPipelineManager.beginContextRendering 和 RenderPipelineManager.beginFrameRendering 委托 | | `BeginContextRendering(ScriptableRenderContext, List<Camera>)` | 调用 RenderPipelineManager.beginContextRendering 和 beginFrameRendering 委托 |
| `EndCameraRendering` | 调用 RenderPipelineManager.endCameraRendering 委托 | | `BeginFrameRendering(ScriptableRenderContext, List<Camera>)` | 调用 RenderPipelineManager.beginFrameRendering 委托 |
| `EndContextRendering` | 调用 RenderPipelineManager.endContextRendering 和 RenderPipelineManager.endFrameRendering 委托 | | `EndCameraRendering(ScriptableRenderContext, Camera)` | 调用 RenderPipelineManager.endCameraRendering 委托 |
| `SubmitRenderRequest` | 使用渲染管线向相机提交渲染请求(在 Unity 渲染循环之外) | | `EndContextRendering(ScriptableRenderContext, List<Camera>)` | 调用 RenderPipelineManager.endContextRendering 和 endFrameRendering 委托 |
| `SupportsRenderRequest` | 检查渲染管线是否支持使用相机的 RequestData 类型 | | `EndFrameRendering(ScriptableRenderContext, List<Camera>)` | 调用 RenderPipelineManager.endFrameRendering 委托 |
| `SubmitRenderRequest(Camera, RenderRequest)` | 向相机提交渲染请求(在 Unity 渲染循环之外) |
| `SupportsRenderRequest(Camera, RequestData)` | 检查渲染管线是否支持使用相机的 RequestData 类型 |
| `ProcessRenderRequests(List<RenderRequest>)` | 执行使用 Camera.SubmitRenderRequest 提交的渲染请求 |
--- ---
@@ -104,16 +107,50 @@ public class CustomRenderPipeline : RenderPipeline
**命名空间**: `UnityEngine.Rendering` **命名空间**: `UnityEngine.Rendering`
**描述**: 渲染上下文的可编写脚本表示。用于调度和执行渲染命令。 **类型**: struct (结构体)
**主要方法**: **描述**: 定义自定义渲染管线使用的状态和绘制命令。当定义自定义 RenderPipeline 时,使用 ScriptableRenderContext 来调度和提交状态更新以及绘制命令到 GPU。
**公共方法**:
| 方法 | 描述 | | 方法 | 描述 |
|------|------| |------|------|
| `BeginRenderPass()` | 开始渲染 pass | | `BeginRenderPass(RenderTargetIdentifier, RenderPassAttachment, ClearFlag, Color)` | 调度新渲染 pass 的开始 |
| `EndRenderPass()` | 结束渲染 pass | | `BeginScopedRenderPass(...)` | 调度渲染 pass 开始,使用 using 语句会自动调用 EndRenderPass |
| `ExecuteCommandBuffer()` | 执行命令缓冲区 | | `BeginScopedSubPass(...)` | 调度子 pass 开始,使用 using 语句会自动调用 EndSubPass |
| `Submit()` | 提交所有待处理的渲染命令 | | `BeginSubPass(...)` | 调度子 pass 的开始 |
| `SetupCameraProperties()` | 设置相机属性 | | `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<RendererList>)` | 启动在后台处理提供的 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 加入队列 | | `EnqueuePass(ScriptableRenderPass)` | 将渲染 Pass 加入队列 |
| `Execute()` | 执行渲染 | | `Execute(ScriptableRenderContext, ref RenderingData)` | 执行渲染 |
| `Initialize()` | 初始化渲染器 | | `Initialize()` | 初始化渲染器 |
| `Submit()` | 提交渲染 | | `Submit()` | 提交渲染 |
| `ConfigureCameraTarget(RenderTargetIdentifier, RenderTargetIdentifier)` | 配置相机渲染目标 |
| `ConfigureColorStoreAction(RenderTargetStoreAction)` | 配置颜色存储操作 |
| `ConfigureDepthStoreAction(RenderTargetStoreAction)` | 配置深度存储操作 |
**属性**:
| 属性 | 描述 |
|------|------|
| `supportedRenderingFeatures` | 支持的渲染特性 |
| `rendererFeatures` | 渲染器特性列表 |
| `krenderGraphResourceSet` | 渲染图资源集 |
--- ---
@@ -163,20 +210,71 @@ public class CustomRenderPipeline : RenderPipeline
|------|------| |------|------|
| `BeforeRendering` | 渲染开始前 | | `BeforeRendering` | 渲染开始前 |
| `BeforeRenderingShadows` | 阴影渲染前 | | `BeforeRenderingShadows` | 阴影渲染前 |
| `BeforeRenderingPrePasses` | 预 Pass 前 | | `BeforeRenderingPrePasses` | 预 Pass (如深度预通道) 前 |
| `BeforeRenderingOpaques` | 不透明物体前 | | `BeforeRenderingOpaques` | 不透明物体渲染前 |
| `BeforeRenderingGbuffer` | G-Buffer 前 | | `BeforeRenderingGbuffer` | G-Buffer (延迟渲染) 前 |
| `BeforeRenderingLit` | 光照物体前 | | `BeforeRenderingLit` | 光照物体前 |
| `BeforeRenderingTransparents` | 透明物体前 | | `BeforeRenderingTransparents` | 透明物体渲染前 |
| `BeforeRenderingOverlays` | 覆盖层前 | | `BeforeRenderingOverlays` | 覆盖层 (如 UI) 前 |
| `BeforeAlphaMask` | Alpha 遮罩前 |
| `AfterRendering` | 渲染结束后 | | `AfterRendering` | 渲染结束后 |
| `AfterRenderingShadows` | 阴影渲染后 | | `AfterRenderingShadows` | 阴影渲染后 |
| `AfterRenderingPrePasses` | 预 Pass 后 | | `AfterRenderingPrePasses` | 预 Pass 后 |
| `AfterRenderingOpaques` | 不透明物体后 | | `AfterRenderingOpaques` | 不透明物体渲染后 |
| `AfterRenderingGbuffer` | G-Buffer 后 | | `AfterRenderingGbuffer` | G-Buffer 后 |
| `AfterRenderingLit` | 光照物体后 | | `AfterRenderingLit` | 光照物体后 |
| `AfterRenderingTransparents` | 透明物体后 | | `AfterRenderingTransparents` | 透明物体渲染后 |
| `AfterRenderingOverlays` | 覆盖层后 | | `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 池化管理器,用于优化内存分配。 **描述**: 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. 渲染相关类 ## 4. 渲染相关类
@@ -247,7 +381,7 @@ public class CustomRenderPipeline : RenderPipeline
**包**: `com.unity.render-pipelines.universal` **包**: `com.unity.render-pipelines.universal`
**命名空间**: `UnityEngine.Rendering` **命名空间**: `UnityEngine.Rendering.Universal`
URP 是建立在 SRP Core 之上的渲染管线,提供了更简化的 API。 URP 是建立在 SRP Core 之上的渲染管线,提供了更简化的 API。
@@ -257,6 +391,12 @@ URP 是建立在 SRP Core 之上的渲染管线,提供了更简化的 API。
**描述**: URP 的主渲染管线类。 **描述**: URP 的主渲染管线类。
**属性**:
| 属性 | 描述 |
|------|------|
| `asset` | 当前 URP 资源 |
| `current` | 当前活动的渲染管线 |
### 5.2 UniversalRenderPipelineAsset 类 ### 5.2 UniversalRenderPipelineAsset 类
**命名空间**: `UnityEngine.Rendering.Universal` **命名空间**: `UnityEngine.Rendering.Universal`
@@ -269,7 +409,23 @@ URP 是建立在 SRP Core 之上的渲染管线,提供了更简化的 API。
**描述**: URP 的前向渲染器实现。 **描述**: 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 特有的渲染事件。 URP 扩展了标准的 RenderPassEvent添加了 URP 特有的渲染事件。
@@ -301,6 +457,24 @@ HDRP 是建立在 SRP Core 之上的高端渲染管线,提供了高质量的
**描述**: HDRP 的渲染器实现。 **描述**: 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) ## 7. SRP Core 核心类 (com.unity.render-pipelines.core)
@@ -325,8 +499,11 @@ HDRP 是建立在 SRP Core 之上的高端渲染管线,提供了高质量的
|------|------| |------|------|
| `DebugManager` | 调试窗口管理器 | | `DebugManager` | 调试窗口管理器 |
| `DebugUI` | 调试 UI 类 | | `DebugUI` | 调试 UI 类 |
| `DebugUI.Widget` | 调试 UI 组件基类 |
| `ProfilingSampler` | CPU/GPU 性能分析采样器 | | `ProfilingSampler` | CPU/GPU 性能分析采样器 |
| `ProfilingScope` | 性能分析作用域 | | `ProfilingScope` | 性能分析作用域 |
| `Recorder` | 性能记录器 |
| `Profiler` | 性能分析器 |
### 7.3 资源管理类 ### 7.3 资源管理类
@@ -335,6 +512,24 @@ HDRP 是建立在 SRP Core 之上的高端渲染管线,提供了高质量的
| `RenderPipelineGlobalSettings` | 渲染管线全局设置 | | `RenderPipelineGlobalSettings` | 渲染管线全局设置 |
| `RenderPipelineResources` | 渲染管线资源资产基类 | | `RenderPipelineResources` | 渲染管线资源资产基类 |
| `ConstantBuffer` | 常量缓冲区管理 | | `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* *文档版本: 1.1*
*Unity 版本: 2023.1+* *更新日期: 2026-03-16*
*Unity 版本: 6.3 LTS (6000.3)*
*基于官方 Unity API 文档调研整理*

View File

@@ -124,12 +124,25 @@ add_library(XCEngine STATIC
src/RHI/D3D12/D3D12ConstantBufferView.cpp src/RHI/D3D12/D3D12ConstantBufferView.cpp
src/RHI/D3D12/D3D12QueryHeap.cpp src/RHI/D3D12/D3D12QueryHeap.cpp
src/RHI/D3D12/D3D12UnorderedAccessView.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 target_include_directories(XCEngine PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/include
${CMAKE_CURRENT_SOURCE_DIR}/include/XCEngine ${CMAKE_CURRENT_SOURCE_DIR}/include/XCEngine
${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/src
${CMAKE_SOURCE_DIR}/tests/OpenGL/package/include
) )
if(MSVC) if(MSVC)

View File

@@ -19,7 +19,7 @@ public:
OpenGLDevice(); OpenGLDevice();
~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); bool InitializeWithExistingWindow(GLFWwindow* window);
void Shutdown(); void Shutdown();

View File

@@ -0,0 +1,33 @@
#pragma once
#include <string>
#include <GLFW/glfw3.h>
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

View File

@@ -1,5 +1,5 @@
#define GLFW_INCLUDE_NONE #define GLFW_INCLUDE_NONE
#include "OpenGLBuffer.h" #include "XCEngine/RHI/OpenGL/OpenGLBuffer.h"
#include <glad/glad.h> #include <glad/glad.h>
#include <GLFW/glfw3.h> #include <GLFW/glfw3.h>

View File

@@ -1,5 +1,5 @@
#define GLFW_INCLUDE_NONE #define GLFW_INCLUDE_NONE
#include "OpenGLDevice.h" #include "XCEngine/RHI/OpenGL/OpenGLDevice.h"
#include <glad/glad.h> #include <glad/glad.h>
#include <GLFW/glfw3.h> #include <GLFW/glfw3.h>
@@ -16,7 +16,7 @@ OpenGLDevice::~OpenGLDevice() {
Shutdown(); 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) { if (m_initialized) {
return true; return true;
} }

View File

@@ -1,5 +1,5 @@
#define GLFW_INCLUDE_NONE #define GLFW_INCLUDE_NONE
#include "OpenGLShader.h" #include "XCEngine/RHI/OpenGL/OpenGLShader.h"
#include <glad/glad.h> #include <glad/glad.h>
#include <GLFW/glfw3.h> #include <GLFW/glfw3.h>
#include <fstream> #include <fstream>

View File

@@ -0,0 +1,79 @@
#define GLFW_INCLUDE_NONE
#include "XCEngine/RHI/OpenGL/OpenGLTexture.h"
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <stb_image.h>
#include <iostream>
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

View File

@@ -1,5 +1,5 @@
#define GLFW_INCLUDE_NONE #define GLFW_INCLUDE_NONE
#include "OpenGLVertexArray.h" #include "XCEngine/RHI/OpenGL/OpenGLVertexArray.h"
#include <glad/glad.h> #include <glad/glad.h>
#include <GLFW/glfw3.h> #include <GLFW/glfw3.h>

View File

@@ -24,10 +24,6 @@ file(COPY ${assimpDll} DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Debug)
add_executable( add_executable(
XCRender XCRender
main.cpp main.cpp
OpenGLDevice.cpp
OpenGLShader.cpp
OpenGLBuffer.cpp
OpenGLVertexArray.cpp
./package/src/glad.c ./package/src/glad.c
) )