由于本人希望从DirectX11的基础sample开始学习,所以选择了
VS2010+Microsoft DirectX SDK(June 2010)的开发环境
学习龙书DirectX11版本,运行课本的Sample必须要在VS2010的环境下,不然会报错,想要完全专注于DX11的学习,那么请选择VS2010。
安装Microsoft DirectX SDK(June 2010)
安装失败 S1023的解决方案 卸载
Microsoft Visual C++ 2010 x86 Redistributable
Microsoft Visual C++ 2010 x64 Redistributable
以及所有Runtime文件。
如果还是报错,查看C:\Windows\Logs的日志DXError [12/10/16 15:44:31] module: dxupdate(Jun 2 2010), file: dxupdate.cpp, line: 2223, function: RegisterDLL
Failed API: LoadLibraryEx()
Error: (193) - %1 不是有效的 Win32 应用程序。
Unable to load C:\Windows\system32\xactengine2_0.dll.
[12/10/16 15:44:31] module: dxupdate(Jun 2 2010), file: dxupdate.cpp, line: 5848, function: DirectXUpdateInstallPlugIn
RegisterDllFromSection() failed.
[12/10/16 15:44:31] module: dsetup32(Jun 2 2010), file: dxupdate.cpp, line: 280, function: CSetup::InstallPlugIn
DirectXUpdateInstallPlugIn() failed.
[12/10/16 15:44:31] module: dsetup32(Jun 2 2010), file: setup.cpp, line: 1723, function: CSetup::SetupForDirectX
InstallPlugIn() failed.
此时参照此博客的解决方案
解决Unable to load C:\Windows\system32\xactengine2_0.dll.
DirectX11在VS2010的配置
基本配置可以参考 浅墨逐梦旅程
博主可能点背,遇到了各种各样的问题
#include
#include
#include
LPDIRECT3D9 g_pD3D;
LPDIRECT3DDEVICE9 g_pd3dDevice;
LPDIRECT3DVERTEXBUFFER9 g_pVB;
struct CUSTOMVERTEX{
FLOAT x, y, z;
DWORD color;
};
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
HRESULT InitObject()
{
CUSTOMVERTEX triangle[] =
{
{ -1.0f,-1.0f, 0.0f, 0xffff0000, },
{ 1.0f,-1.0f, 0.0f, 0xff0000ff, },
{ 0.0f, 1.0f, 0.0f, 0xffffffff, }
};
if (FAILED(g_pd3dDevice->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL)))
return E_FAIL;
VOID* pVertices;
if (FAILED(g_pVB->Lock(0,sizeof(triangle), &pVertices, 0)))
return E_FAIL;
memcpy(pVertices, triangle, sizeof(triangle));
g_pVB->Unlock();
return S_OK;
}
HRESULT InitD3D(HWND hWnd)
{
g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
if (NULL == g_pD3D)
return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
if(FAILED( g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice)))
{
return E_FAIL;
}
g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
// Turn off D3D lighting, since we are providing our own vertex colors
g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
if (FAILED(InitObject()))
return E_FAIL;
return S_OK;
}
void SetupMatrices()
{
D3DXMATRIX matWorld;
UINT iTime = timeGetTime() % 1000;
FLOAT fAngle = iTime * ( 2.0f * D3DX_PI ) / 1000.0f;
D3DXMatrixRotationY(&matWorld, fAngle);
g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);
D3DXVECTOR3 vEyePt(0.0f, 3.0f, -5.0f);
D3DXVECTOR3 vLookAtPt(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 vUp(0.0f, 1.0f, 0.0f);
D3DXMATRIXA16 matView;
D3DXMatrixLookAtLH(&matView, &vEyePt, &vLookAtPt, &vUp);
g_pd3dDevice->SetTransform(D3DTS_VIEW, &matView);
D3DXMATRIX matPoj;
D3DXMatrixPerspectiveFovLH(&matPoj, D3DX_PI/4, 1.0f, 1.0f, 100.0f);
g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matPoj);
}
void Render()
{
g_pd3dDevice->Clear(0,NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0);
g_pd3dDevice->BeginScene();
SetupMatrices();
g_pd3dDevice->SetStreamSource(0, g_pVB, 0, sizeof(CUSTOMVERTEX));
g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
g_pd3dDevice->EndScene();
g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
}
void Cleanup()
{
if (g_pd3dDevice)
g_pd3dDevice->Release();
if (g_pD3D)
g_pD3D->Release();
if (g_pVB)
g_pVB->Release();
}
LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_PAINT:
ValidateRect(hWnd, NULL);
return 0;
}
return DefWindowProc(hWnd, msg, wParam, lParam);
}
INT WINAPI WinMain(__in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )
{
WNDCLASSEX wc = {sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0, 0, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, L"Direct3D", NULL};
RegisterClassEx(&wc);
// Create the application window
HWND hWnd = CreateWindow(L"Direct3D",
L"Learn", WS_OVERLAPPEDWINDOW,
100, 100, 300, 300,
GetDesktopWindow(),
NULL, wc.hInstance, NULL);
//
ShowWindow(hWnd, SW_SHOW);
if (SUCCEEDED(InitD3D(hWnd)))
{
ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);
MSG msg;
ZeroMemory(&msg, sizeof(msg));
while (msg.message != WM_QUIT)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
Render();
}
}
UnregisterClass( L"Direct3D", wc.hInstance );
Cleanup();
return nShowCmd;
}
这是一个Sample,运行时编译器报错。
错误描述:
1>正在编译资源… 1>正在编译资源清单… 1>正在链接… 1>LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 1>生成日志保存在“file://E:\HelloC\ShapeFill V11\ShapeFill\Debug\ShapeFill.log” 1>ShapeFill- 1个错误,0个警告 ========== 全部重新生成: 0 已成功, 1 已失败, 0 已跳过 ==========
此时可以通过两种方法解决:
解决方案:
第一步:将 项目——项目属性——配置属性——连接器——清单文件——嵌入清单 “是”改为“否”。若还不能解决问题进入第二步。
第二步:查看计算机是否为64bit操作系统,如是,继续如下操作。 查找是否有两个cvtres.exe。 …\vc\bin\cvtres.exe(VS2010的安装目录) C:\Windows\www.sychzs.cn\Framework\v4.0.30319\cvtres.exe 右键属性—详细信息, 查看两者版本号,删除/重命名较旧的版本。
第二种方法可以避免每次都需要进行设置。
运行成功,可是编译器提醒缺少MSVCR100D.dll,此时只需要在网上下载MSVCR100D.dll放到C:\Windows\SysWOW64(64位机器放在这个目录)下即可。
此时终于成功了!
接下来终于可以正式的开始DirectX11的学习了。
安装VS编译器
在windows安装NVIDIA的CUDA驱动需要先安装VS的编译器,VS最低的版本是VS2010,网上去下个破解自己安装一下就行,这里不做特别说明。
安装CUDA
新版本的CUDA已经安装起来相当方便了,只需要去官网根据操作系统选择自己对应的版本cuda就行,下载建议使用local版本,而不是network版本,离线安装就是要方便一点。
现在下来之后直接双击安装,除非C盘存在空间的问题,否则不建议更改安装目录,因为默认的安装目录比较好找。
安装cudnn
cudnn是NVIDIA公司推出的一个卷积计算库,其实就是几个函数,在官网上下载对应版本的Cudnn源码,cudnn不是开源,需要你去注册一个NVIDIA账号填个问卷才能下载。然后根据cuda的版本和windows的版本选择相应的cudnn源码,不知道为什么官网没有给出win8版本的,我想win7和win10版本应该可以兼容使用吧。
下载下来之后直接解压,解压之后有三个夹bin,lib,include,有过VS开发经验的人能够懂这是什么,bin的文件夹路径把添加到path里面去,lib是dll,include是源码,都要对应的添加,不过可能有些电脑小白问path是啥啊。
如果你觉得这个有点慌的话,你把解压之后的文件直接将cudnn下的所有文件夹复制到cuda的根目录就可以,文件夹会自动合并,你会发现cuda的根目录也有include,bin,lib三个夹,cuda的根目录应该在C盘program file什么的里面,就是你安装cuda的那个路径。
win7和win10直接下载编译好了的版本,win8亲测可以用win7版本,如果不能使用的话就自己用VS重新编译一下吧。
检验
安装好了之后,在python环境里面import tensorflow
五个success里面有一个就是cudnn,如下图,如果success成功了就说明安装好了
Anaconda环境搭建
Tensorflow在最新版本0.12目前支持了windows系统,虽然还有部分功能不能使用,但是足够平时使用了,但是这个版本的tensorflow只支持py3.5。为了规避各种麻烦的库环境搭建的问题,最脑残的安装方式是下载最新版的Anaconda3安装,这里给出官方下载链接,下载版本是python3.5对应的Anaconda4.2.0。
下载下来之后就双击一路正常安装就行。
Tensorflow安装
去Tensorflow官网现在tensorflow0.12.0的CPU版本,下载链接,如果你要现在GPU版本,你也可以进入tensorflow官网下载编译好的GPU版本对应的whl文件。
然后cmd进入命令模式,把下载的whl文件放到你的系统根目录(就是cmd模式下默认的那个路径,当然你也可以cd到你whl文件存在的路径安装),运行以下命令:
pip install tensorflow
###或者下载安装文件用下面这种方式
pip install tensorflow-0.12.0rc0-cp35-cp35m-win_amd64.whl
GPU版本用以下命令
pip install tensorflow-gpu
keras、Tensorlayer安装
因为之前已经安装了Anaconda,所以安装keras和Tensorlayer就变得十分方便,只要进入cmd命令,运行以下命令:
pip install keras
pip install tensorlayer
就可以完成傻瓜式的安装。
测试
Anaconda自带matlab风格的IDE Spyder,你可以用Spyder进入界面运行python文件,也可以直接cmd命令模式下测试,只需要运行以下命令:
python
进入python环境
import tensorflow
import keras
import tensorlayer
如果没有error就说明安装成功,有GPU的warning没关系,因为只是用CPU版本的而已。
最近在折腾了一下VS2012的OpenCVS2.4.5配置,同VS2010下基本相同,做个简单的记录,以备日后查阅。
1. 安装OpenCV
从OpenCV官网:http://www.sychzs.cn/下载OpenCV安装包,放到想要安装的位置双击,即可安装,我这里是安装在C:\Program Files\opencv的位置
2. 新建工程
在这里就使用简单的控制程序进行测试了,截图如图一所示:
图 1 新建32位控制台项目
3.添加依赖
在新建好项目之后,为了能使用OpenCV的函数库我们首先需要为该项目添加好OpenCV依赖,具体步骤图2。
项目名称->右键->属性
图 2 添加VC++目录依
???? 2. 添加VC++目录依赖,首先在VC++ Directories(C++目录)中的Executable Directories中添加好C:\Program Files\opencv\build\x86\vc11\bin;在Include Directories中添加C:\Program Files\opencv\build\include;C:\Program Files\opencv\build\include\opencv;C:\Program Files\opencv\build\include\opencv2;在Library Directories中添加lib依赖,为该项增加路径C:\Program Files\opencv\build\x86\vc11\lib
???? 3. 添加连接器依赖,在属性窗口中选择连接器->输入(linker->input),如图3所示。在附加依赖(Additional Dependencies)那项增加该OpenCV中所需要的包,不一定要全部加上,选择部分即可,注意添加的时候包要带后缀名,添加完一个后,回车换行再加下一个,添加完如图4所示。
图 3 添加Linker包依赖
图 4 添加完成后结果
4. 示例代码测试
在第三部,我们已经完成了本项目所需要的OpenCV包的配置了,下面我们可以用一小段OpenCV项目代码来测试配置是否准确,代码如下:
// OpenCVTest.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include
using namespace std;
using namespace cv;
int _tmain(int argc, _TCHAR* argv[])
{
const char* imagename = "D:\\Image\\yuner.jpg";
//从文件中读入图像
Mat img = imread(imagename);
//如果读入图像失败
if(img.empty())
{
fprintf(stderr, "Can not load image %s\n", imagename);
return -1;
}
//显示图像
imshow("YunEr", img);
//此函数等待按键,按键盘任意键就返回
waitKey();
return 0;
}
运行结果如下,这里就不对该程序进行解释了,这程序的主要功能是显示了一张允儿的照片,运行结果如图5。
图 5 运行结果
5. 定制OpenCV工程模板
从以上的配置步骤我们知道,在VS2012中新建OpenCV工程,需要进行很多步骤的琐碎步骤进行配置,中间容易出错,尤其是对于我们初学者,需要新建很多测试工程,如果每个都去配置那就太麻烦了。就目前看来,解决的办法有两种:一是为以后所有的项目中添加OpenCV那套配置,该方法在网上的博客中也写的最多如:http://www.sychzs.cn/note/271142663/;二是同Word等类似,VS为我们提供了一个项目模板功能,我们可以新建一个OpenCV模板,之后的工程就根据该模板新建即可。下面就是第二种方法的步骤了:
同原来一样,我们新建一个工程,这里同样选为32位控制台类型,新建完后,按照上面所说的步骤为其添加好OpenCV依赖,添加完依赖如图6所示
图 6 OpenCV模板
???? 2.导出模板
单击文件->导出模板(File->Explorer Templete),然后单击下一步,选择Project Templete,再选择一张图片作为模板标识,单击完成即可,生成的模板以zip文件存放在VS的默认目录下,我的存储在:C:\Users\wangmurong\Documents\Visual Studio 2012\My Exported Templates
图 7 导出模板
从模板新建
创建好模板以后,我们就可以根据模板来新建了,同样,选择新建32控制台程序,如图8所示,我们可以看到,我们的模板已经被添加到默认新建模板中去了。根据该模板新建的工程就可以直接使用OpenCV了,不用再添加了,当然,如果模板中的lib文件不够的话还是需要再手动添加的。
图 8 根据模板新建
最后再添加几个常用的OpenCV学习网址吧:
http://www.sychzs.cn/http://www.sychzs.cn/index.php/%E9%A6%96%E9%A1%B5http://www.sychzs.cn/neo/groups/OpenCV/info