Direct3D中,DrawIndexedPrimitive的使用方法

【D3D学习记录】DrawIndexedPrimitive函数的详细解释 初学D3D,DrawIndexedPrimitive这个函数是个难点,主要是MSDN中的解释不是很明确,这个函数共6个参数,下面对这6个参数进行一下详细的解释。 阅读详情

一、IDirect3DDevice9::DrawIndexedPrimitive

 
           DrawIndexedPrimitive声明如下:
       
   HRESULT   IDirect3DDevice9::DrawPrimitive(
          D3DPRIMITIVETYPE  PrimitiveType,
          INT               BaseVertexIndex,
          UINT            MinIndex,
          UINT            NumVertices,
          UINT            StartIndex,
          UINT            PrimitiveCount
          );

        ●  PrimitiveType  所要绘制的图元类型。
        ●  BaseVertexIndex  为索引增加的一个基数。
        ●  MinIndex   允许引用的最小索引值。
        ●  NumVertices  本次调用中将引用的顶点总数。
        ●  StartIndex      顶点缓存中标识索引的读取起始点的元素的索引。
        ●  PrimitiveCount  所要绘制的图元总数。

        下面分析参数BaseVertexIndex的使用方法:

         局部索引缓存的内容应与局部顶点缓存中的顶点一致。假定我们想将球、盒以及圆柱体的顶点合并到同一个全局缓存中。对于每个物体,我们必须重新计算索引,以保证这些索引正确地指向全局顶点缓存中对应的顶点。如下图所示:

         


       新索引的计算方法是为每个索引增加一个指定了物体顶点在全局缓存中存储的其实位置的偏移量,该偏移量用顶点个数来度量而非字节。我们无需手工计算物体相对于全局缓存的索引位置,因为Direct3D允许我们通过给参数BaseVertexIndex传递一个顶点偏移值,然后由Direct3D在内部重新对索引进行计算。

        例如:
        假定我们将要绘制一个矩形和一个三角形,把两者的顶点存储到同一个顶点缓存中:

CUSTOMVERTEX vertices[7] = { 
//前四个为矩形的顶点坐标,后三个为三角形的顶点坐标
-15, -5, 0, D3DCOLOR_XRGB(255, 0, 0),
         -15,  5, 0, D3DCOLOR_XRGB(0, 255, 0),
          -5,  5, 0, D3DCOLOR_XRGB(0, 0, 255),
          -5,  -5, 0, D3DCOLOR_XRGB(255, 255, 0),

                   5, -5, 0, D3DCOLOR_XRGB(0, 255, 0),
          15,  -5, 0, D3DCOLOR_XRGB(0, 255, 255),
          10,  5, 0, D3DCOLOR_XRGB(255, 0, 255),
    };

        pIB_Rectangle为矩形的索引缓存,pIB_Triangle为三角形的索引缓存,则绘制时应以如下方式调用:

//绘制矩形,设置为矩形的索引缓存
g_pd3dDevice->SetIndices(pIB_Rectangle);
g_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,4,0,2 );

//绘制三角形,设置为三角形的索引缓存
g_pd3dDevice->SetIndices(pIB_Triangle);
g_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,4,0,3,0,1 );

        在绘制三角形时,DrawIndexedPrimitive的第二个参数设置为4,表示三角形的顶点在全局顶点缓存中的起始位置为4(从0开始计数)。

二、示例代码


        下面的代码将矩形和三角形的顶点存储在同一个顶点缓存中。

#include <d3d9.h>
#pragma warning( disable : 4996 ) // disable deprecated warning 
#include <strsafe.h>
#pragma warning( default : 4996 )
#include <d3dx9math.h>

LPDIRECT3D9             g_pD3D = NULL; 
LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; 
LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; 
LPDIRECT3DINDEXBUFFER9   pIB_Rectangle = NULL;
LPDIRECT3DINDEXBUFFER9   pIB_Triangle = NULL;

struct CUSTOMVERTEX
{
    FLOAT x, y, z; 
    DWORD color; 
};

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)


HRESULT InitD3D( HWND hWnd )
{
    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
        return E_FAIL;

    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory( &d3dpp, sizeof( d3dpp ) );
    d3dpp.Windowed = TRUE;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                      &d3dpp, &g_pd3dDevice ) ) )
    {
        return E_FAIL;
    }

    return S_OK;
}


