XNA中的Render State管理

XNA中的Render State管理

仅供个人学习使用,请勿转载,勿用于任何商业用途。

The Problem:
       XNA中一个设计的非常不好的地方,就是把各种render state定义为RenderState类的成员,而不是枚举。在DX/MDX中,如果有一系列render state需要设置,只需要
foreach state in renderStates
    gfxDevice.SetRenderState( stateName,stateValue);

    简单,明了。
    而同样的操作在XNA中,则要麻烦很多,你不得不”显式” 访问每一个render state成员来设置相应的值:
gfxDevice.RenderState.XXXX = value;
gfxDevice.RenderState.XXXX = value;
……

      这样的代码非糟糕,简直是在”hard code”。假如事先不确定有多少render state需要设置,如何编码呢?

The Solution:
      解决这个问题并不困难,我希望仍然使用传统的老方法来设置状态。首先,自然是定义一系列常量,表示所有渲染状态,这里使用了一个静态类,当然替换为枚举也是一样的。

public static class HaRenderStateId
{
    
//alpha state
    public const byte AlphaBlendEnable = 0;
    
public const byte AlphaBlendOperation = 1;
    
public const byte SourceBlend = 2;
    
public const byte DestinationBlend = 3;
    
public const byte AlphaDestinationBlend = 4;
    
public const byte AlphaSourceBlend = 5;
    
public const byte AlphaFunction = 6;
    
public const byte AlphaTestEnable = 7;
    
public const byte BlendFactor = 8;
    
public const byte BlendFunction = 9;
    
public const byte SaparateAlphaBlendEnable = 10;
    
public const byte ReferenceAlpha = 11;

    
//depth state
    public const byte DepthWriteEnable = 12;
    .
}

 
      接下来,需要统一所有render state的值。这样,才能把每种render state作为相同的key-value对,放到同一个容器中。观察一下所有的render state,他们的值不外乎以下几种:枚举,int,float,bool,color. 非常幸运,他们都能用一个32位的值来表示。但是具体如何编码呢?这种情况下,C++程序员首先想到的一定是使用union。C#中虽然没有内置的union类型,但这并不妨碍我们用struct模拟union的行为:

[StructLayout(LayoutKind.Explicit)]
public struct HaRenderStateValue
{
    [FieldOffset(
0)]
    
public int IntegerValue;

    [FieldOffset(
0)]
    
public float FloatValue;

    [FieldOffset(
0)]
    
public Color Color;

    [FieldOffset(
0)]
    
public bool BooleanValue;

    
public void SetValue(int value)
    
public void SetValue(Color value)
    
public void SetValue(float value)
    
public void SetValue(bool value)
}

public struct HaRenderState
{
    
public readonly byte Id;
    
public HaRenderStateValue Value;
}

 
    最后则是实际设置渲染状态的函数,这一步并没有什么技巧可言,只是用了一个非常长的switch把所有需要hard code的部分集中到这里。这是目前为止我能想到的最简单有效的方法,使用Dictionary也许能减少代码长度,但实际测试表明,switch有更好的性能:

 public static void SetRenderState(GraphicsDevice graphics, HaRenderState renderState)
 {
     
switch (renderState.Id)
     {
         
case HaRenderStateId.AlphaBlendEnable:
             graphics.RenderState.AlphaBlendEnable 
= renderState.Value.BooleanValue;
             
break;

         
case HaRenderStateId.AlphaBlendOperation:
             graphics.RenderState.AlphaBlendOperation 
= (BlendFunction)renderState.Value.IntegerValue;
             
break;

         
case HaRenderStateId.SourceBlend:
             graphics.RenderState.SourceBlend 
= (Blend)renderState.Value.IntegerValue;
             
break;
        
      }
}


        扩展结束,现在可以像文章开头介绍的那样,使用循环设置所有render state,更重要的是可以随时添加或者删除集合中的render state,这样给为渲染器设计带来了非常大的便利和灵活性:

material.AddRenderState(RenderState)
material.RemoveRenderState(RenderState)
......
material.ApplyRenderState()

{
      foreach renderState in this.renderStates
           SetRenderState(gfxDevice,renderState)
}

 

转载于:https://www.cnblogs.com/clayman/archive/2009/06/23/1509707.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463406.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

统一项目管理平台(UMPlatForm.NET)-4.7 组织机构管理模块

统一项目管理平台(UMPlatForm.NET) 4.7 组织机构管理模块 统一项目管理平台(UMPlatForm.NET),基于.NET的快速开发、整合框架。 4.7 组织机构管理模块 组织机构管理模块提供直观方便的组织机构管理,以树型结构显示单位和…

开源GIS系统关系图

转载于:https://www.cnblogs.com/penglink/archive/2009/06/26/1511373.html

c++常用知识点,易错点,面试常问点

1.谈谈你对C内存分配的理解1.1 还是的先看看C对内存分为哪几个区?1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。想知道为什么效率高吗?因为…

利用ACS来实现AAA服务

