概述
一、AIGC 的核心定义
AIGC = 人类提供需求 + AI自动生成内容
例如:
| 人类输入 | AI生成 |
|---|---|
| 写一篇科幻小说 | AI生成完整故事 |
| 输入提示词 | AI生成图片 |
| 上传角色图 | AI生成动画视频 |
| 描述音乐风格 | AI生成音乐 |
AIGC = 人类提供需求 + AI自动生成内容
例如:
| 人类输入 | AI生成 |
|---|---|
| 写一篇科幻小说 | AI生成完整故事 |
| 输入提示词 | AI生成图片 |
| 上传角色图 | AI生成动画视频 |
| 描述音乐风格 | AI生成音乐 |
是通过摄影机的构图、镜头运动、景别、角度、光影等视觉手段,将创作者的叙事意图、情绪表达和信息传递给观众的视觉表达体系。
例如
一个年轻程序员加班到深夜,毫无灵感。
朋友打来电话邀请他打游戏,
他犹豫后决定放松一下,结果一夜未眠。
固定管线时代: 在早期的游戏引擎中,使用固定管线图形渲染流水线。灯光通常是基于简单的光照模型,如冯·肖定律(Phong Shading)等。这种方法的计算相对简单,但在细节和真实感方面表现一般。
可编程管线和着色器: 随着可编程图形管线的出现,引擎可以更灵活地处理灯光。开发者可以使用自定义的着色器编写更复杂的光照算法,如基于物理的渲染(Physically Based Rendering,PBR)。PBR模型更准确地模拟了真实世界中光的反射和折射。
实时光照技术: 引擎开始引入实时光照技术,如实时全局光照(Real-Time Global Illumination)和实时阴影技术。这些技术旨在模拟真实世界中的光照效果,提高场景的真实感。包括屏幕空间反射(Screen Space Reflection)和环境遮挡(Ambient Occlusion)等技术。
实时光追: 随着硬件性能的提升,一些引擎引入了实时光追技术,这种技术通过模拟光线在场景中的传播来实现更高质量的光照效果。实时光追通常需要更强大的计算资源,但可以提供更真实的光照和阴影。
深度学习和实时渲染: 最近,深度学习技术开始应用于游戏渲染,例如基于机器学习的超分辨率技术、反走样和实时光照估计等。这些技术旨在通过神经网络等方法改善实时渲染的质量和性能。
FGraphPanelNodeFactoryUEdGraphNode ——(NodeFactory)——> SGraphNode
数据节点 UI节点
UEdGraphNode = 编辑器数据节点(逻辑层)SGraphNode = 视觉层 Slate Widget(长什么样)FGraphPanelNodeFactory = 决定这个节点显示成什么样FEdGraphSchemaActionUEdGraphSchema派生类中重写注释GetCreateCommentAction节点 virtual TSharedPtr<FEdGraphSchemaAction> GetCreateCommentAction() const override
{
return TSharedPtr<FEdGraphSchemaAction>(static_cast<FEdGraphSchemaAction*>(new FComboSchemaAction_AddComment));
}
在UE5中,往往有一些定时的需求,比如一段时间内开启护盾(当然这里咱们不考虑使用GAS的GE等效果来实现),这时候往往需要自己设定一个定时器, 给定一个时间用来开启关闭特效。
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category="DoodleJump")
bool bHasShield = false;
UFUNCTION()
void RemoveShield();
void ADoodleJumpCharacter::GenerateShield_Implementation(float Time)
{
// 如果之前没有护盾才播放护盾开启特效
if (!bHasShield)
{
ShowShieldEffect(true);
}
bHasShield = true;
// 重置计时器(重新计时 / 延长)
GetWorldTimerManager().ClearTimer(ShieldTimerHandle);
GetWorldTimerManager().SetTimer(
ShieldTimerHandle,
this,
&ADoodleJumpCharacter::RemoveShield,
Time,
false
);
UE_LOG(LogTemp, Log, TEXT("Shield %s for %.2f seconds"),
bHasShield ? TEXT("extended") : TEXT("activated"),
Time);
}
void ADoodleJumpCharacter::RemoveShield()
{
bHasShield = false;
ShowShieldEffect(false);
UE_LOG(LogTemp, Log, TEXT("Shield Expired"));
}
UE 的碰撞系统由三部分组成:
碰撞通道(Collision Channel)
用于标记对象所属类型。
UE 内置两种类型:
Pawn、WorldStatic、WorldDynamic。 // 设置光照模式
UFUNCTION(BlueprintCallable)
void SetViewMode(EViewModeIndex ViewMode) {
ApplyViewMode(ViewMode, false, GEngine->GameViewport->EngineShowFlags);
GEngine->GameViewport->ViewModeIndex = ViewMode;
}
最近在做道具轮盘,大致流程是按下某个按键,弹出一个轮盘,使用鼠标或者手柄来选择某个插槽。 本篇记录一下实现中的一些坑。
FVector2D URadialWheelWidget::GetWheelCenterPosition()
{
if (!WheelOverlay)
{
return FVector2D::ZeroVector;
}
// 获取 Overlay 的几何信息
const FGeometry& Geometry = WheelOverlay->GetCachedGeometry();
// 本地中心点
const FVector2D LocalCenter = Geometry.GetLocalSize() * 0.5f;
// 转换到绝对屏幕坐标
FVector2D PixelPosition;
FVector2D ViewportPosition;
USlateBlueprintLibrary::LocalToViewport(this, Geometry, LocalCenter, PixelPosition, ViewportPosition);
// 加上DPI缩放
return ViewportPosition * UWidgetLayoutLibrary::GetViewportScale(this);
}
void URadialWheelWidget::CalcAngleAndDistanceFromDir(const FVector2D& Dir, float& OutAngle, double& OutDistance) const
{
OutDistance = Dir.Size();
if (!Dir.IsNearlyZero())
{
// Y 翻转
OutAngle = FMath::RadiansToDegrees(FMath::Atan2(Dir.Y, Dir.X)) + 90.f;
OutAngle = FRotator::ClampAxis(OutAngle);
}
else
{
OutDistance = 0.0;
OutAngle = 0.f;
}
}
FVector2D URadialWheelWidget::GetMousePosition()
{
float Angle = 0.f;
double Distance = 0.0;
//1. 获取鼠标在屏幕中的绝对位置(考虑DPI缩放)
const FVector2D MousePos = UWidgetLayoutLibrary::GetMousePositionOnViewport(this) *
UWidgetLayoutLibrary::GetViewportScale(this);
//2.获取轮盘中心坐标
const FVector2D Center = GetWheelCenterPosition();
//3.计算偏移向量
const FVector2D Dir = MousePos - Center;
//4.计算角度和距离
CalcAngleAndDistanceFromDir(Dir, Angle, Distance);
}