初学DirectX11, 留个纪恋。
以前学的是openGL, 最近才开始学DirectX11,写了个很垃圾的代码,怀念以前的glPushMatrix(), glPopMatrix(), glBegin(), glEnd(), 多简单啊,可惜在openGL4后面的版本中放弃了这些经典的函数,改成了跟directX差不多的自定义管线, 我觉得openGL已经被改的面目全非了,可能是openGL慢的缘故吧。openGL4.3的VAO,VBO还是不能理解。
写了个垃圾的程序,许多个几何体,自己写函数实现了以前glPushMatrix(),glPopMatrix()的功能。界面还是Qt写的,毕竟方便,调用API函数代码量太大。DirectX的代码真多啊,以后分装成一个类库试试。
贴一下主要的代码吧。

几何体顶点过多变成球的时候,运行很卡,我的代码效率海水很差啊。
#ifndef DWIDGET_H
#define DWIDGET_H
#include "xBasic.h"
#include <d3d11.h>
#include <DirectXMath.h>
#include "DPainter.h"
#include <QWidget>
#include <stack> class DPainter; class DWidget : public QWidget
{
Q_OBJECT public:
DWidget(QWidget *parent = nullptr);
~DWidget();
void rotateX();
void rotateY();
void rotateZ(); protected:
virtual void paintEvent(QPaintEvent *event);
virtual void resizeEvent(QResizeEvent *event);
void mousePressEvent(QMouseEvent *event);
virtual QPaintEngine *paintEngine() const { return nullptr; } private:
void updateWVP();
void initializeD3D();
void pushWorldMatrix();
void multipyWorldMatrix(DirectX::XMMATRIX *matrix);
void popWorldMatrix();
void worldMatrixIdentity();
void setCurrentWorldMatrix(DirectX::XMMATRIX *matrix); std::stack<XMFLOAT4X4> worldStack;
DPainter *d3dPainter;
HWND hwnd; ID3D11Device *device;
ID3D11DeviceContext *context;
IDXGISwapChain *swapChain;
ID3D11RenderTargetView *renderTargetView;
ID3D11VertexShader *VS;
ID3D11PixelShader *PS;
ID3D10Blob *VS_Buffer;
ID3D10Blob *PS_Buffer;
ID3D11Buffer *constantBuffer;
ID3D11InputLayout *vertexLayout;
ID3D11Buffer *worldBuffer;
ID3D11Buffer *viewBuffer;
ID3D11Buffer *projectionBuffer;
ID3D11DepthStencilView *depthStencilView;
ID3D11Texture2D *depthStencilBuffer;
ID3D11DepthStencilState *depthStencilState; XMFLOAT4X4 world;
XMFLOAT4X4 view;
XMFLOAT4X4 projection;
XMFLOAT4 eye;
XMFLOAT4 target;
XMFLOAT4 up;
CPerObject WVP; const D3D11_INPUT_ELEMENT_DESC layout[] =
{
{ "POSITION", , DXGI_FORMAT_R32G32B32_FLOAT, , , D3D11_INPUT_PER_VERTEX_DATA, },
{ "COLOR", , DXGI_FORMAT_R32G32B32A32_FLOAT, , , D3D11_INPUT_PER_VERTEX_DATA, },
};
int numElements = ;
}; #endif // DWIDGET_H
// cpp文件
#include "DWidget.h"
#include <qevent.h>
#include "GeometryProvider.h" ID3D11Buffer *boolBuffer;
ID3D11DepthStencilView* pDSV;
struct ABCD
{
bool a;
}isT; ID3D11Buffer *cylinderVertexBuffer;
ID3D11Buffer *cylinderIndexBuffer; DWidget::DWidget(QWidget *parent)
: QWidget(parent)
{
setAttribute(Qt::WA_PaintOnScreen, true);
setAttribute(Qt::WA_NativeWindow, true);
setAutoFillBackground(false);
setFocusPolicy(Qt::StrongFocus);
hwnd = (HWND)winId();
initializeD3D();
depthStencilBuffer = nullptr;
depthStencilView = nullptr;
d3dPainter = new DPainter;
d3dPainter->context = context;
d3dPainter->device = device;
d3dPainter->createSphere(, );
} DWidget::~DWidget()
{
context->Release();
device->Release();
} void DWidget::rotateX()
{
XMMATRIX tmpWord;// = XMLoadFloat4x4(&world);
XMVECTOR anx = XMVectorSet(, , , );
tmpWord = XMMatrixRotationAxis(anx, 0.05);
multipyWorldMatrix(&tmpWord);
update();
} void DWidget::rotateY()
{
XMMATRIX tmpWord;// = XMLoadFloat4x4(&world);
XMVECTOR anx = XMVectorSet(, , , );
tmpWord = XMMatrixRotationAxis(anx, 0.05);
multipyWorldMatrix(&tmpWord);
update();
} void DWidget::rotateZ()
{
XMMATRIX tmpWord;
XMVECTOR anx = XMVectorSet(, , , );
tmpWord = XMMatrixRotationAxis(anx, 0.01);
multipyWorldMatrix(&tmpWord);
update();
} void DWidget::paintEvent(QPaintEvent * event)
{
FLOAT bgColor[] = { 1.0f, 1.0f, 1.0f, 1.0f };
context->ClearRenderTargetView(renderTargetView, bgColor);
context->ClearDepthStencilView(depthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0.0f); {
pushWorldMatrix();
multipyWorldMatrix(&XMMatrixScaling(0.14, 0.14, 0.14));
multipyWorldMatrix(&XMMatrixTranslation(-, -, -)); context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
UINT stride = sizeof(Vertex);
UINT offset = ;
context->IASetVertexBuffers(, , &cylinderVertexBuffer, &stride, &offset);
context->IASetIndexBuffer(cylinderIndexBuffer, DXGI_FORMAT_R32_UINT, );
context->DrawIndexed(, , ); {
pushWorldMatrix();
multipyWorldMatrix(&XMMatrixTranslation(, , ));
multipyWorldMatrix(&XMMatrixScaling(0.1, 0.1, 0.1)); d3dPainter->drawSphere(); popWorldMatrix();
} for (int i = ; i < ; i++)
{
for (int j = ; j <= ; j++)
{
for (int k = ; k < ; k++)
{
pushWorldMatrix();
multipyWorldMatrix(&XMMatrixTranslation(i, j, k));
multipyWorldMatrix(&XMMatrixScaling(0.1, 0.1, 0.1));
d3dPainter->drawSphere();
popWorldMatrix(); }
}
} popWorldMatrix();
}//d3dPainter->drawSphere(); swapChain->Present(, ); } void DWidget::updateWVP()
{
XMStoreFloat4x4(&WVP.view, XMMatrixTranspose(XMLoadFloat4x4(&view)));
XMStoreFloat4x4(&WVP.world, XMMatrixTranspose(XMLoadFloat4x4(&world)));
XMStoreFloat4x4(&WVP.projection, XMMatrixTranspose(XMLoadFloat4x4(&projection)));
context->UpdateSubresource(constantBuffer, , NULL, &WVP, , );
context->VSSetConstantBuffers(, , &constantBuffer);
::isT.a = ;
} void DWidget::resizeEvent(QResizeEvent * event)
{
int width = this->width();
int height = this->height();
::xBasicChangeSize(device, context, swapChain, &renderTargetView, width, height); D3D11_TEXTURE2D_DESC depthStencilBufferDesc;
ZeroMemory(&depthStencilBufferDesc, sizeof(D3D11_TEXTURE2D_DESC));
depthStencilBufferDesc.Width = width;
depthStencilBufferDesc.Height = height;
depthStencilBufferDesc.MipLevels = ;
depthStencilBufferDesc.ArraySize = ;
depthStencilBufferDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
depthStencilBufferDesc.SampleDesc.Count = ;
depthStencilBufferDesc.SampleDesc.Quality = ;
depthStencilBufferDesc.Usage = D3D11_USAGE_DEFAULT;
depthStencilBufferDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
depthStencilBufferDesc.CPUAccessFlags = ;
depthStencilBufferDesc.MiscFlags = ; device->CreateTexture2D(&depthStencilBufferDesc, NULL, &depthStencilBuffer); D3D11_DEPTH_STENCIL_DESC depthStencilDesc;
ZeroMemory(&depthStencilDesc, sizeof(D3D11_DEPTH_STENCIL_DESC));
depthStencilDesc.DepthEnable = true;
depthStencilDesc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;
depthStencilDesc.DepthFunc = D3D11_COMPARISON_LESS;
depthStencilDesc.StencilEnable = true;
depthStencilDesc.StencilReadMask = 0xFF;
depthStencilDesc.StencilWriteMask = 0xFF;
depthStencilDesc.FrontFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
depthStencilDesc.FrontFace.StencilDepthFailOp = D3D11_STENCIL_OP_INCR;
depthStencilDesc.FrontFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
depthStencilDesc.FrontFace.StencilFunc = D3D11_COMPARISON_ALWAYS;
depthStencilDesc.BackFace.StencilFailOp = D3D11_STENCIL_OP_KEEP;
depthStencilDesc.BackFace.StencilDepthFailOp = D3D11_STENCIL_OP_DECR;
depthStencilDesc.BackFace.StencilPassOp = D3D11_STENCIL_OP_KEEP;
depthStencilDesc.BackFace.StencilFunc = D3D11_COMPARISON_ALWAYS; device->CreateDepthStencilState(&depthStencilDesc, &depthStencilState); context->OMSetDepthStencilState(depthStencilState, ); D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc;
ZeroMemory(&depthStencilViewDesc, sizeof(D3D11_DEPTH_STENCIL_VIEW_DESC));
depthStencilViewDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
depthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
depthStencilViewDesc.Texture2D.MipSlice = ; device->CreateDepthStencilView(depthStencilBuffer, &depthStencilViewDesc, &depthStencilView);
context->OMSetRenderTargets(, &renderTargetView, depthStencilView); XMMATRIX tmpProjection = XMMatrixPerspectiveFovLH(XM_PIDIV2 / , (float)width / (float)height, 0.01f, 100.0f);
XMStoreFloat4x4(&projection, tmpProjection);
} void DWidget::mousePressEvent(QMouseEvent * event)
{
} void DWidget::initializeD3D()
{
::xBasicInitializeDirectX11(hwnd, &swapChain, &device, &context, &renderTargetView);
::xBasicCreateShader(device, context, L"Effects.fx", &VS_Buffer, &PS_Buffer, &VS, &PS);
::xBasicCreateBuffer(device, D3D11_BIND_CONSTANT_BUFFER, sizeof(CPerObject), &WVP, &constantBuffer);
::xBasicCreateBuffer(device, D3D11_BIND_CONSTANT_BUFFER, , &::isT, &::boolBuffer); XMMATRIX tmpWorld = XMMatrixScaling(0.1, 0.1, 0.1) *XMMatrixTranslation( * , * , );;
XMStoreFloat4x4(&world, tmpWorld); XMVECTOR eye = XMVectorSet(0.0f, 0.0f, -1.0f, 0.0f);
XMVECTOR at = XMVectorSet(0.0f, 0.0f, 0.0f, 0.0f);
XMVECTOR up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);
XMStoreFloat4x4(&view, XMMatrixLookAtLH(eye, at, up)); //Create the Input Layout
device->CreateInputLayout(layout, , VS_Buffer->GetBufferPointer(), VS_Buffer->GetBufferSize(), &vertexLayout); //Set the Input Layout
context->IASetInputLayout(vertexLayout); GeometryProvider provider;
std::vector<Vertex> vertices;
std::vector<UINT> indices;
GeometryProvider::MeshData data;
provider.createCylinder(data, );
for (size_t i = ; i < data.vertices.size(); i++)
{
Vertex tmpV;
tmpV.pos = data.vertices[i].position;
tmpV.color = XMFLOAT4(rand() % , rand() % , rand() % , );
vertices.push_back(tmpV);
} for (size_t i = ; i < data.indices.size(); i++)
{
indices.push_back(data.indices[i]);
} ::xBasicCreateBuffer(device, D3D11_BIND_VERTEX_BUFFER, vertices.size() * sizeof(Vertex), &vertices[], &cylinderVertexBuffer);
::xBasicCreateBuffer(device, D3D11_BIND_INDEX_BUFFER, indices.size() * sizeof(UINT), &indices[], &cylinderIndexBuffer);
} void DWidget::pushWorldMatrix()
{
if (worldStack.empty())
{
worldMatrixIdentity();
}
worldStack.push(worldStack.top());
} void DWidget::multipyWorldMatrix(DirectX::XMMATRIX * matrix)
{
if (worldStack.empty())
{
worldMatrixIdentity();
} XMMATRIX aMatrix = XMLoadFloat4x4(&worldStack.top());
XMMATRIX ansMatrix = *matrix * aMatrix;
XMStoreFloat4x4(&worldStack.top(), ansMatrix); world = worldStack.top();
updateWVP();
} void DWidget::popWorldMatrix()
{
worldStack.pop(); world = worldStack.top(); updateWVP();
} void DWidget::worldMatrixIdentity()
{
while (!worldStack.empty())
{
worldStack.pop();
} worldStack.push(XMFLOAT4X4()); XMStoreFloat4x4(&worldStack.top(), XMMatrixIdentity()); world = worldStack.top();
updateWVP();
} void DWidget::setCurrentWorldMatrix(DirectX::XMMATRIX * matrix)
{
if (worldStack.empty())
{
worldMatrixIdentity();
} XMMATRIX aMatrix = XMLoadFloat4x4(&worldStack.top());
XMMATRIX ansMatrix = *matrix * aMatrix;
XMStoreFloat4x4(&worldStack.top(), ansMatrix); world = worldStack.top();
updateWVP();
}
有些很奇葩的写法就不管了。
初学DirectX11, 留个纪恋。的更多相关文章
- python初学代码留个纪念
最简单的代码 if else if else 1.python中else if 用 elif表示 2.注释: 单行注释:##### 多行注释:''' ------''',"&q ...
- 3500常用汉字与标点符号(已排除不支持GB2312的)
.?!,.::“”‘’…()<>〈〉[].,:;!?-'_"'()[]<>|&~;+-*/=<>0123456789ABCEFGHIJKLMNOP ...
- [商业_法务] 2、注册公司起名很费劲,用C++怒写个随机名字生成器
前言 博主最近在注册公司,由于之前听说过注册公司的名字很难通过,于是便直接找代理去帮忙跑趟,为确保万无一失,还自己绞尽脑汁想了几个很奇葩的名字(噬菌体.云木.灌木.杏仁...). 但是不幸的是那些奇葩 ...
- Python抓取百度汉字笔画的gif
偶然发现百度汉语里面,有一笔一划的汉字顺序: 觉得这个动态的图片,等以后娃长大了,可以用这个教写字.然后就去找找常用汉字,现代汉语常用字表 .拿到这里面的汉字,做两个数组出来,一共是 ...
- Java随机产生中文昵称
有时候我们注册一个网站第一次登陆系统会产生一个随机昵称供用户选择,在项目测试阶段遇到了这个问题,因为注册时没有让用户填写昵称,于是找了两种产生随机中文昵称的方法: 代码如下 package com.u ...
- [转]TrueType(TTF)字体文件裁剪(支持简体中文,繁体中文TTF字体裁剪)
原文入口: TTF字体文件裁剪(支持简体中文,繁体中文TTF字体裁剪) 对于TrueType(TTF)字体格式的介绍可以看: https://www.cnblogs.com/slysky/p/1131 ...
- RenderDoc图形调试器详细使用教程(基于DirectX11)
前言 由于最近Visual Studio的图形调试器老是抽风,不得不寻找一个替代品了. 对于图形程序开发者来说,学会使用RenderDoc图形调试器可以帮助你全面了解渲染管线绑定的资源和运行状态,从而 ...
- 【转】Directx11 HelloWorld之HLSL的Effect框架的使用
最近尝试用了下Directx下的Effect框架,作为一初学者初学者,说下为什么我们要使用Effect框架及其好处吧. 首先Effect最大好处的就是简单,使得编写Shader绘制的程序工作量大大下降 ...
- DirectX11 With Windows SDK--25 法线贴图
前言 在很早之前的纹理映射中,纹理存放的元素是像素的颜色,通过纹理坐标映射到目标像素以获取其颜色.但是我们的法向量依然只是定义在顶点上,对于三角形面内一点的法向量,也只是通过比较简单的插值法计算出相应 ...
随机推荐
- [APUE]文件和目录(上)
一.文件权限 1. 各种ID 我在读这一章时遇到了各种ID,根据名字完全不清楚什么意思,幸好看到了这篇文章,http://blog.csdn.net/ccjjnn19890720/article/de ...
- SQL Server-表表达式基础回顾(二十四)
前言 从这一节开始我们开始进入表表达式章节的学习,Microsoft SQL Server支持4种类型的表表达式:派生表.公用表表达式(CTE).视图.内嵌表值函数(TVF).简短的内容,深入的理解, ...
- 编写高质量代码:改善Java程序的151个建议(第8章:多线程和并发___建议126~128)
建议126:适时选择不同的线程池来实现 Java的线程池实现从根本上来说只有两个:ThreadPoolExecutor类和ScheduledThreadPoolExecutor类,这两个类还是父子关系 ...
- myeclipse 内存不够用报错PermGen space 和 An internal error has occurred.
最近项目中又增加了新的模块,项目的代码又多了不少.运行的时候总是报如下错误 Exception in thread "http-apr-80-exec-6" java.lang.O ...
- Struts的拦截器
Struts的拦截器 1.什么是拦截器 Struts的拦截器和Servlet过滤器类似,在执行Action的execute方法之前,Struts会首先执行Struts.xml中引用的拦截器,在执行完所 ...
- Java中的进程和线程
Java中的进程与线程 一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是 ...
- click事件的累加绑定,绑定一次点击事件,执行多次
最近做项目为一个添加按钮绑定点击事件,很简单的一个事情,于是我按照通常做法找到元素,使用jquery的on()方法为元素绑定了点击事件,点击同时发送请求.完成后看效果,第一次点击没有问题.再一次点击后 ...
- Centos 6.6 下搭建php5.2.17+Zend Optimizer3.3.9+Jexus环境
(为何安装php5.2.17这个版本 因为phpweb这个程序用到了Zend Optimizer3.3.9 这个东东已经停止更新了 最高支持5.2版本的php 所以就有了一晚上填坑的自己和总结了这篇文 ...
- [计算机网络]简易http server程序
好久没输出了,知识还是要写下总结才能让思路更加清晰.最近在学习计算机网络相关的知识,来聊聊如何编写一个建议的HTTP服务器. 这个http server的实现源代码我放在了我的github上,有兴趣的 ...
- 微信硬件H5面板开发(二) ---- 实现一个灯的控制
在第一节中讲解了openApi的调用,这一篇讲一下如何实现一个灯的控制.就用微信提供的lamp例子来做,将代码扒下来(实在是没办法,没有示例),整合到自己的项目中.lamp源码:http://file ...