雾化

2023-11-10

https://www.cnblogs.com/kenkao/archive/2011/08/14/2137726.html

风动和雾化都是相对而言比较简单的游戏特效,实现起来甚至比我们前一节提到的晴天光晕还要简单~

大家还记得上上节中我们为陆地种植的那片植被吗?现在我们在场景中加入风的效果,让草儿动起来 ^ ^

首先,我们来实现一个风动效果的Shader:

Wind.fx

原理非常简单,只有一句代码起到了实质性的作用,它使得所有效果应用顶点随时间呈现余弦状波动效果。

而其他所有的代码其实就相当于一个没有任何特效的固定管线~

下面我们应用它来改造原有的CPlantCollect类,其实也就是在其初始化时加载风动特效,而后绘制所有植被节点时应用之即可~

复制代码

/*-------------------------------------

代码清单:PlantCollect.cpp
来自:http://www.cnblogs.com/kenkao

-------------------------------------*/
bool CPlantCollect::LoadContent()
{
    // 创建纹理
    HRESULT hr = D3DXCreateTextureFromFile(g_pD3DDevice,"grass.png",&m_pGrassTexture);
    if(FAILED(hr))
        return false;

    // 加载风动效果
    m_pWindEffect = new CD3DEffect;
    if(!m_pWindEffect->LoadEffect("Wind.fx"))
        return false;

    m_hWindWVP  = m_pWindEffect->GetEffect()->GetParameterByName(0,"wvp");
    m_hWindTime = m_pWindEffect->GetEffect()->GetParameterByName(0,"time");
    m_pWindEffect->GetEffect()->SetTechnique("WindTech");
    m_pWindEffect->GetEffect()->SetTexture("tex",m_pGrassTexture);

    return true;
}
void CPlantCollect::Draw(float gameTick)
{
    // 禁用背面剔除
    g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);

    // 启用Alpha通道
    g_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
    g_pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
    g_pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

    // 开启Alpha检测
    g_pD3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
    g_pD3DDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);
    g_pD3DDevice->SetRenderState(D3DRS_ALPHAREF, 150);

    // 设置纹理、顶点缓冲区、索引缓冲区及顶点格式
    if(!m_pWindEffect)
        g_pD3DDevice->SetTexture(0,m_pGrassTexture);
    g_pD3DDevice->SetStreamSource(0, m_pVB, 0, sizeof(VertexPositionTex));
    g_pD3DDevice->SetIndices(m_pIB);
    g_pD3DDevice->SetFVF(VertexPositionTex::FVF);

    // 如果风动特效存在,则设置相应参数并开启特效
    if(m_pWindEffect)
    {
        D3DXMATRIX matWorld;
        g_pD3DDevice->GetTransform(D3DTS_WORLD,&matWorld);
        D3DXMATRIX matView;
        g_pD3DDevice->GetTransform(D3DTS_VIEW,&matView);
        D3DXMATRIX matProj;
        g_pD3DDevice->GetTransform(D3DTS_PROJECTION,&matProj);
        m_pWindEffect->GetEffect()->SetMatrix(m_hWindWVP,&(matWorld*matView*matProj));
        m_pWindEffect->GetEffect()->SetFloat(m_hWindTime,gameTick/500.0f);

        UINT NumPasses;
        m_pWindEffect->BeginEffect(NumPasses);
        m_pWindEffect->GetEffect()->BeginPass(0);
    }

    // 绘制顶点
    g_pD3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, m_vertexNum, 0, m_indexNum/3);

    if(m_pWindEffect)
    {
        m_pWindEffect->GetEffect()->EndPass();
        m_pWindEffect->EndEffect();
    }

    // 关闭Alpha检测
    g_pD3DDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);

    // 禁用Alpha通道
    g_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);

    // 重用背面剔除
    g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
}

复制代码

当然,不要忘记当对象Release时调用ReleaseCOM(m_pWindEffect)释放掉风动效果就可以了 ^ ^

风动效果通过截图表现不出来,建议大家在前几节的基础上自己动手尝试一下,感觉会非常不错~

 

之后我们来看D3D中雾化效果的实现。

雾化特效是D3D设备自身携带的一种效果,我们只需打开几个状态开关并设置一下相应的参数即可~

我们新建一个CD3DFog类,不过因为雾化特性来自于D3D本身,因此直接写成全局函数就可以了 ^ ^

复制代码