ACS简介思科安全访问控制服务器(Cisco Secure Access Control Sever)是一个高度可扩展、高性能的访问控制服务器,提供了全面的身份识别网络解决方案,是思科基于身份的网络服务(IBNS)架构的重要组件。Cisco Secure ACS通过在一个集…

C/C++二维数组名和二级指针的联系与区别

1. 指针 1.1 一个指针包含两方面:a) 地址值;b) 所指向的数据类型。 1.2 解引用操作符(dereference operator)会根据指针当前的地址值,以及所指向的数据类型,访问一块连续的内存空间(大小由指针所…

BN层

论文名字:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift 论文地址:https://arxiv.org/abs/1502.03167 BN被广泛应用于深度学习的各个地方,由于在实习过程中需要修改网络,修改的…

深入浅出 Javascript API(二)--地图显示与基本操作 转

深入浅出 Javascript API(二)--地图显示与基本操作 地图显示与基本操作(放大、缩小、移动、坐标显示)是JavascriptAPI的基本功能,也是一个WebGIS应用的基本内容,Javascript提供了非常便捷的开发方法&#x…

关于SQL数据库中cross join 和inner join用法上的区别?

使用mysql创建两张表 表a 表b 可以使用下面的脚本创建表,并且添加测试数据: CREATE TABLE a ( name varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, sex varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL D…

把数组排成最小的数

题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。 举例:输入数组{32, 321},则输出这两个能排成的最小数字32132。请给出解决问题的算法,并证明该算法。 答:算法如下&…

VS 使用 :新建项目

1.文件位置不放C盘 转载于:https://www.cnblogs.com/duanshouchang/p/10431829.html

Activit系列之---Activity的生命周期

Activity的生命周期 Hello,巴友们好,小菜我又来发博文啦。上篇文章给大家简单的介绍了一下Activity,以及如何创建一个最简单的Activity并且在上面显示hello android! 我们知道要创建一个自己的Activity就必须继承Activity这个类,并且实现它的…

CAP定理以及证明

历史 这个定理起源于柏克莱加州大学University of California, Berkeley的计算机科学家埃里克布鲁尔在2000年的分布式计算原则研讨会(Symposium on Principles of Distributed Computing(PODC))上提出的一个猜想。 在2002年&…

java线程自带队列的使用以及线程阻塞

java线程&#xff0c;设置队列的大小实现队列阻塞 public class QueueThreads {private static int nThreads 4;//Runtime.getRuntime().availableProcessors() * 2 1;private static BlockingQueue<Runnable> queue new ArrayBlockingQueue<Runnable>(4);//队列…

ASP.NET下QueryString不同字符编码间强制转换的解决方案

正常的情况下&#xff0c;现在asp.net的网站很多都直接使用UTF8来进行页面编码的&#xff0c;这与Javascript、缺省网站的编码是相同的&#xff0c;但是也有相当一部分采用GB2312。对于GB2312的网站如果直接用javascript进行ajax数据提交&#xff0c;例如&#xff1a;http://ww…

ASP.NET MVC3 异步刷新

ASP.NET MVC3 异步刷新2011-08-13 09:51:53标签&#xff1a;MVC3 异步刷新 休闲 N Layer 职场原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://leelei.blog.51cto.com/856755/638408好久没…

编译rocksdb源码导致的部署失败

这几天经历了一次心酸的历程&#xff0c;使用了rocksdb第三方库&#xff0c;编译器是7.2&#xff0c;rocksdb是20190701从github上取下来的&#xff0c;由于rocksdb自己的CMakeList.txt中使用了-marchnative编译参数&#xff0c;强制使用了编译代码服务器的cpu指令集&#xff0…

检测APK是否混淆

目录 为什么要检测APK是否混淆混淆的优点混淆的缺点APK的混淆的分类检测工具检测人工检测自动化检测为什么要检测APK是否混淆 apk代码混淆就是为了保护代码安全&#xff0c;防止被反编译拿到源码做审计找出危险漏洞&#xff0c;现在大部分的APK都会做混淆。 下面分析混淆APK后的…

基于asp.net的Web开发架构探索(转)

问题由来 最近在研究适合团队开发的web架构解决方案&#xff0c;该架构即要适合分工协作又要有一定扩展性&#xff0c;适合不同的数据库需要&#xff0c;因此我查阅了一些资料&#xff0c;初步构想出了一套架构&#xff0c;请各位多多指教。 探索 web开发架构最经典莫过于三层架…

SkipList 以及高度的确定

转载&#xff1a;https://www.cnblogs.com/lnlvinso/p/8848883.html 结果&#xff1a;skiplist的高度是个随机值。 SkipList理解 记下自己对跳表SkipList的理解。 SkipList采用空间换时间的思想&#xff0c;通过增加数据间的链接&#xff0c;达到加快查找速度的目的。 数据库L…

IIS AppCreate子目录的错误(0x80020006)

这几天做了升级用的安装包,需要在原来的ASP 的虚拟目录下&#xff0c;再创建一个新的ASPNet 虚拟目录。上网查了C# iis设定的资料&#xff0c;按照上面一路做下来&#xff0c;还是无法成功过。 代码只有两行&#xff0c;如下&#xff1a;DirectoryEntry siteVDir new Director…