学习了三维的地形系统之后,该抬头看看天空啦。下面学习一下传说中的三维天空系统。其实三维天空的实现比地形系统简单得多,我们只需要用一点点小伎俩,就可以蒙混大多数人。

一.简介

我们在玩游戏的时候,尤其是野外的大场景中,要想更逼真离不开三维天空系统。要用程序来模拟无边无际的天空是不可能的,而聪明的前辈们自然也想到了用“天圆地方”这种古代人们对于天空的认识来作为三维天空设计思想。即用一个足够大的面罩住我们,只要这个罩足够大,在里面看天空就和真实的天空没什么区别啦。而基于这种思想的天空设计方案中,最常用的就是天空盒。所谓天空盒,就是用一个立方体,罩住玩家所在的世界空间,天空盒常常是24个点,6个面,也可以是5个面,地面用三维地形,就不需要天空盒来覆盖了。

而要做出天空的效果,我们就必须要去找到一些天空的纹理素材,找到几张无缝拼接的图片,作为纹理贴图,这样我们看起来才不会穿帮。

二.天空盒类的设计

天空盒其实比较简单,就是一个立方体,然后在立方体的内侧进行纹理贴图即可。要注意的就是纹理贴图的顺序不要搞错,不然一眼就会被发现。

和之前的地形系统一样,都需要保存设备指针,系统内部自己设定顶点,然后根据参数初始化天空盒的大小,以及设置纹理贴图。使用时,我们只需要设定这几个参数就可以创建出各式各样的天空系统啦!

.h文件

/*!* \file SkyBox.h** \author puppet_master* \date 七月 2015** 三维天空盒的封装*/
#ifndef __SKYBOX_H_
#define __SKYBOX_H_#pragma oncestruct SkyBoxVertex
{float x, y, z;  //定点位置float u, v;      //纹理位置
};
#define D3DFVF_SKYBOX D3DFVF_XYZ | D3DFVF_TEX1class CSkyBox
{
private:LPDIRECT3DDEVICE9 m_pDevice;            //设备指针LPDIRECT3DVERTEXBUFFER9 m_pVertexBuffer;//定点缓冲区指针LPDIRECT3DTEXTURE9 m_pTexture[5];        //纹理对象指针float m_fLength;                        //天空盒宽度
public:CSkyBox(LPDIRECT3DDEVICE9 pDevice);virtual ~CSkyBox(void);//初始化天空盒bool InitSkyBox(float length);//加载纹理bool InitSkyBoxTexture(LPSTR szFrontTexture, LPSTR szBackTexture, LPSTR szLeftTexture, LPSTR szRightTexture, LPSTR szTopTexture);//渲染天空盒void RenderSkyBox(D3DXMATRIX *matWorld, bool bRenderFrame = false);
};#endif

.cpp文件

