Didectx的简单画图

Directx通常采用顶点缓存和顶点索引缓存来绘制图形,使用函数CreateVertexBuffer和CreateIndexBuffer来分别创建顶点缓存和顶点索引缓存,为了访问顶点缓存和顶点索引缓存中的内容,采用Lock方法来获取指向缓存内容的指针。

绘制之前的准备步骤:

(1) 使用SetStreamSource函数将顶点缓存中的内容绑定到数据流输入源中。

(2) 使用SetFVF函数设置后续绘制中使用的顶点格式。

(3) 使用SetIndices函数设置后续绘制中使用的索引缓存,如果要使用不同的索引缓存必须重新进行设置。

最后使用DrawPrimitive和DrawIndexedPrimitive函数来进行绘制。前者用来绘制未使用索引缓存的图像。

下面是用来绘制立方体的部分代码:

//顶点的结构体
struct Vertex
{
    Vertex(){}

    Vertex(float x, float y, float z)
    {
        _x = x;  _y = y;  _z = z;
    }

    float _x, _y, _z;

    static const DWORD FVF;
};

Device->CreateVertexBuffer(
        8 * sizeof(Vertex),
        D3DUSAGE_WRITEONLY,
        Vertex::FVF,
        D3DPOOL_MANAGED,
        &VB,
        0);
//创建顶点缓存
    Device->CreateIndexBuffer(
        36 * sizeof(WORD),
        D3DUSAGE_WRITEONLY,
        D3DFMT_INDEX16,
        D3DPOOL_MANAGED,
        &IB,
        0);
//创建顶点索引缓存

    Vertex* vertices;
    VB->Lock(0, 0, (void**)&vertices, 0);

    // 指定立方体顶点信息
    vertices[0] = Vertex(-1.0f, -1.0f, -1.0f);
    vertices[1] = Vertex(-1.0f, 1.0f, -1.0f);
    vertices[2] = Vertex(1.0f, 1.0f, -1.0f);
    vertices[3] = Vertex(1.0f, -1.0f, -1.0f);
    vertices[4] = Vertex(-1.0f, -1.0f, 1.0f);
    vertices[5] = Vertex(-1.0f, 1.0f, 1.0f);
    vertices[6] = Vertex(1.0f, 1.0f, 1.0f);
    vertices[7] = Vertex(1.0f, -1.0f, 1.0f);

    VB->Unlock();

    // 指定立方体顶点索引信息
    WORD* indices = 0;
    IB->Lock(0, 0, (void**)&indices, 0);

    // front side
    indices[0] = 0; indices[1] = 1; indices[2] = 2;
    indices[3] = 0; indices[4] = 2; indices[5] = 3;

    // back side
    indices[6] = 4; indices[7] = 6; indices[8] = 5;
    indices[9] = 4; indices[10] = 7; indices[11] = 6;

    // left side
    indices[12] = 4; indices[13] = 5; indices[14] = 1;
    indices[15] = 4; indices[16] = 1; indices[17] = 0;

    // right side
    indices[18] = 3; indices[19] = 2; indices[20] = 6;
    indices[21] = 3; indices[22] = 6; indices[23] = 7;

    // top
    indices[24] = 1; indices[25] = 5; indices[26] = 6;
    indices[27] = 1; indices[28] = 6; indices[29] = 2;

    // bottom
    indices[30] = 4; indices[31] = 0; indices[32] = 3;
    indices[33] = 4; indices[34] = 3; indices[35] = 7;

    IB->Unlock();
//取景变换
    D3DXVECTOR3 position(0.0f, 0.0f, -5.0f);//相机位置
    D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);//世界坐标系的被观察点
    D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);//向上
    D3DXMATRIX V;
    D3DXMatrixLookAtLH(&V, &position, &target, &up);
    Device->SetTransform(D3DTS_VIEW, &V);
    //投影变换
    D3DXMATRIX proj;
    D3DXMatrixPerspectiveFovLH(
        &proj,
        D3DX_PI * 0.5f, // 90 - degree
        (float)Width / (float)Height,
        1.0f,
        1000.0f);
    Device->SetTransform(D3DTS_PROJECTION, &proj);

    //设置绘制状态
    Device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
    //绘制图像在每一帧中调用下面的函数
    //在x轴上旋转45度
        D3DXMatrixRotationX(&Rx, 3.14f / 4.0f);
    //每隔一帧增大y轴的角度达到360度后置0
        static float y = 0.0f;
        D3DXMatrixRotationY(&Ry, y);
        y += timeDelta;
        if (y >= 6.28f)
            y = 0.0f;
        D3DXMATRIX p = Rx * Ry;
        Device->SetTransform(D3DTS_WORLD, &p);
    Device->SetStreamSource(0, VB, 0, sizeof(Vertex));
        Device->SetIndices(IB);
        Device->SetFVF(Vertex::FVF);
Device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 8, 0, 12);

Directx中内置一些函数用来绘制几何图形,如D3DXCreateTeapot,D3DXCreateBox,D3DXCreateCylinder,D3DXCreateTorus,D3DXCreateSphere等,分别用来绘制茶壶,立方体,圆柱体,圆环体,球体。

带颜色物体的绘制:在顶点结构体中加入颜色信息

struct ColorVertex
{
    ColorVertex(){}

    ColorVertex(float x, float y, float z, D3DCOLOR c)
    {
        _x = x;  _y = y;  _z = z;  _color = c;
    }