/*-------------------------------------

代码清单:D3DFog.h
来自:http://www.cnblogs.com/kenkao

-------------------------------------*/

#include "D3DInit.h"

// 雾化类型枚举
typedef enum _D3DFOGTYPE
{
    D3DFOGTYPE_NONE = 0,      // 无雾化效果
    D3DFOGTYPE_VERTEX = 140,  // 顶点雾化
    D3DFOGTYPE_PIXEL = 35     // 像素雾化
}D3DFOGTYPE;

// 重置雾化特效
void ResetFog( D3DFOGTYPE FogType,   // 雾化类型
               D3DFOGMODE FogMode,   // 雾化模式
               D3DCOLOR FogColor,    // 雾化颜色
               float Param0,         // 参数零
               float Param1 = 0.0f   // 参数一
               );

void BeginFog(IDirect3DDevice9 *pD3DDevice);  // 开启雾化
void EndFog(IDirect3DDevice9 *pD3DDevice);    // 关闭雾化

复制代码

 

复制代码

/*-------------------------------------

代码清单:D3DFog.cpp
来自:http://www.cnblogs.com/kenkao

-------------------------------------*/

#include "StdAfx.h"
#include "D3DFog.h"

D3DFOGTYPE  g_FogType  = D3DFOGTYPE_VERTEX;  // 默认雾化类型为顶点雾化
D3DFOGMODE  g_FogMode  = D3DFOG_LINEAR;      // 默认雾化模式为线性模式
D3DCOLOR    g_FogColor = D3DXCOLOR_WHITE;    // 默认雾化颜色为白色
float       g_FogStart = 0.0f;               // 默认线性雾化起始深度为0.0f
float       g_FogEnd   = 100.0f;             // 默认线性雾化终止深度为100.0f
float       g_FogDensity = 0.0f;             // 默认指数雾化参数为0.0f

void ResetFog(D3DFOGTYPE FogType, D3DFOGMODE FogMode, D3DCOLOR FogColor, float Param0, float Param1)
{
    g_FogType = FogType;
    g_FogMode = FogMode;
    g_FogColor = FogColor;
    // 如果雾化类型为线性雾化,则参数零、参数一分别代表线性雾化的起始与终止深度
    if(g_FogMode == D3DFOG_LINEAR)
    {
        g_FogStart = Param0;
        g_FogEnd   = Param1;
    }
    // 如果雾化类型为指数雾化,则参数零代表指数参数,参数一无效
    else
        g_FogDensity = Param0;
}

void BeginFog(IDirect3DDevice9 *pD3DDevice)
{
    if(pD3DDevice && g_FogType != D3DFOGTYPE_NONE && g_FogMode != D3DFOG_NONE)
    {
        // 开启雾化
        pD3DDevice->SetRenderState(D3DRS_FOGENABLE, TRUE);
        // 设置雾化颜色
        pD3DDevice->SetRenderState(D3DRS_FOGCOLOR, g_FogColor);
        // 设置雾化类型
        pD3DDevice->SetRenderState((D3DRENDERSTATETYPE)g_FogType, g_FogMode);
        // 设置雾化参数
        if (g_FogMode == D3DFOG_LINEAR)
        {
            pD3DDevice->SetRenderState(D3DRS_FOGSTART, *(DWORD*)&g_FogStart);
            pD3DDevice->SetRenderState(D3DRS_FOGEND, *(DWORD*)&g_FogEnd);
        }
        else
            pD3DDevice->SetRenderState(D3DRS_FOGDENSITY, *(DWORD*)&g_FogDensity);
    }
}

void EndFog(IDirect3DDevice9 *pD3DDevice)
{
    if(pD3DDevice && g_FogMode != D3DFOG_NONE)
    {
        // 结束雾化
        pD3DDevice->SetRenderState(D3DRS_FOGENABLE, FALSE);
    }
}

复制代码

这里值得一提的是代码中提到的雾化类型及雾化模式。

雾化类型主要分顶点级和像素级。顶点级雾化仅针对于各顶点,比较省性能,但不够精确;像素级雾化针对所有像素,效果与顶点级雾化相反。

雾化模式则主要分为线性雾化、一次指数雾化及二次指数雾化,用以控制雾化效果由近及远、有稀薄到厚重的变换过程。以下是三种雾化模式相应的计算公式:

 

如下为主体代码:

复制代码

/*-------------------------------------

代码清单:D3DGame.cpp
来自:http://www.cnblogs.com/kenkao

-------------------------------------*/