HRESULT InitVB()
{
	 CUSTOMVERTEX vertices[7] = { 
        //前四个为矩形的顶点坐标,后三个为三角形的顶点坐标
	     -15, -5, 0, D3DCOLOR_XRGB(255, 0, 0),
	     -15,  5, 0, D3DCOLOR_XRGB(0, 255, 0),
	      -5,  5, 0, D3DCOLOR_XRGB(0, 0, 255),
	      -5, -5, 0, D3DCOLOR_XRGB(255, 255, 0),

               5, -5, 0, D3DCOLOR_XRGB(0, 255, 0),
	      15, -5, 0, D3DCOLOR_XRGB(0, 255, 255),
	      10,  5, 0, D3DCOLOR_XRGB(255, 0, 255),
	 };

    if( FAILED( g_pd3dDevice->CreateVertexBuffer( sizeof( vertices ),
                                                  0, D3DFVF_CUSTOMVERTEX,
                                                  D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
    {
        return E_FAIL;
    }

	VOID* pVertices;
    if( FAILED( g_pVB->Lock( 0, sizeof( vertices ), ( void** )&pVertices, 0 ) ) )
        return E_FAIL;
    memcpy( pVertices, vertices, sizeof( vertices ) );
    g_pVB->Unlock();

	//设置矩形的索引缓存
	if( FAILED( g_pd3dDevice->CreateIndexBuffer( 6 * sizeof( WORD ),
                                                  0, D3DFMT_INDEX16,
                                                  D3DPOOL_DEFAULT, &pIB_Rectangle, NULL ) ) )
	{
		return E_FAIL;
	}

	WORD* pIndices = NULL;
	pIB_Rectangle->Lock(0, 0, (void**)&pIndices,0);
	pIndices[0] = 0, pIndices[1] = 3, pIndices[2] = 1, pIndices[3] = 1, pIndices[4] = 3, pIndices[5] = 2;
	pIB_Rectangle->Unlock();

	//设置三角形的索引缓存
   if( FAILED( g_pd3dDevice->CreateIndexBuffer(3 * sizeof( WORD ),
                                                  0, D3DFMT_INDEX16,
                                                  D3DPOOL_DEFAULT, &pIB_Triangle, NULL ) ) )
	{
		return E_FAIL;
	}

	WORD* Indices = NULL;
	pIB_Triangle->Lock(0, 0, (void**)&Indices,0);
	Indices[0] = 0, Indices[1] = 1, Indices[2] = 2;
	pIB_Triangle->Unlock();
   
    return S_OK;
}


VOID Cleanup()
{
    if( g_pVB != NULL )
        g_pVB->Release();

    if( pIB_Rectangle != NULL )
        pIB_Rectangle->Release();

    if( g_pd3dDevice != NULL )
        g_pd3dDevice->Release();

    if( g_pD3D != NULL )
        g_pD3D->Release();

    if(pIB_Triangle !=NULL)
	pIB_Triangle->Release();
}

VOID SetupMatrices()
{
	D3DXVECTOR3 vEyePt(0.0f, 0.0f, -20);
	D3DXVECTOR3 vLookatPt(0.0f, 0.0f, 0.0f);
	D3DXVECTOR3 vUpVec(0.0f, 1.0f, 0.0f);
	D3DXMATRIXA16 matView;
	D3DXMatrixLookAtLH(&matView, &vEyePt, &vLookatPt, &vUpVec);
	g_pd3dDevice->SetTransform(D3DTS_VIEW, &matView);

	//D3DXMatrixPerspectiveFovLH()函数中的最远、最近距离为相对于视点的距离(即vEyePt中的距离)
	D3DXMATRIXA16 matProj;
	D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI / 2, 1.0f, 1.0f, 200.0f);
	g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matProj);
}


VOID Render()
{
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255, 255, 255 ), 1.0f, 0 );

    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    { 
		SetupMatrices();

                g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof( CUSTOMVERTEX ) );
                g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );

		g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
		g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);

		//绘制矩形,设置为矩形的索引缓存
		g_pd3dDevice->SetIndices(pIB_Rectangle);
		g_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,4,0,2 );

		//绘制三角形,设置为三角形的索引缓存
		g_pd3dDevice->SetIndices(pIB_Triangle);
		g_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,4,0,3,0,1 );

                g_pd3dDevice->EndScene();
    }

    // Present the backbuffer contents to the display	
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}


LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    switch( msg )
    {
        case WM_DESTROY:
            Cleanup();
            PostQuitMessage( 0 );
            return 0;
    }

    return DefWindowProc( hWnd, msg, wParam, lParam );
}