    float _x, _y, _z;
    D3DCOLOR _color;

    static const DWORD FVF;
};
const DWORD ColorVertex::FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE;

在绘制之前关闭光照:

Device->SetRenderState(D3DRS_LIGHTING, false);

绘制是有两种着色模式,平面着色和Gouraud着色,前者一种颜色,后者颜色渐变。效果如下:

时间: 2024-10-28 18:54:59

Didectx的简单画图的相关文章

jmGraph:一个基于html5的简单画图组件

jmGraph:一个基于html5的简单画图组件 特性: 代码书写简单易理解 面向对象的代码结构 对图形控件化 样式抽离 模块化:入seajs实现模块化开发 兼容性:暂只推荐支持html5的浏览器:ie9+,chrome,firefox等. jiamao/jmgraph · GitHub APIs jmgraph是一个基于html5的WEB前端画图组件. 前端画图对象控件化,支持鼠标和健盘事件响应,可对单个控件样式设定,支持简单的动画处理.可大大地简化前端画图.

OpenGL一: 初始化窗口,简单画图

好久没搞OpenGL了,图形学的理论学的多,看来也需要多多动手做图形学软件,实际多做点东西出来才行. 因为理论书看了很多,但是一直没有太大的突破了,整个游戏是如何做成的,整个引擎怎么做出来的,基本所有相关技术我都了解,对我来说一点都不神秘,但是还是差那么一点点,觉得自己还没有达到专业水准. 感觉那么一点点就是个坎,一直跨不过去,好,这次一定要跨越它! 至于理论书看了多少本,我自己都忘记了,单单说大部头的纯英文书,都超过十几本吧. 这回少看理论了,而由简单的程序开始,下苦功夫,手打上百个程序再说,

Kinaba 简单画图

此片文章简单介绍如何在kinaba 上画图. 如果你,还没有搭建ELK 请参考:ELK日志分析平台搭建全过程 本文参考:http://www.cnblogs.com/hanyifeng/p/5860731.html 一.Kibana之Visualize 功能 在首页上Visualize 标签页用来设计可视化图形.你可以保存之前在discovery中的搜索来进行画图,然后保存该visualize,或者加载合并到 dashboard 里.一个可视化可以基于以下几种数据源类型:一个新的交互式搜索一个已

在VR中模拟用鼠标操作电脑并实现简单画图的小程序

(图没有录好,明天换一下) 一.概述 1.实现的基本操作是: 1)用手柄抓住黄色的方块代表手抓住鼠标. 2)通过移动手柄模拟鼠标移动,电脑屏幕上的光标跟着移动. 3)当光标移动到一个Button上时,Button高亮,离开时Button取消高亮,点击Button触发点击事件. 4)当点击Button之后,打开一个画图程序,可以用光标在颜色选择区选择一种颜色,然后在画图区根据光标的移动轨迹,画出选择颜色的光标移动路径的曲线: 2.脚本 1)ComputerController挂在代表电脑的Canv

html5canvas简单画图

1.最近做的项目用到了canvas画图,但是项目中用到的有点复杂,所以就从头开始学了canvas画图, 2.下面用canvas话了一个时钟. 主要用到了canvas画圆形和在图形中文字的定位,以及画图函数中参数的意思. 3.首先需要一个画图 4.js函数 这是绘制圆形的函数,里面的参数意思是: 其中context.fillText("12",100,20); 这三个参数分别是:画的文字,后面两个是坐标位置. 这样就可以定位文字的位置. 效果图:

IOS 简单画图显示

首先平台的搭建和前面是一样的,创建好根视图 接下来新建一个类即视图是UIView类型命名为MyView 在RootViewController.h文件中导入MyView的头文件 在RootViewController.m文件中 - (void)viewDidLoad { //因为RootViewController自带了一个view,让MyView的view和RootViewController的view一样 MyView *myView = [[MyView alloc]initWithFra

Matplotlib 简单画图

0.Matplotlib -- 简介.note 官网:http://matplotlib.org/ 1.Matplotlib -- 绘制多项式函数.note #-*- coding:utf-8 -*- #绘制多项式函数 import numpy as np import matplotlib.pyplot as plt #以自然数序列作为多项式的系数,使用polyld函数创建多项式 func = np.poly1d(np.array([1,2,3,4]).astype(float)) print

python_turtle模板画图

turtle简单画图所用到的代码: 1 turtle.showturtle() #画图板 2 turtle.screensize(2024,2000) #画图板大小 3 turtle.forward() #往前移动 4 turtle.right(90) #方向往左调整n度 5 turtle.left(30) #方向往右调整n度 6 turtle.write("hello") #写文字 7 turtle.goto(50,50) #坐标移动 8 turtle.penup() #抬笔 9 t

画图小工具第二篇

一.事件源 事件源是一个事件的起点.所有的容器组件类和元素组件类可以成为事件源对象.在程序中可以有多个事件,也就是可以有多个事件源.由需要实现的功能,达到的目的来确定事件源.在程序中动作发生在哪里,哪个就是事件源. 二.事件监听方法: 由事件源来确定事件监听方法. 三.事件接口: 由事件接口实现事件监听方法,而事件接口不能实例化.所以靠定义一个事件处理来,来实现接口中的抽象方法. 四.本次任务: 实现曲线.刷子.橡皮.喷枪 (在窗体上按下鼠标按键.然后拖动鼠标,在按下和拖动之间绘制曲线) 五.实