#include "StdAfx.h"
#include "D3DGame.h"
#include "D3DCamera.h"
#include "D3DEffect.h"
#include "CoordCross.h"
#include "SimpleXMesh.h"
#include "Texture2D.h"
#include "D3DSprite.h"
#include "Skybox.h"
#include "SpriteBatch.h"
#include "BaseTerrain.h"
#include "Water.h"
#include "PlantCollect.h"
#include "LensFlare.h"
#include "D3DFog.h"
#include <stdio.h>
#include <time.h>

//---通用全局变量

HINSTANCE  g_hInst;
HWND       g_hWnd;
D3DXMATRIX g_matWorld;
D3DXMATRIX g_matProjection;
D3DPRESENT_PARAMETERS g_D3DPP;

//---D3D全局变量

IDirect3D9       *g_pD3D           = NULL;
IDirect3DDevice9 *g_pD3DDevice     = NULL;
CMouseInput      *g_pMouseInput    = NULL;
CKeyboardInput   *g_pKeyboardInput = NULL;
CD3DCamera       *g_pD3DCamera     = NULL;
CSpriteBatch     *g_pSpriteBatch   = NULL;
CSkybox          *g_pSkybox        = NULL;
CBaseTerrain     *g_pBaseTerrain   = NULL;
CWater           *g_pWater         = NULL;
CPlantCollect    *g_pPlant         = NULL;
CSimpleXMesh     *g_pMesh          = NULL;
CLensFlare       *g_pFlare         = NULL;

// 场景绘制
void DrawScene(bool isReflect,bool isRefract);

void Initialize(HINSTANCE hInst, HWND hWnd)
{
    g_hInst = hInst;
    g_hWnd  = hWnd;
    InitD3D(&g_pD3D, &g_pD3DDevice, g_D3DPP, g_matProjection, hWnd);
    g_pMouseInput = new CMouseInput;
    g_pMouseInput->Initialize(hInst,hWnd);
    g_pKeyboardInput = new CKeyboardInput;
    g_pKeyboardInput->Initialize(hInst,hWnd);
    g_pD3DCamera = new CD3DCamera;
    g_pSpriteBatch = new CSpriteBatch(g_pD3DDevice);
    srand(time(0));
}

CTexture2D* debugTexture = NULL;

void LoadContent()
{
    g_pD3DCamera->SetCameraPos(D3DXVECTOR3(600.0f,0.0f,600.0f));

    g_pSkybox = new CSkybox;
    g_pSkybox->Create("Skybox_0.JPG","Skybox_1.JPG","Skybox_2.JPG"
        ,"Skybox_3.JPG","Skybox_4.JPG","Skybox_5.JPG");

    g_pBaseTerrain = new CBaseTerrain;
    g_pBaseTerrain->Create(128,128,10,"HeightData_128x128.raw","Grass.dds");

    g_pWater = new CWater;
    g_pWater->Create(1280,1280,0.0f,0.0f,40.0f);

    g_pPlant = new CPlantCollect;
    g_pPlant->Create(60,90,15);

    g_pMesh = new CSimpleXMesh;
    g_pMesh->LoadXMesh("WindMill.x");

    g_pFlare = new CLensFlare;
    g_pFlare->Create(D3DXVECTOR3(-1600,700,600),D3DXVECTOR2(800,600));

    ResetFog(D3DFOGTYPE_PIXEL,D3DFOG_EXP2,D3DXCOLOR_WHITE,0.001f);
}

void Update(float gameTick)
{
    g_pMouseInput->GetState();
    g_pKeyboardInput->GetState();

    // 更新摄影机高度
    D3DXVECTOR3 CameraPos = g_pD3DCamera->GetCameraPos();
    float roleHeight = 25.0f;
    float Ty = g_pBaseTerrain->GetExactHeightAt(CameraPos.x,CameraPos.z) + roleHeight;
    g_pD3DCamera->SetCameraPos(D3DXVECTOR3(
        CameraPos.x,
        Ty,
        CameraPos.z));

    g_pD3DCamera->Update();
}

