Direct3D中的光照
一、概述
二、光照的组成
三、材质
四、顶点法线
五、光源
D3DLIGHTTYPE Type;
D3DCOLORVALUE Diffuse;
D3DCOLORVALUE Specular;
D3DCOLORVALUE Ambient;
D3DVECTOR Position;
D3DVECTOR Direction;
float Range;
float Falloff;
float Attenuation0;
float Attenuation1;
float Attenuation2;
float Theta;
float Phi;
} D3DLIGHT9;
六、示例代码
#include <Windows.h>
#include <mmsystem.h>
#include <d3dx9.h>
#pragma warning( disable : 4996 )
#include <strsafe.h>
#pragma warning( default : 4996 )LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL;struct CUSTOMVERTEX
{CUSTOMVERTEX(){}CUSTOMVERTEX(float ax, float ay, float az, float anx, float any, float anz){x = ax, y = ay, z = az, nx = anx, ny = any, nz = anz; }FLOAT x, y, z; FLOAT nx, ny, nz;
};#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)HRESULT InitD3D( HWND hWnd )
{if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )return E_FAIL;D3DPRESENT_PARAMETERS d3dpp;ZeroMemory( &d3dpp, sizeof( d3dpp ) );d3dpp.Windowed = TRUE;d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;d3dpp.EnableAutoDepthStencil = FALSE;d3dpp.AutoDepthStencilFormat = D3DFMT_D16;if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp, &g_pd3dDevice ) ) ){return E_FAIL;}return S_OK;
}HRESULT InitGeometry()
{if( FAILED( g_pd3dDevice->CreateVertexBuffer( 12 * sizeof( CUSTOMVERTEX ),0, D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT, &g_pVB, NULL ) ) ){return E_FAIL;}CUSTOMVERTEX* pVertices;if( FAILED( g_pVB->Lock( 0, 0, ( void** )&pVertices, 0 ) ) )return E_FAIL;pVertices[0] = CUSTOMVERTEX(0.0f, 1.0f, 0.0f, -0.57735f, -0.57735f, -0.57735f);pVertices[1] = CUSTOMVERTEX( 1.0f, 0.0f, 0.0f, -0.57735f, -0.57735f, -0.57735f);pVertices[2] = CUSTOMVERTEX( 0.0f, 0.0f, 1.0f, -0.57735f, -0.57735f, -0.57735f);pVertices[3] = CUSTOMVERTEX(0.0f, 1.0f, 0.0f, 0.57735f, -0.57735f, -0.57735f);pVertices[4] = CUSTOMVERTEX( 0.0f, 0.0f, 1.0f, 0.57735f, -0.57735f, 0.57735f);pVertices[5] = CUSTOMVERTEX(-1.0f, 0.0f, 0.0f, 0.57735f, -0.57735f, -0.57735f);pVertices[6] = CUSTOMVERTEX(0.0f, 1.0f, 0.0f, 0.57735f, -0.57735f, 0.57735f);pVertices[7] = CUSTOMVERTEX(-1.0f, 0.0f, 0.0f, 0.57735f, -0.57735f, 0.57735f);pVertices[8] = CUSTOMVERTEX(0.0f, 0.0f, -1.0f, 0.57735f, -0.57735f, 0.57735f);pVertices[9] = CUSTOMVERTEX(0.0f, 1.0f, 0.0f, -0.57735f, -0.57735f, 0.57735f);pVertices[10] = CUSTOMVERTEX( 0.0f, 0.0f, -1.0f, -0.57735f, -0.57735f, 0.57735f);pVertices[11] = CUSTOMVERTEX(1.0f, 0.0f, 0.0f, -0.57735f, -0.57735f, 0.57735f);g_pVB->Unlock();return S_OK;
}VOID Cleanup()
{if( g_pVB != NULL )g_pVB->Release();if( g_pd3dDevice != NULL )g_pd3dDevice->Release();if( g_pD3D != NULL )g_pD3D->Release();
}VOID SetupMatrices()
{D3DXVECTOR3 vEyePt( 0.0f, 3.0f,-5.0f );D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );D3DXMATRIXA16 matView;D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );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 );
}VOID SetupLights()
{D3DMATERIAL9 mtrl;ZeroMemory( &mtrl, sizeof( D3DMATERIAL9 ) );mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f;mtrl.Diffuse.b = mtrl.Ambient.b = 0.0f;mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;g_pd3dDevice->SetMaterial( &mtrl );D3DXVECTOR3 vecDir;D3DLIGHT9 light;ZeroMemory( &light, sizeof( D3DLIGHT9 ) );light.Type = D3DLIGHT_DIRECTIONAL;light.Diffuse.r = 1.0f;light.Diffuse.g = 1.0f;light.Diffuse.b = 1.0f;vecDir = D3DXVECTOR3( 1, 0, 0 );D3DXVec3Normalize( ( D3DXVECTOR3* )&light.Direction, &vecDir );g_pd3dDevice->SetLight( 0, &light );g_pd3dDevice->LightEnable( 0, TRUE );g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );
}VOID Render()
{g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET,D3DCOLOR_XRGB( 0, 0, 255 ), 1.0f, 0 );if( SUCCEEDED( g_pd3dDevice->BeginScene() ) ){SetupLights();SetupMatrices();g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof( CUSTOMVERTEX ) );g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 4 );g_pd3dDevice->EndScene();}g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}LRESULT WINAPI 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 );
}INT WINAPI wWinMain( HINSTANCE hInst, HINSTANCE, LPWSTR, INT )
{WNDCLASSEX wc ={sizeof( WNDCLASSEX ), CS_CLASSDC, MsgProc, 0L, 0L,GetModuleHandle( NULL ), NULL, NULL, NULL, NULL,L"D3D Tutorial", NULL};RegisterClassEx( &wc );HWND hWnd = CreateWindow( L"D3D Tutorial", L"D3D Tutorial 04: Lights",WS_OVERLAPPEDWINDOW, 100, 100, 600, 600,NULL, NULL, wc.hInstance, NULL );if( SUCCEEDED( InitD3D( hWnd ) ) ){if( SUCCEEDED( InitGeometry() ) ){ShowWindow( hWnd, SW_SHOWDEFAULT );UpdateWindow( hWnd );MSG msg;ZeroMemory( &msg, sizeof( msg ) );while( msg.message != WM_QUIT ){if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) ){TranslateMessage( &msg );DispatchMessage( &msg );}elseRender();}}}UnregisterClass( L"D3D Tutorial", wc.hInstance );return 0;
}
运行效果如下:
Direct3D中的光照相关推荐
- Direct3D中的四大变换
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8408723 作者:毛星云(浅墨 ...
- Direct3D中的纹理映射
一.概要 为了使渲染的图形看起来更真实,Direct3D提供了在物体表面绘制纹理的功能.一般来说,纹理是表示物体表面细节的一幅或几幅二维图形,也称纹理贴图.借助纹理映射技术,我们可 ...
- 终于搞定Direct3D中视频播放
弄了好长一段时间,今天终于把自己录的测试视频在Direct3D中显示出来,发个图留念. 翻了好久DirectShow的Sample例子Texture3D9,还有就是看参考书<<The De ...
- [Render] 适用于高级Unity创作者的通用渲染管线[4] - URP中的光照
RuntimeMapMaker3D-Pro 英文原文:https://resources.unity.com/games/introduction-universal-render-pipeline- ...
- Introduction to 3D Game Programming with DirectX 11学习笔记 6 Direct3D中的绘制(一)
顶点和顶点布局 在Direct3D中,顶点由空间位置和各种附加属性组成,Direct3D可以让我们灵活地建立属于我们自己的顶点格式:换句话说,它允许我们定义顶点的分量.要创建一个自定义的顶点格式,我们 ...
- Unity中调整光照特效的7个技巧
适当为游戏场景添加光照效果,能够有效增强场景氛围,让玩家体验更佳.今天将为大家分享在Unity中调整光照特效的7个技巧,让整个游戏场景氛围更引人入胜. 1.使用线性颜色空间 在为场景添加光照效果之前, ...
- Unity5中的光照简介
unity 5中的光照可以用整本书来说明,此文是过去几个月使用 unity5 的简单汇总.下面主要分6个部分来讲解. Forward(前向)与Deferred(延迟)渲染 Realtime(实时)与B ...
- 地堡中的光照问题_扑扑和火力地堡的更新
地堡中的光照问题 重点 (Top highlight) Flutter is more than just an engine, a set of widgets, and some tools; i ...
- 关于Unity中的光照(六)
反射探头 1:镜子金属等具有光滑表面的物体都会反射,而游戏中计算实时反射非常消耗CPU的资源, unity5.0新增了一个反射探头的技术,通过采样点,生成反射Cubemap,然后通过特定的着色器从Cu ...
最新文章
- LeetCode简单题之在区间范围内统计奇数数目
- 日期处理工具类 -【二】
- 用 C 语言开发一门编程语言 — 基于 Lambda 表达式的函数设计
- autoresetevent java_[原创]AutoResetEvent, ManualResetEvent的Java模拟
- CSS中的margin、border、padding区别 CSS padding margin border属性详解
- python3 字典有序_Python3 有序字典—OrderedDict()
- 计算机系统-电路设计10-寄存器的内部电路实现(输入与输出不同线)
- c语言int grade 5,C语言补考!!!
- python中聚类和分类的区别_聚类与分类有什么区别?
- 通达OA2017 工作流设计中“退回”功能的升级测试(图文)
- 涉密计算机违规外联检查,涉密计算机违规外联及移动存储介质使用检查的研究与实现...
- 国仁猫哥:视频号超详细运营攻略教程;教你如何打造一个优质的视频号【建议收藏】
- OpenCV基础教程——视频的读取与写入(超详细+附代码)
- libuv访问mysql_libuv中的QUEUE
- 记账的优缺点分析 聊聊记账这些事
- 阿里企业云邮箱 报错 526 Authentication failure[0]
- 面试:自我问题反思总结
- 解读阿里精准推广的核心算法
- 八码数 · 哈希+BFS
- 【ChatGPT】使用ChatGPT进行51单片机程序编程体验