#include "stdafx.h"
#include "SkyBox.h"CSkyBox::CSkyBox(LPDIRECT3DDEVICE9 pDevice)
{m_pDevice = pDevice;m_pVertexBuffer = NULL;for (int i = 0; i < 5; i++)m_pTexture[i] = NULL;m_fLength = 0.0f;
}CSkyBox::~CSkyBox(void)
{SAFE_RELEASE(m_pVertexBuffer);for (int i = 0; i < 5; i++){SAFE_RELEASE(m_pTexture[i]);}
}bool CSkyBox::InitSkyBox(float length)
{m_fLength = length;//创建定点缓冲区m_pDevice->CreateVertexBuffer(20 * sizeof(SkyBoxVertex), 0, D3DFVF_SKYBOX, D3DPOOL_MANAGED, &m_pVertexBuffer, 0);SkyBoxVertex vertices[] = {//前面的顶点{-m_fLength / 2, 0.0f, m_fLength / 2, 0.0f, 1.0f,},{-m_fLength / 2, m_fLength / 2, m_fLength / 2, 0.0f, 0.0f,}, {m_fLength / 2, 0.0f, m_fLength / 2, 1.0f, 1.0f,},{m_fLength / 2, m_fLength / 2, m_fLength / 2,  1.0f, 0.0f,},//后面的顶点{m_fLength / 2, 0.0f, -m_fLength / 2, 0.0f, 1.0f,},{m_fLength / 2, m_fLength / 2, -m_fLength / 2, 0.0f, 0.0f,},{-m_fLength / 2, 0.0f, -m_fLength / 2, 1.0f, 1.0f,},{-m_fLength / 2, m_fLength / 2, -m_fLength / 2, 1.0f, 0.0f,},//左面的顶点{-m_fLength / 2, 0.0f, -m_fLength / 2 , 0.0f, 1.0f,},{-m_fLength / 2, m_fLength / 2, -m_fLength / 2, 0.0f, 0.0f,},{-m_fLength / 2, 0.0f, m_fLength / 2, 1.0f, 1.0f,},{-m_fLength / 2, m_fLength / 2, m_fLength / 2, 1.0f, 0.0f,},//右面的顶点{m_fLength / 2, 0.0f, m_fLength / 2, 0.0f, 1.0f,},{m_fLength / 2, m_fLength / 2, m_fLength / 2, 0.0f, 0.0f,},{m_fLength / 2, 0.0f, -m_fLength / 2, 1.0f, 1.0f,},{m_fLength / 2, m_fLength / 2, -m_fLength / 2, 1.0f, 0.0f,},//上面的顶点{m_fLength / 2, m_fLength / 2, -m_fLength / 2, 1.0f, 0.0f,}, {m_fLength / 2, m_fLength / 2, m_fLength / 2, 1.0f, 1.0f,},{-m_fLength / 2, m_fLength / 2, -m_fLength / 2, 0.0f, 0.0f,},{-m_fLength / 2, m_fLength / 2, m_fLength / 2, 0.0f, 1.0f,},};//填充定点缓冲数据void* pVertices = NULL;//加锁m_pVertexBuffer->Lock(0, 0, (void**)&pVertices, 0);//拷贝顶点数据到缓冲区中memcpy(pVertices, vertices, sizeof(vertices));//解锁m_pVertexBuffer->Unlock();return true;
}bool CSkyBox::InitSkyBoxTexture(LPSTR szFrontTexture, LPSTR szBackTexture, LPSTR szLeftTexture, LPSTR szRightTexture, LPSTR szTopTexture)
{//从文件中加载天空盒纹理D3DXCreateTextureFromFile(m_pDevice, szFrontTexture, &m_pTexture[0]);//前D3DXCreateTextureFromFile(m_pDevice, szBackTexture, &m_pTexture[1]);//后D3DXCreateTextureFromFile(m_pDevice, szLeftTexture, &m_pTexture[2]);//左D3DXCreateTextureFromFile(m_pDevice, szRightTexture, &m_pTexture[3]);//右D3DXCreateTextureFromFile(m_pDevice, szTopTexture, &m_pTexture[4]);//上return true;
}void CSkyBox::RenderSkyBox(D3DXMATRIX *matWorld, bool bRenderFrame /* = false */)
{//纹理颜色混合的第一个参数用于输出m_pDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);//纹理颜色混合的第一个参数取纹理的颜色值m_pDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);//世界变换m_pDevice->SetTransform(D3DTS_WORLD, matWorld);//设置资源流m_pDevice->SetStreamSource(0, m_pVertexBuffer, 0, sizeof(SkyBoxVertex));//设置灵活顶点格式m_pDevice->SetFVF(D3DFVF_SKYBOX);//绘制for(int i = 0; i < 5; i++){m_pDevice->SetTexture(0, m_pTexture[i]);m_pDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, i * 4, 2);}
}

三.天空盒类的使用

全局指针
CSkyBox*      g_pSkyBox      = NULL;   //天空盒类指针

创建天空盒

void CreateSkyBox()
{g_pSkyBox = new CSkyBox(g_pDevice);g_pSkyBox->InitSkyBox(20000.0f);g_pSkyBox->InitSkyBoxTexture("skyfront.png", "skyback.png", "skyleft.png", "skyright.png", "skytop.png");
}
绘制
D3DXMatrixTranslation(&matWorldSky, 0.0f, -2000.0f, 0.0f);
g_pSkyBox->RenderSkyBox(&matWorldSky);

好了,迫不及待的run一下试试:


帅呆了!

换个角度:

飞到天外:

附上主体代码:

