1.实现一个旋转的圆柱体,体现d3d光照效果

2.程序实现

#pragma once

#pragma comment(lib,"winmm.lib")

#pragma comment(lib,"d3d9.lib")
#pragma comment(lib,"d3dx9.lib") #include<d3d9.h>
#include<d3dx9.h> //自己定义顶点格式
struct CUSTOMVERTEX
{
D3DXVECTOR3 postion;
D3DXVECTOR3 normal;
}; //坐标和法向量。
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL) //函数声明
LRESULT CALLBACK MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam);
void Render();
HRESULT InitD3D(HWND hWnd);
HRESULT InitGeometry();
void CleanUp();
void SetupMatrices();
void SetupLights(); //全局变量
LPDIRECT3D9 g_pd3d=NULL;
LPDIRECT3DDEVICE9 g_pd3dDevice=NULL;
LPDIRECT3DVERTEXBUFFER9 g_d3dVertexBuffer=NULL; //主函数入口。
INT WINAPI wWinMain(HINSTANCE,HINSTANCE,LPWSTR,INT)
{
//注冊窗体类。
WNDCLASSEX wcex;
ZeroMemory(&wcex,sizeof(wcex));
wcex.cbSize=sizeof(wcex);
wcex.hInstance=GetModuleHandle(NULL);
wcex.lpfnWndProc=MsgProc;
wcex.lpszClassName=L"Self001";
wcex.style=CS_CLASSDC; RegisterClassEx(&wcex); //创建窗体。
HWND hWnd=CreateWindowEx(
WS_EX_OVERLAPPEDWINDOW,
L"Self001",
L"Self001 Window",
WS_OVERLAPPEDWINDOW,
100,
100,
300,
300,
NULL,
NULL,
wcex.hInstance,
NULL); //显示窗体。
ShowWindow(hWnd,SW_SHOWDEFAULT);
UpdateWindow(hWnd); //初始化d3d对象。
if(SUCCEEDED(InitD3D(hWnd)))
{
if(SUCCEEDED(InitGeometry()))
{
//消息循环。
MSG msg;
ZeroMemory(&msg,sizeof(msg));
while(msg.message != WM_QUIT)
{
if(PeekMessage(&msg,hWnd,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Render();
}
}
}
} //注销窗体类。
UnregisterClass(L"Self001",wcex.hInstance); return 0;
} //窗体回调函数。
LRESULT CALLBACK MsgProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_DESTROY:
CleanUp();
PostQuitMessage(0);
return 0;
} return DefWindowProc(hWnd,msg,wParam,lParam);
} //渲染。
void Render()
{
//清除目标。
g_pd3dDevice->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,0,255),1.0f,0); if(SUCCEEDED(g_pd3dDevice->BeginScene()))
{
SetupLights();
SetupMatrices(); g_pd3dDevice->SetStreamSource(0,g_d3dVertexBuffer,0,sizeof(CUSTOMVERTEX));
g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
//绘制图元
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2*50-2); g_pd3dDevice->EndScene();
} g_pd3dDevice->Present(NULL,NULL,NULL,NULL);
} //初始化d3d对象
HRESULT InitD3D(HWND hWnd)
{
//创建d3d
g_pd3d=Direct3DCreate9(D3D_SDK_VERSION);
if(g_pd3d == NULL)
{
return E_FAIL;
} //初始化d3d呈现參数。
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp,sizeof(d3dpp));
d3dpp.Windowed=TRUE;
d3dpp.hDeviceWindow=hWnd;
d3dpp.BackBufferFormat=D3DFMT_UNKNOWN;
d3dpp.SwapEffect=D3DSWAPEFFECT_DISCARD;
d3dpp.EnableAutoDepthStencil=TRUE;
d3dpp.AutoDepthStencilFormat=D3DFMT_D16; //创建设备。
if(FAILED(g_pd3d->CreateDevice(
D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&g_pd3dDevice)))
{
return E_FAIL;
} //设置背面剔除和z 缓冲
g_pd3dDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
g_pd3dDevice->SetRenderState(D3DRS_ZENABLE,TRUE); return S_OK;
} //清除d3d对象。
void CleanUp()
{
//顶点缓冲。
if(g_d3dVertexBuffer != NULL)
{
g_d3dVertexBuffer->Release();
} //设备。
if(g_pd3dDevice != NULL)
{
g_pd3dDevice->Release();
} //d3d。
if(g_pd3d != NULL)
{
g_pd3d->Release();
}
} //设置变换矩阵。
void SetupMatrices()
{
//世界变换矩阵。
D3DXMATRIXA16 matWorld;
D3DXMatrixIdentity(&matWorld);
D3DXMatrixRotationX(&matWorld,timeGetTime()/500.0f);
g_pd3dDevice->SetTransform(D3DTS_WORLD,&matWorld); //视野变换矩阵。
D3DXMATRIXA16 matView;
D3DXVECTOR3 vEye(0.0f,3.0f,-5.0f);
D3DXVECTOR3 vLookAt(0.0f,0.0f,0.0f);
D3DXVECTOR3 vUp(0.0f,1.0f,0.0f);
D3DXMatrixLookAtLH(&matView,&vEye,&vLookAt,&vUp);
g_pd3dDevice->SetTransform(D3DTS_VIEW,&matView); //投影变换矩阵。
D3DXMATRIXA16 matProj;
D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/4,1.0f,1.0f,100.0f);
g_pd3dDevice->SetTransform(D3DTS_PROJECTION,&matProj);
} //初始化几何图元。
HRESULT InitGeometry()
{
//创建顶点缓冲。
if(FAILED(g_pd3dDevice->CreateVertexBuffer(
sizeof(CUSTOMVERTEX)*2*50,
0,
D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT,
&g_d3dVertexBuffer,
NULL)))
{
return E_FAIL;
} //坐标设定。
CUSTOMVERTEX* pVertices=NULL;
if(FAILED(g_d3dVertexBuffer->Lock(0,0,(void**)&pVertices,0)))
{
return E_FAIL;
} for(DWORD i=0;i<50;i++)
{
FLOAT theta=(2*D3DX_PI*i)/(50-1);
pVertices[2*i+0].postion=D3DXVECTOR3(cosf(theta),-1,sinf(theta));
pVertices[2*i+0].normal=D3DXVECTOR3(cosf(theta),0,sinf(theta));
pVertices[2*i+1].postion=D3DXVECTOR3(cosf(theta),1,sinf(theta));
pVertices[2*i+1].normal=D3DXVECTOR3(cosf(theta),0,sinf(theta));
} g_d3dVertexBuffer->Unlock(); return S_OK;
} //设置材料和光照。
void SetupLights()
{
//材料
D3DMATERIAL9 mtrl;
ZeroMemory(&mtrl,sizeof(mtrl));
mtrl.Ambient.r=mtrl.Diffuse.r=1.0f;
mtrl.Ambient.g=mtrl.Diffuse.g=1.0f;
mtrl.Ambient.b=mtrl.Diffuse.b=0.0f;
mtrl.Ambient.a=mtrl.Diffuse.a=1.0f;
g_pd3dDevice->SetMaterial(&mtrl); //光照
D3DLIGHT9 light;
ZeroMemory(&light,sizeof(light));
light.Type=D3DLIGHT_DIRECTIONAL;
light.Diffuse.r=1.0f;
light.Diffuse.g=1.0f;
light.Diffuse.b=1.0f;
D3DXVECTOR3 normVec=D3DXVECTOR3(0.0f,0.0f,1.0f);
D3DXVec3Normalize((D3DXVECTOR3*)&light.Direction,&normVec);
light.Range=1000.0f; //环境
g_pd3dDevice->SetLight(0,&light);
g_pd3dDevice->LightEnable(0,TRUE);
g_pd3dDevice->SetRenderState(D3DRS_LIGHTING,TRUE);
g_pd3dDevice->SetRenderState(D3DRS_AMBIENT,D3DCOLOR_XRGB(10,0,0));
}

