zoukankan      html  css  js  c++  java
  • 3D游戏从头编之D3D(2)

    顶点渲染 :

      渲染的基本步骤是这样的:
      (1)   定义顶点格式和FVF
      (2)   创建顶点缓冲区并填充之
      (3)   用D3D进行渲染
      我们来渲染一个简单的三角形,但它的3个顶点颜色不同。 

    一、首先来看定义顶点格式和FVF  

      想要渲染顶点,首先你得有个缓冲区,在D3D中这样定义:
      LPDIRECT3DVERTEXBUFFER8 g_pVB        = NULL; // 顶点缓冲区

      
    然后还得为顶点缓冲区里的数据定义格式,这样:
      // 自定义顶点结构
      struct CUSTOMVERTEX
      {
          FLOAT x, y, z;      // 
    顶点坐标
      
        DWORD color;        // 
    顶点颜色
      };

      
    最后要让渲染器知道我们定义的格式,你还得定义一个FVF,FVF在D3D中的解释是Flexible vertex format,意思就是可变的顶点格式,具体的内容你可以参见DX8的帮助文档,这里我们这样定义:

      // 我们自定义的FVF,定义了顶点的结构
      // D3DFVF_XYZ             
    表示顶点坐标
      // D3DFVF_DIFFUSE         
    表示顶点有颜色 
      #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)

    二、创建顶点缓冲区并填充之

      首先创建顶点缓冲区,使用CreateVerTexBuffer方法:
      // 创建顶点缓冲区
        
    g_pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),
                                          
    0,

                                          
    D3DFVF_CUSTOMVERTEX,

                                          
    D3DPOOL_DEFAULT,

                                          
    &g_pVB ) );


      第一个参数表示缓冲区大小,我们给出3个顶点。
      第二个参数暂时不管,填0。
      第三个参数是我们自定义的FVF
      第四个参数表示通过什么方式创建,用缺省值就好了
      第五个参数返回缓冲区指针。

      创建好了后,我们来填充内容,先自定义一个三角形:

      // 三个顶点表示一个三角形
        
    CUSTOMVERTEX g_Vertices[] =
        
    {
            
    { -1.0f,-1.0f, 0.0f, 0xffff0000, },     // 
    红色
            
    {  1.0f,-1.0f, 0.0f, 0xff0000ff, },     // 
    兰色
            
    {  0.0f, 1.0f, 0.0f, 0xffffffff, },     // 
    白色
        
    };

       然后锁定缓冲区,并把我们定义的三角形数据拷贝进去:
        
    VOID* pVertices;
        
    g_pVB->Lock( 0, sizeof(g_Vertices), (BYTE**)&pVertices, 0 ) ) ;         // 
    锁定
        
    memcpy( pVertices, g_Vertices, sizeof(g_Vertices) );  // 
    填充顶点缓冲区
      g_pVB->Unlock();     // 
    解锁

      一切准备就绪了,开始渲染。

    三、渲染

      非常简单,只需要下面短短的三句就搞定。

        // 指定渲染源
        
    g_pd3dDevice->SetStreamSource( 0, g_pVB, sizeof(CUSTOMVERTEX) );

        
    // 
    指定自定义的FVF
        
    g_pd3dDevice->SetVertexShader( D3DFVF_CUSTOMVERTEX );

        
    // 
    渲染
        
    g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 1 );

      就这么的简单,那么这个程序的具体效果是怎么样的呢?,看图:

     引用 3D游戏从头编之D3D(2) - 迷茫 - bendanchenzhicheng的博客

  • 相关阅读:
    总结thinkphp快捷查询getBy、getField、getFieldBy用法及场景
    javascript中的那些让人摸不着头脑的不=
    使用jquery静态资源公共库cdn及回退地址
    论strpos 的正确使用方式
    深入解析array_merge函数的用法 php
    thinkphp集成系列之rbac的升级版auth权限管理系统demo
    thinkphp集成系列之短信验证码、订单通知
    sublime安装ctags函数追踪插件
    Sublime Text3下配置SublimeLinter进行PHP代码检查
    win7启动redis报错Creating Server TCP listening socket *:6379: bind: Unknown error
  • 原文地址:https://www.cnblogs.com/bendanchenzhicheng/p/2173038.html
Copyright © 2011-2022 走看看