void Draw(float gameTick)
{
    g_pD3DDevice->GetTransform(D3DTS_WORLD, &g_matWorld);
    g_pD3DDevice->SetTransform(D3DTS_VIEW,  &g_pD3DCamera->GetViewMatrix());
    if(SUCCEEDED(g_pD3DDevice->BeginScene())) 
    {
        BeginFog(g_pD3DDevice);

        g_pWater->BeginReflect();
        DrawScene(true,false);
        g_pWater->EndReflect();

        g_pWater->BeginRefract();
        DrawScene(false,true);
        g_pWater->EndRefract();

        g_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_RGBA(100,149,237,255), 1.0f, 0);
        DrawScene(false,false);
        g_pWater->Draw(gameTick);
        g_pPlant->Draw(gameTick);
        g_pFlare->Draw();

        EndFog(g_pD3DDevice);

        g_pD3DDevice->EndScene();
    }
    g_pD3DDevice->Present(NULL, NULL, NULL, NULL);
}

void DrawScene(bool isReflect,bool isRefract)
{
    g_pSkybox->Draw(isReflect,isRefract);
    g_pBaseTerrain->Draw();

    D3DXMATRIX scalTrans;
    D3DXMatrixScaling(&scalTrans,5.0f,5.0f,5.0f);
    D3DXMATRIX movTrans;
    D3DXMatrixTranslation(&movTrans,366,g_pBaseTerrain->GetExactHeightAt(366,190)-5.0f,190);
    g_pMesh->DrawXMesh(scalTrans * movTrans);
}

void UnloadContent()
{
    ReleaseCOM(g_pFlare);
    ReleaseCOM(g_pPlant);
    ReleaseCOM(g_pWater);
    ReleaseCOM(g_pBaseTerrain);
    ReleaseCOM(g_pSkybox);
}

void Dispose()
{
    ReleaseCOM(g_pSpriteBatch);
    ReleaseCOM(g_pD3DCamera);
    ReleaseCOM(g_pKeyboardInput);
    ReleaseCOM(g_pMouseInput);
    ReleaseCOM(g_pD3DDevice);
    ReleaseCOM(g_pD3D);
}

复制代码

最后是效果图:

配合合适的纹理,近处的景色与远处的天空完全浑然一体~

想到一句图形学领域的至理名言:Everything can be fake

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