INT WINAPI wWinMain( HINSTANCE hInst, HINSTANCE, LPWSTR, INT )
{
    // Register the window class
    WNDCLASSEX wc =
    {
        sizeof( WNDCLASSEX ), CS_CLASSDC, MsgProc, 0L, 0L,
        GetModuleHandle( NULL ), NULL, NULL, NULL, NULL,
        "D3D Tutorial", NULL
    };
    RegisterClassEx( &wc );

    // Create the application's window
    HWND hWnd = CreateWindow( "D3D Tutorial", "D3D Tutorial: DrawIndexedPrimitive",
                              WS_OVERLAPPEDWINDOW, 100, 100, 400, 400,
                              NULL, NULL, wc.hInstance, NULL );

    if( SUCCEEDED( InitD3D( hWnd ) ) )
    {
        // Create the vertex buffer and index buffer
        if( SUCCEEDED( InitVB() ) )
        {
            // Show the window
            ShowWindow( hWnd, SW_SHOWDEFAULT );
            UpdateWindow( hWnd );

            // Enter the message loop
            MSG msg;
            ZeroMemory( &msg, sizeof( msg ) );
            while( msg.message != WM_QUIT )
            {
                if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
                {
                    TranslateMessage( &msg );
                    DispatchMessage( &msg );
                }
                else
                    Render();
            }
        }
    }

    UnregisterClass( "D3D Tutorial", wc.hInstance );
    return 0;
}

 
运行效果如下:

 







python-pptx库中文文档及使用样例 个人使用样例及部分翻译自官方文档,并详细介绍chart的使用 阅读详情

相关推荐

1.用Python写了一个进销存管理的软件~需求分析&界面设计&数据库设计&技术路线选择~

前端也打算用Python来写,查了很多的python库,大家比较推荐的是wxpython和QPython,之前接触过一点点的QT,确实非常强大,但是库比较重量级,自己写的这个东西明显配不上QT,又详细调研了一下wxpython,就是它了!

pepper_lihui的专栏 4321

DrawIndexedPrimitive函数的详细解释

