Directx11学习笔记【十二】 画一个旋转的彩色立方体
上一次我们学习了如何画一个2D三角形,现在让我们进一步学习如何画一个旋转的彩色立方体吧。
具体流程同画三角形类似,因此不再给出完整代码了,不同的部分会再说明。
由于我们要画彩色的立方体,所以顶点结构体中加入颜色变量
struct Vertex
{
XMFLOAT3 pos;
XMFLOAT4 color;
};
着色器代码
cbuffer cbPerObject
{
float4x4 gWorldViewProj;
}; struct VertexIn
{
float3 PosL : POSITION;
float4 Color : COLOR;
}; struct VertexOut
{
float4 PosH : SV_POSITION;
float4 Color : COLOR;
}; VertexOut VS(VertexIn vin)
{
VertexOut vout; // Transform to homogeneous clip space.
vout.PosH = mul(float4(vin.PosL, 1.0f), gWorldViewProj); // Just pass vertex color into the pixel shader.
vout.Color = vin.Color; return vout;
} float4 PS(VertexOut pin) : SV_Target
{
return pin.Color;
} technique11 ColorTech
{
pass P0
{
SetVertexShader( CompileShader( vs_5_0, VS() ) );
SetGeometryShader( NULL );
SetPixelShader( CompileShader( ps_5_0, PS() ) );
}
}
定义了一个矩阵gWorldViewProj,后面我们会利用它进行旋转立方体
BoxDemo.h
#pragma once #include "Dx11DemoBase.h"
#include "d3dx11effect.h" class BoxDemo : public Dx11DemoBase
{
public:
BoxDemo();
~BoxDemo(); bool LoadContent() override;
void UnLoadContent() override; void Update(float dt) override;
void Render() override; private:
ID3D11Buffer *m_pVertexBuffer;
ID3D11Buffer *m_pIndexBuffer;//新增
ID3D11InputLayout *m_pInputLayout; ID3DX11Effect *m_pFx;
ID3DX11EffectTechnique *m_pTechnique;
ID3DX11EffectMatrixVariable *m_pFxWorldViewProj;
XMFLOAT4X4 m_world;
XMFLOAT4X4 m_view;
XMFLOAT4X4 m_proj; };
LoadContent()函数
顶点信息及缓冲的创建
Vertex vertices[] =
{
{ XMFLOAT3(-0.5f, -0.5f, -0.5f), XMFLOAT4(, , , ) },//white
{ XMFLOAT3(-0.5f, +0.5f, -0.5f), XMFLOAT4(, , , ) },//black
{ XMFLOAT3(+0.5f, +0.5f, -0.5f), XMFLOAT4(, , , ) },//red
{ XMFLOAT3(+0.5f, -0.5f, -0.5f), XMFLOAT4(, , , ) },//green
{ XMFLOAT3(-0.5f, -0.5f, +0.5f), XMFLOAT4(, , , ) },//blue
{ XMFLOAT3(-0.5f, +0.5f, +0.5f), XMFLOAT4(, , , ) },//yellow
{ XMFLOAT3(+0.5f, +0.5f, +0.5f), XMFLOAT4(, , , ) },//cyan
{ XMFLOAT3(+0.5f, -0.5f, +0.5f), XMFLOAT4(, , , ) }//magenta
}; D3D11_BUFFER_DESC vertexDesc;
ZeroMemory(&vertexDesc, sizeof(vertexDesc));
vertexDesc.Usage = D3D11_USAGE_DEFAULT;
vertexDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
vertexDesc.ByteWidth = sizeof(Vertex)* ; D3D11_SUBRESOURCE_DATA resourceData;
ZeroMemory(&resourceData, sizeof(resourceData));
resourceData.pSysMem = vertices;
result = m_pd3dDevice->CreateBuffer(&vertexDesc, &resourceData, &m_pVertexBuffer);
if (FAILED(result))
{
return false;
}
相比三角形,立方体还要定义Index信息,来确定立方体的六个面
UINT indices[] = {
// front face
, , ,
, , ,
// back face
, , ,
, , ,
// left face
, , ,
, , ,
// right face
, , ,
, , ,
// top face
, , ,
, , ,
// bottom face
, , ,
, ,
};
D3D11_BUFFER_DESC indexDesc;
ZeroMemory(&indexDesc, sizeof(indexDesc));
indexDesc.Usage = D3D11_USAGE_IMMUTABLE;
indexDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
indexDesc.ByteWidth = sizeof(UINT)* ;
D3D11_SUBRESOURCE_DATA indexData;
ZeroMemory(&indexData, sizeof(indexData));
indexData.pSysMem = indices;
result = m_pd3dDevice->CreateBuffer(&indexDesc, &indexData, &m_pIndexBuffer);
if (FAILED(result))
{
return false;
}
定义输入布局
D3D11_INPUT_ELEMENT_DESC solidColorLayout[] =
{
{ "POSITION", , DXGI_FORMAT_R32G32B32_FLOAT, , , D3D11_INPUT_PER_VERTEX_DATA, },
{ "COLOR", , DXGI_FORMAT_R32G32B32_FLOAT, , , D3D11_INPUT_PER_VERTEX_DATA, }
};
UINT numLayoutElements = ARRAYSIZE(solidColorLayout);
D3DX11_PASS_DESC passDesc;
m_pTechnique->GetPassByIndex()->GetDesc(&passDesc); result = m_pd3dDevice->CreateInputLayout(solidColorLayout, numLayoutElements, passDesc.pIAInputSignature,
passDesc.IAInputSignatureSize, &m_pInputLayout);
Update()函数----实现旋转
怎么实现立方体的旋转呢?我们之前不是给出了 world,view,proj三个矩阵吗,实现旋转的一种方式就是根据游戏时间旋转相应矩阵(例如world矩阵)。
可以定义一个静态变量表示游戏时间,每一帧运行时更新t值,同时对矩阵作相应旋转即可。
static float t = 0.0f;
t += (float)XM_PI * 0.0125f;
static DWORD dwTimeStart = ;
DWORD dwTimeCur = GetTickCount();
if (dwTimeStart == )
dwTimeStart = dwTimeCur;
t = (dwTimeCur - dwTimeStart) / 1000.0f; XMVECTOR pos = XMVectorSet(2.0f, 0.0f, 0.0f, 1.0f);
XMVECTOR target = XMVectorSet(0.0f, 0.0f, 0.0f, 1.0f);
XMVECTOR up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f); XMMATRIX V = XMMatrixLookAtLH(pos, target, up);
XMStoreFloat4x4(&m_view, V);
XMMATRIX T = XMMatrixPerspectiveFovLH(XM_PIDIV2, m_width / static_cast<float>(m_height),
0.01f, 100.0f);
XMStoreFloat4x4(&m_proj, T);
//根据时间旋转world矩阵
XMMATRIX P = XMMatrixRotationY(t);
XMStoreFloat4x4(&m_world, P);
Render()函数
和之前的代码大部分一样,不同的是要设置IndexBuffer,绘制的时候要用DrawIndexed()而不是Draw().
if (m_pImmediateContext == )
return;
//清除渲染目标视图
float clearColor[] = { 1.0f, 1.0f, 1.0f, 1.0f };//背景颜色
m_pImmediateContext->ClearRenderTargetView(m_pRenderTargetView, clearColor); UINT stride = sizeof(Vertex);
UINT offset = ;
//设置数据信息格式控制信息
m_pImmediateContext->IASetInputLayout(m_pInputLayout);
//设置要绘制的几何体信息
m_pImmediateContext->IASetVertexBuffers(,,&m_pVertexBuffer,&stride,&offset);
m_pImmediateContext->IASetIndexBuffer(m_pIndexBuffer, DXGI_FORMAT_R32_UINT, );
//指明如何绘制
m_pImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); //设置常量
XMMATRIX world = XMLoadFloat4x4(&m_world);
XMMATRIX view = XMLoadFloat4x4(&m_view);
XMMATRIX proj = XMLoadFloat4x4(&m_proj);
XMMATRIX worldViewProj = world*view*proj;
m_pFxWorldViewProj->SetMatrix(reinterpret_cast<float*>(&worldViewProj)); D3DX11_TECHNIQUE_DESC techDesc;
m_pTechnique->GetDesc(&techDesc);
for (UINT i = ; i < techDesc.Passes; ++i)
{
m_pTechnique->GetPassByIndex(i)->Apply(, m_pImmediateContext);
m_pImmediateContext->DrawIndexed(, , );
}
//马上输出
m_pSwapChain->Present(, );
这样我们的工作都完成了,运行便可以得到一个旋转的彩色立方体了.
下面是运行的一个截图

