Directx11学习笔记【十一】 画一个简单的三角形--effect框架的使用

这里不再介绍effect框架的具体使用,有关effect框架使用可参考http://www.cnblogs.com/zhangbaochong/p/5475961.html

实现的功能依然是画一个简单的三角形,只不过使用了effect框架。

为了体现使用effect框架方便变量绑定的优点,我们对着色器代码做了修改,增加了一个常量float4x4 gWorldViewProj

cbuffer cbPerObject
{
    float4x4 gWorldViewProj;
};

float4 VS_Main( float4 pos : POSITION ) : SV_POSITION  

{
    pos = mul(pos,gWorldViewProj);
    return pos;  

}  

float4 PS_Main( float4 pos : SV_POSITION ) : SV_TARGET  

{  

    return float4( 1.0f, 0.0f, 0.0f, 1.0f );  

} 

technique11 ColorTech
{
    pass P0
    {
        SetVertexShader( CompileShader( vs_5_0, VS_Main() ) );
        SetGeometryShader( NULL );
        SetPixelShader( CompileShader( ps_5_0, PS_Main() ) );
    }
}

由于代码很简单,这里不再给出解释,直接看代码吧!

下面是修改后的TriangleDemo.h

 1 #pragma once
 2
 3 #include "Dx11DemoBase.h"
 4 #include "d3dx11effect.h"
 5
 6 class TriangleDemo : public Dx11DemoBase
 7 {
 8 public:
 9     TriangleDemo();
10     ~TriangleDemo();
11
12     bool LoadContent() override;
13     void UnLoadContent() override;
14
15     void Update(float dt) override;
16     void Render() override;
17
18 private:
19     ID3D11Buffer *m_pVertexBuffer;
20     ID3D11InputLayout *m_pInputLayout;
21
22     ID3DX11Effect *m_pFx;
23     ID3DX11EffectTechnique *m_pTechnique;
24     ID3DX11EffectMatrixVariable *m_pFxWorldViewProj;
25     XMFLOAT4X4 m_world;
26     XMFLOAT4X4 m_view;
27     XMFLOAT4X4 m_proj;
28
29 };

