以前学的是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, 留个纪恋。的更多相关文章

  1. python初学代码留个纪念

    最简单的代码  if   else if  else 1.python中else if   用  elif表示 2.注释: 单行注释:##### 多行注释:''' ------''',"&q ...

  2. 3500常用汉字与标点符号(已排除不支持GB2312的)

    .?!,.::“”‘’…()<>〈〉[].,:;!?-'_"'()[]<>|&~;+-*/=<>0123456789ABCEFGHIJKLMNOP ...

  3. [商业_法务] 2、注册公司起名很费劲,用C++怒写个随机名字生成器

    前言 博主最近在注册公司,由于之前听说过注册公司的名字很难通过,于是便直接找代理去帮忙跑趟,为确保万无一失,还自己绞尽脑汁想了几个很奇葩的名字(噬菌体.云木.灌木.杏仁...). 但是不幸的是那些奇葩 ...

  4. Python抓取百度汉字笔画的gif

    偶然发现百度汉语里面,有一笔一划的汉字顺序:          觉得这个动态的图片,等以后娃长大了,可以用这个教写字.然后就去找找常用汉字,现代汉语常用字表 .拿到这里面的汉字,做两个数组出来,一共是 ...

  5. Java随机产生中文昵称

    有时候我们注册一个网站第一次登陆系统会产生一个随机昵称供用户选择,在项目测试阶段遇到了这个问题,因为注册时没有让用户填写昵称,于是找了两种产生随机中文昵称的方法: 代码如下 package com.u ...

  6. [转]TrueType(TTF)字体文件裁剪(支持简体中文,繁体中文TTF字体裁剪)

    原文入口: TTF字体文件裁剪(支持简体中文,繁体中文TTF字体裁剪) 对于TrueType(TTF)字体格式的介绍可以看: https://www.cnblogs.com/slysky/p/1131 ...

  7. RenderDoc图形调试器详细使用教程(基于DirectX11)

    前言 由于最近Visual Studio的图形调试器老是抽风,不得不寻找一个替代品了. 对于图形程序开发者来说,学会使用RenderDoc图形调试器可以帮助你全面了解渲染管线绑定的资源和运行状态,从而 ...

  8. 【转】Directx11 HelloWorld之HLSL的Effect框架的使用

    最近尝试用了下Directx下的Effect框架,作为一初学者初学者,说下为什么我们要使用Effect框架及其好处吧. 首先Effect最大好处的就是简单,使得编写Shader绘制的程序工作量大大下降 ...

  9. DirectX11 With Windows SDK--25 法线贴图

    前言 在很早之前的纹理映射中,纹理存放的元素是像素的颜色,通过纹理坐标映射到目标像素以获取其颜色.但是我们的法向量依然只是定义在顶点上,对于三角形面内一点的法向量,也只是通过比较简单的插值法计算出相应 ...

随机推荐

  1. Unity3d学习 相机的跟随

    最近在写关于相机跟随的逻辑,其实最早接触相机跟随是在Unity官网的一个叫Roll-a-ball tutorial上,其中简单的涉及了关于相机如何跟随物体的移动而移动,如下代码: using Unit ...

  2. 消息队列——RabbitMQ学习笔记

    消息队列--RabbitMQ学习笔记 1. 写在前面 昨天简单学习了一个消息队列项目--RabbitMQ,今天趁热打铁,将学到的东西记录下来. 学习的资料主要是官网给出的6个基本的消息发送/接收模型, ...

  3. 为你的Web程序加个启动画面

    .Net开发者一定熟悉下面这个画面: 这就是宇宙第一IDE Visual Studio的启动画面,学名叫Splash Screen(或者Splash Window).同样,Javar们一定对Eclip ...

  4. C#学习资源

    # 视频 C#程序设计 Cousera(推荐) # 文档 C#教程 MSDN Microsoft API 和参考目录

  5. 探索ASP.NET MVC5系列之~~~3.视图篇(下)---包含常用表单和暴力解猜防御

    其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...

  6. shell简介

    Shell作为命令语言,它交互式地解释和执行用户输入的命令:作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支. shell使用的熟练程度反映了用户对U ...

  7. HttpUrlConnection 基础使用

    From https://developer.android.com/reference/java/net/HttpURLConnection.html HttpUrlConnection: A UR ...

  8. 基于netty http协议栈的轻量级流程控制组件的实现

    今儿个是冬至,所谓“冬大过年”,公司也应景五点钟就放大伙儿回家吃饺子喝羊肉汤了,而我本着极高的职业素养依然坚持留在公司(实则因为没饺子吃没羊肉汤喝,只能呆公司吃食堂……).趁着这一个多小时的时间,想跟 ...

  9. 在知乎上看到 Web Socket这篇文章讲得确实挺好,从头看到尾都非常形象生动,一口气看完,没有半点模糊,非常不错

    在知乎上看到这篇文章讲得确实挺好,从头看到尾都非常形象生动,一口气看完,没有半点模糊,非常不错,所以推荐给大家,非常值得一读. 作者:Ovear链接:https://www.zhihu.com/que ...

  10. "NHibernate.Exceptions.GenericADOException: could not load an entity" 解决方案

     今天,测试一个项目的时候,抛出了这个莫名其妙的异常,然后就开始了一天的调试之旅... 花了很长时间,没有从代码找出任何问题... 那么到底哪里出问题呢? 根据下面那段长长的错误日志: -- ::, ...