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

本篇笔记要实现的是在屏幕上渲染出一个三角形,重点要学习的是渲染一个几何体的流程方式。

为了渲染几何图形,需要一个顶点缓存和一个描述顶点布局的输入层,还有着色器(主要是顶点着色器和像素着色器),下面来看看具体Demo的实现。

新建一个Win32项目 ,新建一个类我们叫做TriangleDemo,继承自前面教程我们实现的基类Dx11DemoBase。

TriangleDemo.h头文件

#pragma once#include "Dx11DemoBase.h"class TriangleDemo : public Dx11DemoBase
{
public:TriangleDemo();~TriangleDemo();bool LoadContent() override;void UnLoadContent() override;void Update(float dt) override;void Render() override;private:ID3D11Buffer *m_pVertexBuffer;ID3D11InputLayout *m_pInputLayout;ID3D11VertexShader *m_pSolidColorVS;ID3D11PixelShader *m_pSolidColorPS;
};

在类中添加了四个成员变量,用来保存着色器、顶点缓存和顶点布局的指针。

定义顶点结构体

#include "TriangleDemo.h"
#include <xnamath.h>struct VertexPos
{XMFLOAT3 pos;
};TriangleDemo::TriangleDemo()
: m_pInputLayout(0), m_pVertexBuffer(0), m_pSolidColorPS(0), m_pSolidColorVS(0)
{
}TriangleDemo::~TriangleDemo()
{
}void TriangleDemo::UnLoadContent()
{if (m_pSolidColorPS)m_pSolidColorPS->Release();if (m_pSolidColorVS)m_pSolidColorVS->Release();if (m_pVertexBuffer)m_pVertexBuffer->Release();if (m_pInputLayout)m_pInputLayout->Release();m_pSolidColorVS = 0;m_pSolidColorPS = 0;m_pVertexBuffer = 0;m_pInputLayout = 0;
}

着色器的加载

为了方便我们在基类中定义了一个CompileD3DShader函数实现加载着色器文本的功能,具体实现如下

bool Dx11DemoBase::CompileD3DShader(char* filePath, char* entry, char* shaderModel, ID3DBlob** buffer)
{DWORD shaderFlags = D3DCOMPILE_ENABLE_STRICTNESS;#if defined _DEBUG || defined DEBUGshaderFlags = D3DCOMPILE_DEBUG;
#endifID3DBlob *errorBuffer = 0;HRESULT result;result = D3DX11CompileFromFile(filePath, 0, 0, entry, shaderModel, shaderFlags, 0, 0, buffer, &errorBuffer,0);if (FAILED(result)){if (errorBuffer != 0){OutputDebugString((char*)errorBuffer->GetBufferPointer());errorBuffer->Release();}return false;}if (errorBuffer != 0){return false;}return true;
}

具体加载着色器的代码我们写在LoadContent函数中,下面是该函数的一部分代码

 1 //载入顶点着色器
 2     ID3DBlob *vsBuffer = 0;
 3     bool compileResult = CompileD3DShader("SolidColor.fx", "VS_Main", "vs_4_0", &vsBuffer);
 4     if (!compileResult)
 5     {
 6         MessageBox(0, "载入顶点着色器错误", "编译错误", MB_OK);
 7         return false;
 8     }
 9
10     HRESULT result;
11     result = m_pd3dDevice->CreateVertexShader(vsBuffer->GetBufferPointer(), vsBuffer->GetBufferSize(),
12         0, &m_pSolidColorVS);
13
14     if (FAILED(result))
15     {
16         if (vsBuffer)
17         {
18             vsBuffer->Release();
19         }
20         return false;
21     }
22
23     D3D11_INPUT_ELEMENT_DESC solidColorLayout[] =
24     {
25         {"POSITION",0,DXGI_FORMAT_R32G32B32_FLOAT,0,0,D3D11_INPUT_PER_VERTEX_DATA,0}
26     };
27
28     UINT numLayoutElements = ARRAYSIZE(solidColorLayout);
29     result = m_pd3dDevice->CreateInputLayout(solidColorLayout, numLayoutElements, vsBuffer->GetBufferPointer(),
30         vsBuffer->GetBufferSize(), &m_pInputLayout);
31     vsBuffer->Release();
32
33     if (FAILED(result))
34     {
35         return false;
36     }
37
38     //载入像素着色器
39     ID3DBlob *psBuffer = 0;
40     compileResult = CompileD3DShader("SolidColor.fx", "PS_Main", "ps_4_0", &psBuffer);
41     if (!compileResult)
42     {
43         MessageBox(0, "像素着色器加载失败", "编译错误", MB_OK);
44         return false;
45     }
46
47     result = m_pd3dDevice->CreatePixelShader(psBuffer->GetBufferPointer(), psBuffer->GetBufferSize(),
48         0, &m_pSolidColorPS);
49     psBuffer->Release();
50     if (FAILED(result))
51     {
52         return false;
53     }