雾化 的相关文章

  • insightface pytorch 答疑指南

    之前写过一篇人脸识别从原理到实践 详细介绍了人脸识别相关的算法 模型和Loss等 里面也提到insightface成为当前工业事实上的基准 但是它各种牛逼 唯一不足的点就是开始时选了mxnet框架开发 奈何现在基本没什么人用了 所以在22年
  • PCL 使用LCCP算法进行点云分割

    LCCP分割 一 算法原理 1 概述 2 参考文献 二 代码实现 三 结果展示 1 原始点云 2 分割结果 四 相关链接 五 测试数据 一 算法原理 1 概述 LCCP是Locally Convex Connected Patches的缩写
  • Android使用Gradle统一配置依赖版本

    转自 http blog csdn net u014651216 article details 54602354 前言 目前的Android开发为了减少编译时间 开发效率 大多都采用模块化 组件化的开发方式 采用这种方式不可避免的将会用到
  • UE4入门序列 01(UE4安装和环境配置)

    1 UE4的安装流程 2 创建一个示例项目 蓝图和C 3 C 的环境设置 4 运行示例项目 1 UE4的安装流程 Epic Games官网下载客户端 注册一个Epic Games的账号 Epic Games客户端包括了Epic公司旗下的Ep
  • vue el-select下拉框,选择后赋值成功,但是框上不显示选中的值的解决办法

    最近在做项目时发现el select下拉框 选择后赋值成功 但是框上不显示选中的值 后来查了下官方文档之后发现原因 vue 无法监听动态新增的属性的变化 需要用 set 来为这些属性赋值 如上图所示 操作人下拉框初始没有值 选择了操作班组之
  • Go语言的跨文件调包

    一 前言 文件的结构如下 go mod main main go util util go 文件在调用其它包的时候 需要在代码中引用其他的函数 包的命名一般都以小写为主 文件中函数的以首字符为大写的函数为共有函数 小写的为私有函数 只能是在
  • SQL增加表的约束(主键、外键、check,唯一)

    以下操作是在已经创建了表之后 进行的约束条件的增加 1 增加check约束条件 alter table 表名 add constraint 约束条件名称 check 约束条件 如 alter table test add constrain
  • 软件工程导论 黑盒测试、白盒测试

    单元测试 集中检测软件设计的最小单元 即模块 测试重点 模块接口 局部数据结构 重要执行通路 出错处理通路 边界条件 代码审查 一次审查可以发现多个错误 可以减少系统验证的总工作量 集成测试 非渐增式测试 将程序作为一个整体 对错误的定位和
  • python-运算符

    除 x除以一 注意整数相除得到的是整数 如4 3结果为1 4 0 3或者4 3 0结果为1 3333333 取整除 返回商的整数 4 3 0的结果为1 0 取模 返回除法的余数 8 3得到2
  • 力扣 214. 最短回文串 一遍过,很舒服(代码做了分层,很容易理解)

    include
  • leecode344反转字符串(附有调试代码)

    package heima study day3 import java util Scanner public class 反转字符串344 public static void main String args Scanner inpu
  • 为什么要使用ConstraintLayout?

    本文为博主原创文章 转载请注明出处 http blog csdn net jingsummer article details 78615360 源码地址 ConstraintLayoutDemo 相信大家对ConstraintLayout
  • Java 设计模式(十二):享元模式

    享元模式 GitHub 地址 https github com yifanzheng java design patterns 享元模式 Flyweight Design Pattern 顾名思义就是共享单元 享元模式的意图是复用对象 节省
  • STM32的独立看门狗

    独立看门狗时钟频率一般以40KHz 但不是非常准确 变化范围在15 47KHz 看门狗在开启后不能关闭 除非复位 1 寄存器 关键字寄存器 IWDG KR 用来写指令 指令有0xAAAA 把IWDG RLR的值载入到计数器 避免 产生复位
  • [BAPI]外向交货单按批次拆分[BAPI_OUTB_DELIVERY_CHANGE]

    下面介绍SAP SD的销售订单外向交货单按批次拆分 Batch Managed 包括前台操作和调用bapi BAPI OUTB DELIVERY CHANGE 实现 1 前台操作 按批次拆分操作 外向交货单Tcode VL02n amp l
  • Java final 详解

    一 final 基础使用 1 1 修饰类 当某个类的整体定义为 final 时 就表明了你不能打算继承该类 而且也不允许别人这么做 即这个类是不能有子类的 注意 final 类中的所有方法都隐式为 final 因为无法覆盖他们 所以在 fi
  • 泛型中K TVE? Object等分别代表什么含义。

    E一Element 在集合中使用 因为集合中存放的是元素 T Type Java类 K Key 键 V Value 值 N Number 数值类型 表示不确定的java类型 无限制通配符类型 S U V 2nd 3rd 4th types
  • ArcGIS API 4.x for Js 点击地图获取经纬度

    需求 鼠标点击地图后获取当前的经纬度 效果 需添加API esri geometry support webMercatorUtils 代码 view on click function e geom webMercatorUtils xy