为了便于说明,首先假设存在下列的顶点缓冲和索引缓冲 vb= { {-1.0, 1.0, 0.0}, index 0 { 1.0, 1.0, 0.0}, index 1 { 1.0,-1.0, 0.0}, index 2 {-1.0,-1.0, 0.0}, index 3 {-2.0, 2.0, 0.0}, index 4 { 2.0, 2.0, ...

weixin_30699443的博客 389

差分信号_差分信号的原理及其在PCB的设计

差分线是 PCB 设计中非常重要的一部分信号线,信号处理要求也是相当严谨,今天为大家介绍下差分信号的原理以及其在 PCB 设计中的处理方法。 什么是差分信号 差分传输是一种信号传输的技术,区别于传统的一根信号线一根地线的做法,差分传输在这两根线上都传输信号,这两个信号的振幅相等,相位相差 180 度,极性相反。在这两根线上传输的信号就是差分...

weixin_31849185的博客 1812

DrawIndexedPrimitive 各个参数的解释

DrawIndexedPrimitive( D3DPT_TRIANGLELIST, // PrimitiveType 50, // BaseVertexIndex 0, // MinIndex 4, ...

是我 1217

ADS软件操作(8)——负载牵引(Loadpull)

负载牵引:通过不断调节输入和输出端的阻抗,找到让有源器件输出功率最大的输入、输出匹配阻抗。这种方法可以准确地测量出器件在大信号条件下的最优性能,反映出器件输入、输出阻抗随频率喝输入功率变化的特性,为器件和电路的设计优化提供了坚实的基础。白话版:由于通信制式越来越复杂,对放大器的线性度和效率要求越来越高。由于放大器的效率和是个永恒的矛盾,所以如何平衡这样的矛盾达到系统设计的最优就是一个需要解决的难题。如何解决?调节输入和输出端的阻抗也就是负载牵引 (Load-Pull)原理來改善点,从而降低谐波的。

Zhuanzhuyan的博客 4954

ClickHouse集群扩容实战:用clickhouse-copier搞定数据迁移与分片重平衡

本文详细介绍了使用clickhouse-copier工具实现ClickHouse集群从3分片到5分片的平滑扩容实战。通过分片级并行处理、原子性保证等核心机制,该工具能高效完成数据迁移与分片重平衡,同时保持服务连续性。文章涵盖集群拓扑规划、表结构检查、迁移配置、执行监控及迁移后优化等关键步骤,为大数据量场景下的ClickHouse扩容提供完整解决方案。

weixin_29091837的博客 294

DrawIndexedPrimitive函数的详细解释【转】

为了便于说明,首先假设存在下列的顶点缓冲和索引缓冲 vb= { {-1.0, 1.0, 0.0}, index 0 { 1.0, 1.0, 0.0}, index 1 { 1.0,-1.0, 0.0}, index 2 {-1.0,-1.0, 0.0}, index 3 {-2.0, 2.0, 0.0}, index 4 { 2....

aibulie0537的博客 253

【2021工业图像异常检测文献】DRÆM: 基于判别性训练的重建嵌入表面异常检测方法

DRÆM – A discriminatively trained reconstruction embedding for surface anomaly detection

qq_1532145264的博客 1477

DrawIndexedPrimitive函数一目了然

为了便于说明,首先假设存在下列的顶点缓冲和索引缓冲    vb=    {     {-1.0, 1.0, 0.0}, index 0     { 1.0, 1.0, 0.0}, index 1     { 1.0,-1.0, 0.0}, index 2     {-1.0,-1.0, 0.0}, index 3     {-2.0, 2.0, 0.0}, index 4    

尘墨 814

XSS漏洞之PDF生成:从XSS到服务端任意文件读取

XSS是最为常见的Web漏洞之一,多年来连续入选OWASP TOP10,相信大家都耳熟能详。 它是一种代码注入类的攻击,是一种客户端侧的攻击,攻击者通过在Web应用中注入恶意JavaScript代码,通过点击URL,最终在受害者浏览器端执行的一种漏洞。主要有反射型XSS、存储型XSS、基于DOM的XSS三类。XSS一些比较常规的危害大概有:重定向浏览器、窃取Cookie、浏览器劫持等。本文章侧重于发现XSS后的进一步利用。 主要介绍在某次实际测试过程中,发现XSS漏洞之后,如何进一步的利用,最终通过XSS达

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 3780

2024-江苏科技大学-模拟-动态接触角,模拟液滴撞击,comsol软件模拟。

相反,其对液滴粘度和平衡接触角的变化基本不敏感。重力势能的影响显著受过程参数调节,随着液滴直径和密度的增加而增加,而随着初始液滴速度和表面张力系数的增加而减小。通过考虑形状因子和粘度修正因子,可以准确定义表面能和粘性耗散能,使得所提出的半经验修正勺状模型表现出良好的性能,在所有65个研究案例中,液滴最大铺展长度因子(βmax)和中心厚度(h)的相对误差基本分别落在5%和10%的区间内。重力势能的影响受过程参数显著调节,随液滴直径和密度的增大而增大,随液滴初始速度和表面张力系数的增大而减小。

qq_15963745的博客 512

D3D描绘四边形的四种方法之DrawPrimitive、DrawIndexedPrimitive、DrawPrimitiveUP、DrawIndexedPrimitiveUP

创建描绘四边形的四种方法:(程序片段,只是简要介绍不同之处,不对之处,恳请指正) 第一种:最常用的一种: 使用D3D坐标(D3DFVF_XYZ ),通过设置矩阵,使用VB, 4个点。调用DrawPrimitive(); 使用6个顶点时也可以,在render时需要使用 g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 2 ); LPDI

zhangshoucheng的专栏 3376

基于Simulink的自适应反步法(Adaptive Backstepping)控制​

本文针对非线性系统控制中未知参数和强非线性耦合的挑战,提出基于Simulink的自适应反步法解决方案。通过融合参数在线估计与反步递归设计,该方法显著提升了永磁同步电机(PMSM)速度控制的鲁棒性,使跟踪误差从20%降至3%,参数估计收敛时间小于0.5秒。文章详细阐述了从算法推导到Simulink实现的完整流程,包括系统架构设计、核心算法推导(以PMSM为例)、模块化建模方法、参数优化策略以及工程部署建议。提供的自适应控制器MATLAB代码和关键参数表可直接应用于实际工程,为电机驱动、机械臂等非线性系统控制提

xiaoheshang_123的博客 101

DrawIndexedPrimitive()函数

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34406086的博客 189

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

关于DrawIndexedPrimitive函数的调用

函数的原型例如以下所看到的: HRESULT DrawIndexedPrimitive( [in] D3DPRIMITIVETYPE Type, [in] INT BaseVertexIndex, [in] UINT MinIndex, [in] UINT NumVertices, [in] UINT StartIndex, [in] UINT Prim...

aodiyi6351的博客 203

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

DirectX9 IDirect3DDevice9::DrawIndexedPrimitive

IDirect3DDevice9::DrawIndexedPrimitive This method is used to draw primitives using index info. HRESULT IDirect3DDevice9::DrawIndexedPrimitive( D3DPRIMITIVETYPE Type, INT BaseVertexIndex, UINT

梦幻DUO的游戏开发之路 1001

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

DrawIndexedPrimitive()索引缓冲区绘制

HRESULT DrawIndexedPrimitive (  D3DPRIMITIVETYPE Type,  INT BaseVertexIndex,  UINT MinIndex,  UINT NumVertices,  UINT StartIndex,  UINT PrimitiveCounts ); 参数1:Type   图元类型 参数2:BaseVertexIn

小菜鸟 1492
上一篇: Direct3D中的绘制
下一篇: Direct3D中的光照
Spring_24
博客等级 码龄12年 46粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Spring_24

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值