3.程序执行结果

4.注意事项。

理解材料是什么东西,尤其材料的漫射光和环境光。

理解光照是什么东西,尤其设置參数。

练习多了,慢慢的就熟悉了。

D3D 光照和材料 小样例的更多相关文章

  1. Spring DI模式 小样例

           今儿跟同事讨论起来spring早期的,通过大篇幅xml的配置演变到今天annotation的过程,然后随手写了个小样例,感觉还不错,贴到这里留个纪念. 样例就是用JAVA API的方式, ...

  2. SpringMVC+Spring+Hibernate的小样例

    Strusts2+Spring+Hibernate尽管是主流的WEB开发框架,可是SpringMVC有越来越多的人使用了.确实也很好用.用得爽! 这里实现了一个SpringMVC+Spring+Hib ...

  3. 使用Dagger2创建的第一个小样例

    将Dagger系列的咖啡壶样例再做一下简化,作为Dagger2的入门的第一个小样例. 场景描写叙述:有一个电水壶,它使用一个加热器来烧水.电水壶具备的功能有:開始加热(on方法),结束加热(off方法 ...

  4. D3D triangle list(三角形列) 小样例

    画三角形列的样例程序 #pragma once #pragma comment(lib,"d3d9.lib") #pragma comment(lib,"d3dx9.li ...

  5. D3D 线列 小样例

    画两条线 #pragma once #pragma comment(lib,"d3d9.lib") #pragma comment(lib,"d3dx9.lib" ...

  6. Android OpenGL加入光照和材料属性

    转载请注明出处:[huachao1001的专栏:http://blog.csdn.net/huachao1001] 在上一篇文章[ Android OpenGL显示随意3D模型文件 ]中.我们学习了怎 ...

  7. 简单的ADO.NET连接数据小样例

    ADO.NET连接数据库的样例如下: using System; using System.Collections.Generic; using System.ComponentModel; usin ...

  8. Java 小样例:图书馆课程设计(Java 8 版)

    用 Java 模拟一个图书馆.包含创建图书.创建读者.借书.还书.列出全部图书.列出全部读者.列出已借出的图书.列出过期未还的图书等功能. 每一个读者最多仅仅能借 3 本书,每一个书最多仅仅能借 3 ...

  9. Chromium开发--入门C++小样例

      開始做Chromium开发的时候,都是从代码去摸索的,如今有几个样例了.希望看到的同学能有帮助,比直接在大量代码里领悟要快非常多了. C++ in Chromium 101 - Codelab h ...

随机推荐

  1. python基础课程_学习笔记13:标准库:有些收藏夹——sys

    标准库:有些收藏夹 sys sys这个模块可以让你访问和python解释器联系紧密的变量和函数. sys模块中一些重要的函数和变量 函数/变量 描写叙述 argv 命令行參数,包含脚本名称 exit( ...

  2. html分析器——jericho-html-3.3分解table

    原部分来自Internet上的其他博客,只是因为很长一段时间.忘了谁是参考,这里说声抱歉.. 先贴一些html页: <html> <head> <meta http-eq ...

  3. FastJson基本使用

    在发展中Android的过程中.假设我们常与server联系,更新数据等,然后,json它必须是一个良好的数据格公式,但随着json.使用原生的解析也能够,可是非常不高效,所以这里介绍两种json数据 ...

  4. MOCK.JS 生成随机数据,拦截 Ajax 请求

    mock.js 的用处 前后端分离 :让前端攻城师独立于后端进行开发. 增加单元测试的真实性 :通过随机数据,模拟各种场景. 开发无侵入 :不需要修改既有代码,就可以拦截 Ajax 请求,返回模拟的响 ...

  5. Redis集群环境安装指南

    环境 RHLinux-6.4-64-EN, 红帽6.4 64位,英文正式公布版. Redis3.0.0 redis2.x版本号还不支持集群,3.0版本号将会支持,如今3.0版本号还在开发中,如今是be ...

  6. TFS 2010 使安装更容易,让VSS历史

    一转眼VS 2010 RC(Release Candidate)版本号已经公布一月多了,RTM(Release To Manufacturer)版本号也快妥了,已经进入了最后的倒计时,仅仅等4月12号 ...

  7. boost在自己主动确定数据类型(BOOST_TYPEOF和BOOST_AUTO)使用

    #include<boost/typeof/typeof.hpp> #include<vector> #include<iostream> #include BOO ...

  8. DHot.exe 热点新闻

    别人的电脑上的今日插件U菜,打开几个PPT文件,和一个视频文件(默认的音频和视频打开百度),结果突然弹出一个热点广告信息表,形式与风格QQ非常相似,例如下面的附图: 托盘图标: 经过搜索.得到例如以下 ...

  9. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(1)-框架搭建

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(1)-框架搭建 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) 前言:这篇博客开始我们便一步一步的来实现这 ...

  10. Activity的LaunchMode情景思考

    此链接:http://blog.csdn.net/xiaodongrush/article/details/28597855 1. 有哪几种类型?分别有什么用? http://developer.an ...