Direct3D Tutorial Win32 Sample 详解 - 5

2024-06-06 08:32

本文主要是介绍Direct3D Tutorial Win32 Sample 详解 - 5,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

实现效果:
一个cube自转,另一个cube自转同时,绕中心轴公转
在这里插入图片描述

要点

Transform
平移之后,坐标原点就不在物体的中心了。平移之后一定方向上的旋转就是公转。
平移改变坐标原点
两个立方体的transform过程如下:

    // 1st Cube: Rotate around the origin// 绕Y轴旋转即可g_World1 = XMMatrixRotationY( t );// 2nd Cube:  Rotate around originXMMATRIX mScale = XMMatrixScaling( 0.3f, 0.3f, 0.3f );// 自转XMMATRIX mSpin = XMMatrixRotationZ( -t );// 平移XMMATRIX mTranslate = XMMatrixTranslation( -4.0f, 0.0f, 0.0f );XMMATRIX mOrbit = XMMatrixRotationY( -t * 2.0f );
// 注意顺序 缩放-自传-平移-公转g_World2 = mScale * mSpin * mTranslate * mOrbit;

做完transformation,在绘制每个模型之前,update相应的常量缓冲

    //// Update variables for the first cube//ConstantBuffer cb1;cb1.mWorld = XMMatrixTranspose( g_World1 );cb1.mView = XMMatrixTranspose( g_View );cb1.mProjection = XMMatrixTranspose( g_Projection );g_pImmediateContext->UpdateSubresource( g_pConstantBuffer, 0, nullptr, &cb1, 0, 0 );//// Render the first cube//g_pImmediateContext->VSSetShader( g_pVertexShader, nullptr, 0 );g_pImmediateContext->VSSetConstantBuffers( 0, 1, &g_pConstantBuffer );// 可以顺次设置多个缓冲区//g_pImmediateContext->VSSetConstantBuffers( 1 or 2 or 3 对应于hlsl中b1, b2, b3, 1, &g_pConstantBuffer );g_pImmediateContext->PSSetShader( g_pPixelShader, nullptr, 0 );g_pImmediateContext->DrawIndexed( 36, 0, 0 );

如何实现遮挡操作
注意:index buffer在编辑数据时,注意顶点的顺序,背面(逆时针的顶点)是不会被绘制的,即背面消隐。
使用深度缓冲实现遮挡操作

过程如下(简略版)://1  Create depth stencil texture//2  Create the depth stencil viewhr = g_pd3dDevice->CreateDepthStencilView( g_pDepthStencil, &descDSV, &g_pDepthStencilView );if( FAILED( hr ) )return hr;
//3  绑定到rendertarget上g_pImmediateContext->OMSetRenderTargets( 1, &g_pRenderTargetView, g_pDepthStencilView );

并且在绘制每帧前清空深度缓冲区

    // 清空深度缓冲区,因为需要根据投影重新计算深度// Clear the depth buffer to 1.0 (max depth)//g_pImmediateContext->ClearDepthStencilView( g_pDepthStencilView, D3D11_CLEAR_DEPTH, 1.0f, 0 );

细节:

    // 清空render target,清屏操作,否则每帧的操作是叠加操作,如下图所示// Clear the back buffer//g_pImmediateContext->ClearRenderTargetView( g_pRenderTargetView, Colors::MidnightBlue );

在这里插入图片描述

要点总结:

transform的理解
如何实现公转动画
平移之后,坐标原点就不在物体的中心了。平移之后一定方向上的旋转就是公转。

使用深度缓冲解决遮挡问题
深度缓冲区如何添加
index中顶点的顺序也很关键,背面不会被绘制!

这篇关于Direct3D Tutorial Win32 Sample 详解 - 5的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1035591

相关文章

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

Java中的.close()举例详解

《Java中的.close()举例详解》.close()方法只适用于通过window.open()打开的弹出窗口,对于浏览器的主窗口,如果没有得到用户允许是不能关闭的,:本文主要介绍Java中的.... 目录当你遇到以下三种情况时,一定要记得使用 .close():用法作用举例如何判断代码中的 input