其中输入布局信息D3D11_INPUT_ELEMENT_DESC

(A description of a single element for the input-assembler stage.)

定义如下

typedef struct D3D11_INPUT_ELEMENT_DESC {LPCSTR                     SemanticName;UINT                       SemanticIndex;DXGI_FORMAT                Format;UINT                       InputSlot;UINT                       AlignedByteOffset;D3D11_INPUT_CLASSIFICATION InputSlotClass;UINT                       InstanceDataStepRate;
} D3D11_INPUT_ELEMENT_DESC;

顶点信息生成及处理

TriangleDemo::LoadContent() 的 上半部分完成了 inputlayout 和 shader, 剩下的就是 vertex 这些顶点的生成及处理了。

三角形的顶点列表 vertex list 存放处在 vertices数组里, 同时这个vertices 也作为 创建vertex buffer函数CreateBuffer()的参数之一:Subresource data。

下面是LoadContent()的另外一部分代码:

 1 VertexPos vertices[]  =
 2     {
 3         XMFLOAT3(0.5f, 0.5f, 0.5f),
 4         XMFLOAT3(0.5f, -0.5f, 0.5f),
 5         XMFLOAT3(-0.5f,-0.5f,0.5f)
 6     };
 7
 8     D3D11_BUFFER_DESC vertexDesc;
 9     ZeroMemory(&vertexDesc, sizeof(vertexDesc));
10     vertexDesc.Usage = D3D11_USAGE_DEFAULT;
11     vertexDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
12     vertexDesc.ByteWidth = sizeof(VertexPos)* 3;
13
14     D3D11_SUBRESOURCE_DATA resourceData;
15     ZeroMemory(&resourceData, sizeof(resourceData));
16     resourceData.pSysMem = vertices;
17
18     result = m_pd3dDevice->CreateBuffer(&vertexDesc, &resourceData, &m_pVertexBuffer);
19     if (FAILED(result))
20     {
21         return false;
22     }
23
24     return true;

其中D3D11_BUFFER_DESC定义如下:

typedef struct D3D11_BUFFER_DESC {UINT        ByteWidth;D3D11_USAGE Usage;UINT        BindFlags;UINT        CPUAccessFlags;UINT        MiscFlags;UINT        StructureByteStride;
} D3D11_BUFFER_DESC;

D3D11_SUBRESOURCE_DATA定义如下:

typedef struct D3D11_SUBRESOURCE_DATA {const void *pSysMem;UINT       SysMemPitch;UINT       SysMemSlicePitch;
} D3D11_SUBRESOURCE_DATA;

渲染几何体

剩下代码是渲染几何体和 shaders 。我们在TriangleDemo::Render() 函数进行渲染几何体的工作

 1 void TriangleDemo::Render()
 2 {
 3     if (m_pImmediateContext == 0)
 4         return;
 5     //清除渲染目标视图
 6     float clearColor[4] = { 0.5f, 0.5f, 0.5f, 1.0f };//背景颜色
 7     m_pImmediateContext->ClearRenderTargetView(m_pRenderTargetView, clearColor);
 8
 9     UINT stride = sizeof(VertexPos);
10     UINT offset = 0;
11     //设置数据信息格式控制信息
12     m_pImmediateContext->IASetInputLayout(m_pInputLayout);
13     //设置要绘制的几何体信息
14     m_pImmediateContext->IASetVertexBuffers(0,1,&m_pVertexBuffer,&stride,&offset);
15     //指明如何绘制三角形
16     m_pImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
17     m_pImmediateContext->VSSetShader(m_pSolidColorVS, 0, 0);
18     m_pImmediateContext->PSSetShader(m_pSolidColorPS, 0, 0);
19     m_pImmediateContext->Draw(3, 0);
20     //马上输出
21     m_pSwapChain->Present(0, 0);
22 }

着色器.fx文件代码

float4 VS_Main( float4 pos : POSITION ) : SV_POSITION  {    return pos;  }  float4 PS_Main( float4 pos : SV_POSITION ) : SV_TARGET  {  return float4( 1.0f, 0.0f, 0.0f, 1.0f );  }  

我们使用的vertex shader很简单的, 仅仅是传递输入的顶点坐标到输出设备;

pixel shader的工作也很简单, 仅仅是 为每个 像素pixel 配置一种固定的颜色( 红色)。

最终效果图