// D3DDemo.cpp : 定义应用程序的入口点。
//#include "stdafx.h"
#include "D3DDemo.h"
#include "DirectInput.h"
#include "Camera.h"
#include "Terrain.h"
#include "Mesh.h"
#include "SkyBox.h"
#include "Particle.h"#define MAX_LOADSTRING 100// 全局变量:
HINSTANCE hInst;                                // 当前实例
TCHAR szTitle[MAX_LOADSTRING];                  // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING];            // 主窗口类名// 此代码模块中包含的函数的前向声明:
HWND                g_hWnd;
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);//---------改造3D窗口需要的内容------------
LPDIRECT3D9 g_pD3D = NULL;             //D3D接口指针
LPDIRECT3DDEVICE9 g_pDevice = NULL;        //D3D设备指针
CDirectInput* g_pDirectInput = NULL;   //控制指针
CCamera*      g_pCamera      = NULL;    //摄像机指针
CTerrain*     g_pTerrian     = NULL;   //地形类指针
CSkyBox*      g_pSkyBox      = NULL;   //天空盒类指针
CMesh*        g_pMesh1       = NULL;   //网格对象指针1
CMesh*        g_pMesh2       = NULL;   //网格对象指针2
CMesh*        g_pMesh3       = NULL;   //网格对象指针3D3DXMATRIX g_matWorld;                         //世界矩阵void onCreatD3D()
{g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);if (!g_pD3D)return;//检测硬件设备能力的方法/*D3DCAPS9 caps;ZeroMemory(&caps, sizeof(caps));g_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps);*///获得相关信息,屏幕大小,像素点属性D3DDISPLAYMODE d3ddm;ZeroMemory(&d3ddm, sizeof(d3ddm));g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm);//设置全屏模式D3DPRESENT_PARAMETERS d3dpp;ZeroMemory(&d3dpp, sizeof(d3dpp));/*d3dpp.Windowed = false;d3dpp.BackBufferWidth = d3ddm.Width;d3dpp.BackBufferHeight = d3ddm.Height;*/d3dpp.Windowed = true;d3dpp.BackBufferFormat = d3ddm.Format;d3dpp.BackBufferCount = 1;d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;//交换后原缓冲区数据丢弃//是否开启自动深度模板缓冲d3dpp.EnableAutoDepthStencil = true;//当前自动深度模板缓冲的格式d3dpp.AutoDepthStencilFormat = D3DFMT_D16;//每个像素点有16位的存储空间,存储离摄像机的距离g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, g_hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pDevice);if (!g_pDevice)return;//设置渲染状态,设置启用深度值g_pDevice->SetRenderState(D3DRS_ZENABLE, true);//设置渲染状态,关闭灯光//g_pDevice->SetRenderState(D3DRS_LIGHTING, false);//设置渲染状态,裁剪模式g_pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);//g_pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE) ;}void CreateMesh()
{g_pMesh1 = new CMesh(g_pDevice);g_pMesh1->CreateMesh("Demon.X");g_pMesh2 = new CMesh(g_pDevice);g_pMesh2->CreateMesh("dragon.X");g_pMesh3 = new CMesh(g_pDevice);g_pMesh3->CreateMesh("miki.X");
}void CreateCamera()
{g_pCamera = new CCamera(g_pDevice);g_pCamera->SetCameraPosition(&D3DXVECTOR3(0.0f, 800.0f, -500.0f));g_pCamera->SetTargetPosition(&D3DXVECTOR3(0.0f, 800.0f, 0.0f));g_pCamera->SetViewMatrix();g_pCamera->SetProjectionMartix();
}void CreateTerrain()
{g_pTerrian = new CTerrain(g_pDevice);g_pTerrian->LoadTerrainFromFile(TEXT("heighmap.raw"), TEXT("TerrainTexture.jpg"));g_pTerrian->InitTerrain(200, 200, 100.0f, 5.0f);
}void CreateSkyBox()
{g_pSkyBox = new CSkyBox(g_pDevice);g_pSkyBox->InitSkyBox(20000.0f);g_pSkyBox->InitSkyBoxTexture("skyfront.png", "skyback.png", "skyleft.png", "skyright.png", "skytop.png");
}void SetLight()
{D3DLIGHT9 light;  ::ZeroMemory(&light, sizeof(light));  light.Type          = D3DLIGHT_DIRECTIONAL;  light.Ambient       = D3DXCOLOR(0.7f, 0.7f, 0.7f, 1.0f);  light.Diffuse       = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);  light.Specular      = D3DXCOLOR(0.9f, 0.9f, 0.9f, 1.0f);  light.Direction     = D3DXVECTOR3(1.0f, 1.0f, 1.0f);  g_pDevice->SetLight(0, &light);  g_pDevice->LightEnable(0, true);  g_pDevice->SetRenderState(D3DRS_NORMALIZENORMALS, true);  g_pDevice->SetRenderState(D3DRS_SPECULARENABLE, true);
}void onInit()
{//初始化D3DonCreatD3D();//创建Mesh模型CreateMesh();//创建摄像机CreateCamera();//创建地形CreateTerrain();//创建天空盒CreateSkyBox();//设置光照SetLight();
}void onDestroy()
{SAFE_DELETE(g_pDirectInput);SAFE_DELETE(g_pCamera);SAFE_DELETE(g_pTerrian);SAFE_DELETE(g_pSkyBox);SAFE_RELEASE(g_pDevice);SAFE_DELETE(g_pMesh1);SAFE_DELETE(g_pMesh2);SAFE_DELETE(g_pMesh3);
}void onLogic(float fElapsedTime)
{//使用DirectInput类读取数据g_pDirectInput->GetInput();// 沿摄像机各分量移动视角if (g_pDirectInput->IsKeyDown(DIK_A))  g_pCamera->MoveAlongRightVec(-10.0f);if (g_pDirectInput->IsKeyDown(DIK_D))  g_pCamera->MoveAlongRightVec( 10.0f);if (g_pDirectInput->IsKeyDown(DIK_W)) g_pCamera->MoveAlongLookVec( 10.0f);if (g_pDirectInput->IsKeyDown(DIK_S))  g_pCamera->MoveAlongLookVec(-10.0f);if (g_pDirectInput->IsKeyDown(DIK_I))  g_pCamera->MoveAlongUpVec( 10.0f);if (g_pDirectInput->IsKeyDown(DIK_K))  g_pCamera->MoveAlongUpVec(-10.0f);//沿摄像机各分量旋转视角if (g_pDirectInput->IsKeyDown(DIK_LEFT))  g_pCamera->RotationUpVec(-0.003f);if (g_pDirectInput->IsKeyDown(DIK_RIGHT))  g_pCamera->RotationUpVec( 0.003f);if (g_pDirectInput->IsKeyDown(DIK_UP))  g_pCamera->RotationRightVec(-0.003f);if (g_pDirectInput->IsKeyDown(DIK_DOWN))  g_pCamera->RotationRightVec( 0.003f);if (g_pDirectInput->IsKeyDown(DIK_J)) g_pCamera->RotationLookVec(-0.001f);if (g_pDirectInput->IsKeyDown(DIK_L)) g_pCamera->RotationLookVec( 0.001f);//鼠标控制右向量和上向量的旋转//g_pCamera->RotationUpVec(g_pDirectInput->MouseDX()* 0.001f);//g_pCamera->RotationRightVec(g_pDirectInput->MouseDY() * 0.001f);//鼠标滚轮控制观察点收缩操作static FLOAT fPosZ=0.0f;fPosZ += g_pDirectInput->MouseDZ()*3.0f;//计算并设置取景变换矩阵D3DXMATRIX matView;g_pCamera->CalculateViewMatrix(&matView);g_pDevice->SetTransform(D3DTS_VIEW, &matView);//把正确的世界变换矩阵存到g_matWorld中D3DXMatrixTranslation(&g_matWorld, 0.0f, 0.0f, fPosZ);}void onRender(float fElasedTime)
{//前两个参数是0和NULL时,清空整个游戏窗口的内容(清的是后台)//第三个是清除的对象:前面表示清除颜色缓冲区,后面表示清除深度缓冲区,D3DCLEAR_STENCIL清空模板缓冲区g_pDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,100,100), 1.0f, 0);g_pDevice->BeginScene();D3DXMATRIX matWorld1, matWorld2, matWorld3, matWorldTerrain, matWorldSky;  D3DXMatrixTranslation(&matWorld1, 0.0f, 800.0f, 0.0f);  D3DXMatrixTranslation(&matWorld2, 0.0f, 1300.0f, 0.0f);D3DXMatrixTranslation(&matWorld3, -30.0f, 900.0f, -50.0f);D3DXMatrixTranslation(&matWorldTerrain, 0.0f, 0.0f, 0.0f);D3DXMatrixTranslation(&matWorldSky, 0.0f, -2000.0f, 0.0f);g_pMesh1->DrawMesh(matWorld1);g_pMesh2->DrawMesh(matWorld2);g_pMesh3->DrawMesh(matWorld3);g_pSkyBox->RenderSkyBox(&matWorldSky);g_pTerrian->RenderTerrain(&matWorldTerrain, false);g_pDevice->EndScene();g_pDevice->Present(NULL, NULL, NULL, NULL);
}int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,_In_opt_ HINSTANCE hPrevInstance,_In_ LPTSTR    lpCmdLine,_In_ int       nCmdShow){UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine);// TODO: 在此放置代码。MSG msg;HACCEL hAccelTable;// 初始化全局字符串LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);LoadString(hInstance, IDC_D3DDEMO, szWindowClass, MAX_LOADSTRING);MyRegisterClass(hInstance);// 执行应用程序初始化:if (!InitInstance (hInstance, nCmdShow)){return FALSE;}hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_D3DDEMO));ZeroMemory(&msg, sizeof(msg));while (msg.message != WM_QUIT){if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){TranslateMessage(&msg);DispatchMessage(&msg);}else{static DWORD dwTime = timeGetTime();DWORD dwCurrentTime = timeGetTime();DWORD dwElapsedTime = dwCurrentTime - dwTime;float fElapsedTime = dwElapsedTime * 0.001f;//------------渲染和逻辑部分代码----------onLogic(fElapsedTime);onRender(fElapsedTime);//-----------------------------------------if (dwElapsedTime < 1000 / 60){Sleep(1000/ 60 - dwElapsedTime);}dwTime = dwCurrentTime;}}onDestroy();return (int) msg.wParam;
}//
//  函数: MyRegisterClass()
//
//  目的: 注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX);wcex.style           = CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc = WndProc;wcex.cbClsExtra      = 0;wcex.cbWndExtra        = 0;wcex.hInstance     = hInstance;wcex.hIcon         = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_D3DDEMO));wcex.hCursor       = LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground   = (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName  = MAKEINTRESOURCE(IDC_D3DDEMO);wcex.lpszClassName  = szWindowClass;wcex.hIconSm       = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));return RegisterClassEx(&wcex);
}//
//   函数: InitInstance(HINSTANCE, int)
//
//   目的: 保存实例句柄并创建主窗口
//
//   注释:
//
//        在此函数中,我们在全局变量中保存实例句柄并
//        创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{hInst = hInstance; // 将实例句柄存储在全局变量中g_hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);if (!g_hWnd){return FALSE;}//初始化DirectInput类g_pDirectInput = new CDirectInput();g_pDirectInput->Init(g_hWnd, hInst, DISCL_FOREGROUND|DISCL_NONEXCLUSIVE, DISCL_FOREGROUND|DISCL_NONEXCLUSIVE);SetMenu(g_hWnd, NULL);ShowWindow(g_hWnd, nCmdShow);UpdateWindow(g_hWnd);onInit();return TRUE;
}//
//  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目的: 处理主窗口的消息。
//
//  WM_COMMAND  - 处理应用程序菜单
//  WM_PAINT    - 绘制主窗口
//  WM_DESTROY  - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND g_hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{switch (message){case WM_KEYDOWN:if (wParam == VK_ESCAPE)PostQuitMessage(0);break;case WM_CLOSE:DestroyWindow(g_hWnd);break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(g_hWnd, message, wParam, lParam);}return 0;
}

