初学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 法线贴图
前言 在很早之前的纹理映射中,纹理存放的元素是像素的颜色,通过纹理坐标映射到目标像素以获取其颜色.但是我们的法向量依然只是定义在顶点上,对于三角形面内一点的法向量,也只是通过比较简单的插值法计算出相应 ...
随机推荐
- SDWebImage源码解读之SDWebImageDownloaderOperation
第七篇 前言 本篇文章主要讲解下载操作的相关知识,SDWebImageDownloaderOperation的主要任务是把一张图片从服务器下载到内存中.下载数据并不难,如何对下载这一系列的任务进行设计 ...
- 基于OpenCV的车辆检测与追踪的实现
最近老师布置了一个作业,是做一个基于视频的车辆检测与追踪,用了大概两周的时间做了一个简单的,效果不是很理想,但抑制不住想把自己的一些认识写下来,这里就把一些网络上的博客整理一下分享给大家,希望帮助到大 ...
- Hawk 4.4 执行器
执行器是负责将Hawk的结果传送到外部环境的工具.你可以写入数据表,数据库,甚至执行某个特定的动作,或是生成文件等等. 在调试模式下,执行器都是不工作的.这是为了避免产生副作用.否则,每刷新一遍数据, ...
- 【WPF】日常笔记
本文专用于记录WPF开发中的小细节,作为备忘录使用. 1. 关于绑定: Text ="{Binding AnchorageValue,Mode=TwoWay,UpdateSourceTrig ...
- slf4j中的MDC
slf4j中MDC是什么鬼 slf4j除了trace.debug.info.warn.error这几个日志接口外,还可以配合MDC将数据写入日志.换句话说MDC也是用来记录日志的,但它的使用方式与使用 ...
- BridgePattern(桥接模式)
/** * 桥接模式 * @author TMAC-J * 应用于多维度方案 * 用组合的形式代替继承 * 符合单一职责原则 * 一个类只有一个引起他变化的原因 * 增加程序灵活性 */ public ...
- Javascript中的valueOf与toString
基本上,javascript中所有数据类型都拥有valueOf和toString这两个方法,null除外.它们俩解决javascript值运算与显示的问题,本文将详细介绍,有需要的朋友可以参考下. t ...
- BPM配置故事之案例1-配置简单流程
某天,Boss找到了信息部工程师小明. Boss:咱们新上了H3 BPM,你研究研究把现在的采购申请流程加上去吧,这是采购申请单. 小明:好嘞 采购申请单 小明回去后拿着表单想了想,开始着手配置. 他 ...
- TCP/IP之TCP_NODELAY与TCP_CORK
TCP/IP之Nagle算法与40ms延迟提到了Nagle 算法.这样虽然提高了网络吞吐量,但是实时性却降低了,在一些交互性很强的应用程序来说是不允许的,使用TCP_NODELAY选项可以禁止Nagl ...
- Android快乐贪吃蛇游戏实战项目开发教程-05虚拟方向键(四)四个三角形按钮
该系列教程概述与目录:http://www.cnblogs.com/chengyujia/p/5787111.html 一.如何判断点击的是哪个方向键按钮 在上篇教程中我们实现了左边的三角形按钮效果, ...