TriangleDemo.cpp

  1 #include "TriangleDemo.h"
  2
  3
  4 struct VertexPos
  5 {
  6     XMFLOAT3 pos;
  7 };
  8
  9 TriangleDemo::TriangleDemo()
 10 : m_pInputLayout(0), m_pVertexBuffer(0)
 11 {
 12     XMMATRIX I = XMMatrixIdentity();
 13     XMStoreFloat4x4(&m_world, I);
 14     XMStoreFloat4x4(&m_view, I);
 15     XMStoreFloat4x4(&m_proj, I);
 16 }
 17
 18
 19 TriangleDemo::~TriangleDemo()
 20 {
 21 }
 22
 23 void TriangleDemo::UnLoadContent()
 24 {
 25     if (m_pVertexBuffer)
 26         m_pVertexBuffer->Release();
 27     if (m_pInputLayout)
 28         m_pInputLayout->Release();
 29     if (m_pFx)
 30         m_pFx->Release();
 31     m_pVertexBuffer = 0;
 32     m_pInputLayout = 0;
 33     m_pFx = 0;
 34 }
 35
 36 bool TriangleDemo::LoadContent()
 37 {
 38     HRESULT result;
 39     VertexPos vertices[] =
 40     {
 41         XMFLOAT3(0.5f, 0.5f, 0.5f),
 42         XMFLOAT3(0.5f, -0.5f, 0.5f),
 43         XMFLOAT3(-0.5f, -0.5f, 0.5f)
 44     };
 45
 46     D3D11_BUFFER_DESC vertexDesc;
 47     ZeroMemory(&vertexDesc, sizeof(vertexDesc));
 48     vertexDesc.Usage = D3D11_USAGE_DEFAULT;
 49     vertexDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
 50     vertexDesc.ByteWidth = sizeof(VertexPos)* 3;
 51
 52     D3D11_SUBRESOURCE_DATA resourceData;
 53     ZeroMemory(&resourceData, sizeof(resourceData));
 54     resourceData.pSysMem = vertices;
 55
 56     result = m_pd3dDevice->CreateBuffer(&vertexDesc, &resourceData, &m_pVertexBuffer);
 57     if (FAILED(result))
 58     {
 59         return false;
 60     }
 61
 62
 63     DWORD shaderFlags = D3DCOMPILE_ENABLE_STRICTNESS;
 64 #if defined _DEBUG || defined DEBUG
 65     shaderFlags = D3DCOMPILE_DEBUG;
 66 #endif
 67
 68     ID3D10Blob *compiledShader = 0;
 69     ID3D10Blob *compilationMsgs = 0;
 70     result = D3DX11CompileFromFile("SolidColor.fx", 0, 0, 0, "fx_5_0", shaderFlags,
 71         0, 0, &compiledShader, &compilationMsgs, 0);
 72     if (compilationMsgs != 0)
 73     {
 74         MessageBox(0, (char*)compilationMsgs->GetBufferPointer(), 0, 0);
 75         compilationMsgs->Release();
 76         compilationMsgs = 0;
 77     }
 78     if (FAILED(result))
 79     {
 80         MessageBox(0, "载入着色器错误", 0, 0);
 81         return false;
 82     }
 83
 84     result = D3DX11CreateEffectFromMemory(compiledShader->GetBufferPointer(), compiledShader->GetBufferSize(),
 85         0, m_pd3dDevice, &m_pFx);
 86     compiledShader->Release();
 87     if (FAILED(result))
 88     {
 89         MessageBox(0, "载入着色器失败", 0, 0);
 90         return false;
 91     }
 92     m_pTechnique = m_pFx->GetTechniqueByName("ColorTech");
 93     m_pFxWorldViewProj = m_pFx->GetVariableByName("gWorldViewProj")->AsMatrix();
 94
 95     D3D11_INPUT_ELEMENT_DESC solidColorLayout[] =
 96     {
 97         { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }
 98     };
 99     UINT numLayoutElements = ARRAYSIZE(solidColorLayout);
100     D3DX11_PASS_DESC passDesc;
101     m_pTechnique->GetPassByIndex(0)->GetDesc(&passDesc);
102
103     result = m_pd3dDevice->CreateInputLayout(solidColorLayout, numLayoutElements, passDesc.pIAInputSignature,
104         passDesc.IAInputSignatureSize, &m_pInputLayout);
105
106     return true;
107 }
108
109
110
111 void TriangleDemo::Update(float dt)
112 {
113
114 }
115
116 void TriangleDemo::Render()
117 {
118     if (m_pImmediateContext == 0)
119         return;
120     //清除渲染目标视图
121     float clearColor[4] = { 0.5f, 0.5f, 0.5f, 1.0f };//背景颜色
122     m_pImmediateContext->ClearRenderTargetView(m_pRenderTargetView, clearColor);
123
124     UINT stride = sizeof(VertexPos);
125     UINT offset = 0;
126     //设置数据信息格式控制信息
127     m_pImmediateContext->IASetInputLayout(m_pInputLayout);
128     //设置要绘制的几何体信息
129     m_pImmediateContext->IASetVertexBuffers(0,1,&m_pVertexBuffer,&stride,&offset);
130     //指明如何绘制三角形
131     m_pImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
132
133     //设置常量
134     XMMATRIX world = XMLoadFloat4x4(&m_world);
135     XMMATRIX view = XMLoadFloat4x4(&m_view);
136     XMMATRIX proj = XMLoadFloat4x4(&m_proj);
137     XMMATRIX worldViewProj = world*view*proj;
138     m_pFxWorldViewProj->SetMatrix(reinterpret_cast<float*>(&worldViewProj));
139
140     D3DX11_TECHNIQUE_DESC techDesc;
141     m_pTechnique->GetDesc(&techDesc);
142     for (UINT i = 0; i < techDesc.Passes; ++i)
143     {
144         m_pTechnique->GetPassByIndex(i)->Apply(0, m_pImmediateContext);
145         m_pImmediateContext->Draw(3, 0);
146     }
147     //马上输出
148     m_pSwapChain->Present(0, 0);
149 }

运行结果同之前的一样,不再贴图了

时间: 2024-10-18 05:50:51

Directx11学习笔记【十一】 画一个简单的三角形--effect框架的使用的相关文章

DuiLib学习笔记2——写一个简单的程序

我们要独立出来自己创建一个项目,在我们自己的项目上加皮肤这才是初衷.我的新建项目名为:duilibTest 在duilib根目录下面有个 Duilib入门文档.doc 我们就按这个教程开始入门 首先新建一个win32项目 去DuiLib根目录,把目录下DuiLib文件夹拷贝到新建项目的根目录.再把这个项目添加进我们解决方案中. 从教程里面把以下代码粘贴到我们项目的stdafx.h中 // Duilib使用设置部分 #pragma once #define WIN32_LEAN_AND_MEAN