Direct-X学习笔记--天空盒相关推荐

  1. Direct 3D学习笔记(三)——光照与材质

    Direct 3D学习笔记(三)--光照与材质 现实世界中物体的颜色是一个复杂的系统,物体在不同的光照下,可能呈现在我们面前的就是不同的颜色.根据物理中的光学知识,物体在各种环境光照下,根据物体自身特 ...

  2. 单目深度估计 | Learning Depth from Monocular Videos using Direct Methods 学习笔记

    文章目录 摘要 1. 论文主要贡献: 2. 从视频中学习预测深度 2.1 尺度模糊 2.2 建模姿态估计预测器 3. 可微分直接视觉测距法 3.1 直接视觉测距法(DVO) 3.2 可微分的实现 4 ...

  3. Direct 3D学习笔记三:矩阵

    仍然是基于先前的程序.     首先来介绍三个基本的矩阵,这是direct 3d中必须设置的三个矩阵,即世界矩阵,视图矩阵,投影矩阵.而对应的三个变换就是世界变换(World Transform),摄 ...

  4. unity3d 学习笔记四 skybox(天空盒) light(光源) halo(光晕)

    Unity3D学习笔记(四)天空.光晕和迷雾 六年前第一次接触<魔兽世界>的时候,被其绚丽的画面所折服,一个叫做贫瘠之地的地方,深深印在我的脑海里.当时在艾泽拉斯大陆还不能使用飞行坐骑,试 ...

  5. LVS学习笔记--概念

    最近在学习南非蚂蚁大大的博客上的一些文章,主要在学习LVS,现在就是将自己学习到的内容记录下来,做一个学习笔记与大家分享. 南非蚂蚁大大的博客是http://ixdba.blog.51cto.com ...

  6. 九十分钟极速入门Linux——Linux Guide for Developments 学习笔记

    转载自: 九十分钟极速入门Linux--Linux Guide for Developments 学习笔记 http://mp.weixin.qq.com/s?__biz=MzAwNTMxMzg1MA ...

  7. 深度学习(二)theano学习笔记(1)环境搭建

    theano学习笔记(1)环境搭建 原文地址:http://blog.csdn.net/hjimce/article/details/46654229 作者:hjimce 搭建theano实属不易,因 ...

  8. [mmu/cache]-ARM cache的学习笔记-一篇就够了

    ★★★ 个人博客导读首页-点击此处 ★★★ . 说明: 在默认情况下,本文讲述的都是ARMV8-aarch64架构,linux kernel 64位 . 相关文章 1.ARM MMU的学习笔记-一篇就 ...

  9. LogMiner学习笔记

    LogMiner学习笔记 LogMiner的基本介绍 所有对用户数据和数据字典的改变都记录在Oracle的Redo Log中,因此, redo log包含了所有进行恢复操作所需要的信息.利用这些数据, ...