Directx11学习笔记【十二】 画一个旋转的彩色立方体的更多相关文章
- python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL
python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...
- Directx11学习笔记【二十一】 封装键盘鼠标响应类
原文:Directx11学习笔记[二十一] 封装键盘鼠标响应类 摘要: 本文由zhangbaochong原创,转载请注明出处:http://www.cnblogs.com/zhangbaochong/ ...
- Go语言学习笔记十二: 范围(Range)
Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...
- Directx11学习笔记【二十二】 用高度图实现地形
本文由zhangbaochong原创,转载请注明出处http://www.cnblogs.com/zhangbaochong/p/5827714.html 在前面我们曾经实现过简单的地形(Direct ...
- Directx11学习笔记【二】 将HelloWin封装成类
我们把上一个教程的代码封装到一个类中来方便以后的使用. 首先新建一个空工程叫做MyHelloWin,添加一个main.cpp文件,然后新建一个类叫做MyWindow,将于窗体有关的操作封装到里面 My ...
- java jvm学习笔记十二(访问控制器的栈校验机制)
欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 本节源码:http://download.csdn.net/detail/yfqnihao/4863854 这一节,我们 ...
- (C/C++学习笔记) 十二. 指针
十二. 指针 ● 基本概念 位系统下为4字节(8位十六进制数),在64位系统下为8字节(16位十六进制数) 进制表示的, 内存地址不占用内存空间 指针本身是一种数据类型, 它可以指向int, char ...
- Python学习笔记(十二)—Python3中pip包管理工具的安装【转】
本文转载自:https://blog.csdn.net/sinat_14849739/article/details/79101529 版权声明:本文为博主原创文章,未经博主允许不得转载. https ...
- Directx11学习笔记【二十】 使用DirectX Tool Kit加载mesh
本文由zhangbaochong原创,转载请注明出处:http://www.cnblogs.com/zhangbaochong/p/5788482.html 现在directx已经不再支持.x文件了, ...
随机推荐
- VMware vSphere 服务器虚拟化之二十八 桌面虚拟化之安装View传输服务器
VMware vSphere 服务器虚拟化之二十八 桌面虚拟化之安装View传输服务器 View 传输服务器用于管理和简化数据中心与在最终用户本地系统上检出使用的 View 桌面之间的数据传输.必须安 ...
- FreeNAS 9.1.1 发布,网络存储系统 - 开源中国社区
FreeNAS 9.1.1 发布,网络存储系统 - 开源中国社区 FreeNAS 9.1.1 发布,网络存储系统
- 外语学习强烈推荐Rosetta Stone
外语学习强烈推荐Rosetta Stone 外语学习强烈推荐Rosetta Stone
- R语言与数据分析之九:时间内序列--HoltWinters指数平滑法
今天继续就指数平滑法中最复杂的一种时间序列:有增长或者减少趋势而且存在季节性波动的时间序列的预測算法即Holt-Winters和大家分享.这样的序列能够被分解为水平趋势部分.季节波动部分,因此这两个因 ...
- java中线程中的相关知识点
(1)守护线程必须在线程start前设置(2)守护线程在所有用户线程结束后,也会终止(3)由于(2)所有守护线程不能执行一些读写操作,原因:如果守护线程在执行读写操作时,如果用户线程结束了,守护线程的 ...
- ZOJ 3635 Cinema in Akiba(线段树)
Cinema in Akiba (CIA) is a small but very popular cinema in Akihabara. Every night the cinema is ful ...
- xcode6 iOS sdk8.1隐藏系统状态栏
在代码项目(uzplayer)从iOS6升级到iOS8之后,头发如今视频播放器有.系统状态栏后面的背景: 这样就会导致有的时候按下Donebutton,或者拖滑块没有效果 所以,我们须要想个办法.把这 ...
- hdu3664(递推dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3664 分析:dp[i][j]表示i个数的排列中E值为j的个数.假设现在已有一个E值为j的i的排列,对于 ...
- STP学习总结
STP学习总结 STP是广泛应用在二层的具有冗余的网络中用来消除环路的一种机制,当然二层环网中用来消除环路的技术还有RRPP和H3C的smart-link技术等. 一.STP的一些基本概念 STP是I ...
- 理解Javascript的动态语言特性
原文:理解Javascript的动态语言特性 理解Javascript的动态语言特性 Javascript是一种解释性语言,而并非编译性,它不能编译成二进制文件. 理解动态执行与闭包的概念 动态执行: ...