Linux系统学习笔记之 1 一个简单的shell程序

不看笔记,长时间不用自己都忘了,还是得经常看看笔记啊. 一个简单的shell程序 shell结构 1.#!指定执行脚本的shell 2.#注释行 3.命令和控制结构 创建shell程序的步骤 第一步:创建一个包含命令和控制结构的文件 第二步:修改这个文件的权限使它可以执行. 使用chmod u+x 第三步:执行shell sh /test/example.sh Shell变量 变量:是shell传递数据的一种方法,用来代表每个取值的符号名 shell有两类变量:临时变量和永久变量 临时变量是sh

[原创]java WEB学习笔记12:一个简单的serlet连接数据库实验

本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 ---------------------------------

Directx11学习笔记【十】 画一个简单的三角形

本篇笔记要实现的是在屏幕上渲染出一个三角形,重点要学习的是渲染一个几何体的流程方式. 为了渲染几何图形,需要一个顶点缓存和一个描述顶点布局的输入层,还有着色器(主要是顶点着色器和像素着色器),下面来看看具体Demo的实现. 新建一个Win32项目 ,新建一个类我们叫做TriangleDemo,继承自前面教程我们实现的基类Dx11DemoBase. TriangleDemo.h头文件 #pragma once #include "Dx11DemoBase.h" class Triangl

DirectX11 学习笔记3 - 创建一个立方体 和 坐标轴

这个程序再进一步的将上一个程序 面向对象化. 把模型类独立出来.更加像一个框架. 在此中遇到了一个很逗比的问题,弄了一晚上,看了好几遍其他列子才找到.就是有些函数一定要放在Render里面实时更新,而不是只放到初始化InitModel里面 因为当要渲染多个物体的时候,缓冲区的内容是要随设备变化的. 话不多说直接上代码 主程序main #include "D3DBase.h" #include "Axis.h" #include "Cube.h"

DirectX11 学习笔记3 - 创建一个立方体 和 轴

该方案将在进一步的程序 面向对象. 独立的模型类.更像是一个框架. 其中以超过遇到了一个非常有趣的问题,.获得一晚.我读了好几遍,以找到其他的列子.必须放在某些功能Render里面实时更新,而不是仅仅进入初始化InitModel里边 染多个物体的时候,缓冲区的内容是要随设备变化的. 话不多说直接上代码 主程序main #include "D3DBase.h" #include "Axis.h" #include "Cube.h" class D3

JSP/Servlet Web 学习笔记 DayFour —— 实现一个简单的JSP/Servlet交互

小实例说明: a)实现一个由JSP负责前台显示,Servlet负责后台处理的交互小实例 b)JSP页面由表单获取一个开始数字,一个结束数字,交给Servlet打印响应的乘法表. 未解决的问题: a)跳转貌似不能识别目录中的HTML文件,所以我把源码复制到JSP中,结果能找到. b)Servlet获取到JSP传过来的数据后,如果想在JSP页面out.print相关的JS代码貌似不能实现 目前的效果是:在当前的Servlet页面弹出了JS alert()弹窗 再重定向回之前的JSP页面. 源码: <

iOS下OpenGL ES 3.0编程入门(二 ):画一个简单三角形

上文我们讲解了如何构建一个hello world开发环境,那么这一篇我们就来画一个简单的三角形出来. 首先,我要向大家介绍下opengl es的渲染流程,在2.0之前,es的渲染采用的是固定管线,何为固定管线,就是一套固定的模板流程,局部坐标变换 -> 世界坐标变换 ->观察坐标变换->背面消除->光照->裁剪->投影->视口计算->光栅化,程序员只需要调用固定的api修改一些配置参数就可以完成整个渲染流程了.而到了2.0,固定管线改成了可编程管线,我们对整

Directx11学习笔记【十二】 画一个旋转的彩色立方体

上一次我们学习了如何画一个2D三角形,现在让我们进一步学习如何画一个旋转的彩色立方体吧. 具体流程同画三角形类似,因此不再给出完整代码了,不同的部分会再说明. 由于我们要画彩色的立方体,所以顶点结构体中加入颜色变量 struct Vertex { XMFLOAT3 pos; XMFLOAT4 color; }; 着色器代码 1 cbuffer cbPerObject 2 { 3 float4x4 gWorldViewProj; 4 }; 5 6 struct VertexIn 7 { 8 flo