最新文章

  1. awk1.0 — awk基础
  2. [Windows编程] 如何捕捉程序异常/crash 并生成 dump 文件
  3. window系统 telnet报错:‘telnet‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  4. 区块链成熟度评测报告
  5. Linux Shell特殊字符和控制字符大全
  6. Linux C获取文件属性
  7. 《网管员必读——网络组建》(第2版)导读
  8. 信息安全产业爆发在即 十三五年均增长将达20%以上
  9. 帆软日期参数联动方法
  10. 多组测试数据01字典树「模板」
  11. 剖析虚幻渲染体系(15)- XR专题
  12. 【SEO案例】百度快照劫持怎么处理
  13. opencv学习系列:实例练习(含多个实例)
  14. 麦乐积分:积分兑换系统对于积分运营的重要性
  15. Golang面向对象之-类
  16. 方舟服务器显示等待发布,《明日方舟》开服既炸服的这波操作《方舟生存进化》永远也学不会...
  17. 【Python学习教程】Python变量类型和运算符
  18. 【Python】Webpy 源码学习
  19. Linux gzip压缩/解压 *.gz文件详解
  20. 数值分析:研究高次插值的龙格现象

热门文章

  1. Symfony 初步了解
  2. 最新 Flink 1.13 简介(简介、历史、核心特性、WordCount体验)快速入门、详细教程
  3. 深度学习 实验三 logistic回归预测二分类
  4. Spark的现状与未来发展
  5. java web 网课_中国大学MOOCJava Web开发基础网课答案
  6. 7. 无线体内纳米网:改善体内电磁通道信号传播性能的若干新型石墨烯材料
  7. 【Django | 开发】权限划分(行为数据集)集成钉钉消息(案例:面试招聘信息网站)
  8. [上海线下活动] AI+教育 专场 -- 沪江技术沙龙
  9. 回顾过往,布局未来:2022 年证券走势
  10. Hadoop高可用集群下namenode格式化失败问题解决