随机推荐

  • 规范的建表语句

    CREATE TABLE student info id INT NOT NULL AUTO INCREMENT COMMENT 主键 stu name VARCHAR 10 NOT NULL DEFAULT COMMENT 姓名 stu
  • Python基础语法入门(第十五天)——装饰器传参与匿名函数

    在上篇文章中留下了一个问题 装饰器的传参如何实现 其实对于这个问题来说 首先要搞清楚传参的顺序是什么 我们已知的是装饰器的本质就是函数 那么在这嵌套了多层的函数中每一个函数接收的参数是哪一个 作用域哪个范围 这就是实现装饰器传参前需要解决的
  • IDEA+Maven创建javaweb项目out.print()报错

    IDEA Maven创建javaweb项目out print 报错 从原型中创建如图所示 注意不要选错 选好项目目录设置好项目名称之后下一步 注意这个地方的Maven路径 用户设置文件 本地仓库要选择自己的 不要使用IDEA自带的MAven
  • Sqlite3简介

    SQLite3 简介 SQLite3 是一种轻量级的嵌入式数据库引擎 被广泛应用于各种应用程序中 包括移动设备 桌面应用程序和嵌入式系统 它以其简单 高效和零配置的特点而受到开发者的喜爱 以下是 SQLite3 的一些重要特点 嵌入式数据库
  • Android手机9008模式刷机教程(以小米手机为例)

    机型 红米1s电信版2013028 故障 一开始可以进入fastboot 后来无法进入fastboot 无限重启 后来开机键无反应 大家都知道 刷机的方式有很多种 大体来讲 我们刷机一般采用以下几种方式 1 卡刷 即进入recovery模式
  • 理解golang调度

    线程模型 在细说 Go 的调度模型之前 先来说说一般意义的线程模型 线程模型一般分三种 由用户级线程和 OS 线程的不同对应关系决定的 N 1 即全部用户线程都映射到一个OS线程上 上下文切换成本最低 但无法利用多核资源 1 1 一个用户线
  • 真香!Jenkins 主从模式解决问题So Easy~

    01 Jenkins 能干什么 Jenkins 是一个开源软件项目 是基于 Java 开发的一种持续集成工具 用于监控持续重复的工作 旨在提供一个开放易用的软件平台 使软件项目可以进行持续集成 中文官网 https jenkins io z
  • 二级教程python语言程序设计答案_全国计算机等级考试二级教程-Python语言程序设计(2018年版)编程题-参考答案......

    习题3 基本数据类型 1 获得用户输入的一个整数 输出该整数百位及以上的数字 i input 请输入一个整数 print i 2 复制代码 2 获得用户输入的一个字符串 将字符串按照空格分割 然后逐行打印出来 i input 请输入一个带空
  • unbuntn X64 安装vsftpd

    Fortunately the good folks at The Fronteer Group have backported vsftp until the full release of ver 3 of vsftp comes ou
  • 【限时免费】20天拿下华为OD笔试之【栈】2023B-仿 LISP 运算【欧弟算法】全网注释最详细分类最全的华为OD真题题解

    栈 2023B 仿 LISP 运算 题目描述与示例 题目描述 LISP 语言唯一的语法就是括号要配对 形如 OP P1 P2 括号内元素由单个空格分割 其中第一个元素 OP 为操作符 后续元素均为其参数 参数个数取决于操作符类型 注意 参数
  • JavaScript slice() 和 splice()

    slice slice 从已有的数组中返回选定的元素 返回一个新的数组 包含从 start 到 end 不包括该元素 的 arrayObject 中的元素 arrayObject slice start end 参数 start 必须 规定
  • 抽象类与接口(Java)

    二者的特性 方法类型 接口只能有抽象方法 抽象类可以有抽象方法和非抽象方法 从Java 8 开始 抽象类可以有默认 default 方法和静态方法 Final变量 接口中的变量默认是final的 抽象类可能包含非final的变量 变量类型
  • 基于Apache Hudi + MinIO 构建流式数据湖

    Apache Hudi 是一个流式数据湖平台 将核心仓库和数据库功能直接引入数据湖 Hudi 不满足于将自己称为 Delta 或 Apache Iceberg 之类的开放文件格式 它提供表 事务 更新 删除 高级索引 流式摄取服务 数据聚簇
  • 华为oj初级 在字符串中找出连续最长的数字串

    描述 样例输出 输出123058789 函数返回值9 输出54761 函数返回值5 接口说明 函数原型 unsignedint Continumax char pOutputstr char intputstr 输入参数 char intp
  • 使用DataX和sqoop将数据从MySQL导入Hive

    使用DataX和sqoop将数据从MySQL导入Hive 一 DataX简述 二 sqoop简述 三 需求背景 四 实现方式 3 1 使用DataX将数据从MySQL导入Hive 3 2 通过sqoop将数据从MySQL导入Hive 四 总
  • 解决重启Linux服务器后数据消失问题(重新挂载)

    目录 一 挂载 1 重新挂载 2 数据消失的原因 二 重启服务器 1 shutdown 2 其它关机重启指令 参考自 一 挂载 1 重新挂载 使用 reboot 命令重启服务器后 服务器内挂载的文件全部丢失 那应该如何重新挂载呢 我们想将1
  • 【满分】【华为OD机试真题2023 JS】任务总执行时长

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 任务总执行时长 知识点数组循环递归 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 任务编排服务负责对任务进行组合调度 参与编排的任务有两种类型 其中一种执行时长
  • SDL2.0渲染图像

    SDL封装了opengl和directx包含图像显示和音频播放 SDL的API文档 https wiki libsdl org SDL渲染图像的步骤 1 初始化接口 int SDLCALL SDL Init Uint32 flags 2 创
  • mmdetection目标检测训练过程参数解读

    关于训练过程中日志记录的的map 包含很多map 如下 mode train epoch 100 iter 400 lr 0 0002 memory 5010 data time 0 01552 loss rpn cls 0 00029 l
  • 雾化

    https www cnblogs com kenkao archive 2011 08 14 2137726 html 风动和雾化都是相对而言比较简单的游戏特效 实现起来甚至比我们前一节提到的晴天光晕还要简单 大家还记得上上节中我们为陆地