posted on 2019-05-05 12:59 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/10812382.html

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

  1. tensorflow学习笔记二——建立一个简单的神经网络拟合二次函数

    tensorflow学习笔记二--建立一个简单的神经网络 2016-09-23 16:04 2973人阅读 评论(2) 收藏 举报  分类: tensorflow(4)  目录(?)[+] 本笔记目的 ...

  2. Directx11教程(6) 画一个简单的三角形(2)

    在上篇教程中,我们实现了在D3D11中画一个简单的三角形,但是,当我们改变窗口大小时候,三角形形状却随着窗口高宽比例改变而改变,如下图所示: 这是因为我们改变了窗口大小,但后缓冲大小在程序初始化时候, ...

  3. OpenGL学习笔记(2) 画一个正方形

    画一个正方形 其实,画正方形就是画两个三角形,用四个顶点以及使用索引来实现 完整代码在Square项目的Application.cpp里 先贴上窗口初始化代码 void BaseInit() {glf ...

  4. ROS2学习笔记13--编写一个简单的发布器和侦听器(C++)

    概要:这篇主要介绍编写发布器和侦听器的简单套路(C++) 环境:ubuntu20.04,ros2-foxy,vscode 最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现. 2. ...

  5. Django学习笔记2:一个简单的开发实例

    Technorati 标签: Python,Django 目标:通过开发一个简单的Todo管理应用,熟悉Django的基本概念.和使用. 运行环境 Windows Vista + Python 2.7 ...

  6. 【python10个小实验】1. 画一个简单的三角形

    对于如何编程入门,不少人都有自己的一套方法. 从我个人的角度来说,从一个个小的实战中锻炼,不失为一个好方法. 本系列,我将带大家来做10个python小实验,通过完成一系列的小目标, 一方面,熟悉py ...

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

    该方案将在进一步的程序 面向对象. 独立的模型类.更像是一个框架. 其中以超过遇到了一个非常有趣的问题,.获得一晚.我读了好几遍,以找到其他的列子.必须放在某些功能Render里面实时更新,而不是仅仅 ...

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

    小实例说明: a)实现一个由JSP负责前台显示,Servlet负责后台处理的交互小实例 b)JSP页面由表单获取一个开始数字,一个结束数字,交给Servlet打印响应的乘法表. 未解决的问题: a)跳 ...

  9. DirectX11学习笔记十 imGUI入坑

    下载地址   Immediate Mode Graphical User interface,Immediate模式,不保存UI对象,用静态方法每帧创建,Unity里的GUI就是这种模式,适合小游戏或 ...

  10. android三角形切图软件,还在为小三角形切图?使用纯CSS写一个简单的三角形

    同学们,当美工给的设计图是这样: 或者这样: 我的内心其实是拒绝的-_-:但工作还得干,大部分同学会写 .icon{width:20px;height:20px;display:block;margi ...

最新文章

  1. hdu6989 (莫队+单调栈+ST表)
  2. python使用sklearn的ConfusionMatrixDisplay来可视化混淆矩阵
  3. 申报成功后怎样修改_【小白教程】12月第3期《申报成功后,如何更正,快快收藏!》...
  4. Flash和JavaScript通信
  5. Java面试题中高级,javaif循环语句
  6. IOS中的事件响应链,事件冒泡机制基本了解
  7. jQuery之.queue()
  8. SMA2.92高频连接器的主要特点​
  9. Android酷炫计时器
  10. 17届华为杯数学建模大赛B题代码
  11. DNS加速之“智能DNS”跟“双线加速”、“CDN加速”的区别
  12. python贴吧自动签到,解放你的双手
  13. 我在用的翻译软件 - 微软翻译+网易有道词典+谷歌翻译
  14. C++什么时候用new,什么时候不用new
  15. Jenkins服务器实战-臧雪园-专题视频课程
  16. 电子元器件基础知识大全详解
  17. python后台操作炒股软件下载_GitHub - lipq525/stock-1: stock,股票系统。使用python进行开发。...
  18. 彩色图像RGB分量直方图分析matlab
  19. 一款提供 dota2 游戏相关资讯,视频,攻略,更新日志的 Android App,基于 RetrofitRxJavaMvpGreenDao
  20. parallels恢复linux密码,重置Parallels虚拟机windows密码

热门文章

  1. 天使投资人刘峻:腾讯的七条命 |捕手志
  2. # 欢迎使用马克飞象
  3. distinct和order by冲突
  4. 中国打造国产“谷歌地球”清晰度吓人
  5. 跨境电商o2o模式的表现形式有哪些?
  6. 汉光助力:科技「智宅」智慧人居-Hi-Bus智能照明监控系统
  7. sqlite只能用于android系统,android SQLite
  8. KM3模拟键盘鼠标模块使用说明---2.键盘功能
  9. nexus5刷机双清 解决手机无限重启
  10. 情商高的人所看透的四种人生真相