zoukankan      html  css  js  c++  java
  • 我的结论:DX9不支持非2的次幂尺寸纹理,还得显卡说了算

    我的观点基于以下几点:
    若显卡不支持非2的次幂纹理,则:
    1:若使用IDirect3DDevice9::CreateTexture创建非2的次幂尺寸图像将失败
    2:若使用D3DXCreateTexture创建非2的次幂图像将被扩充成2的次幂
    3:若使用D3DXCreateTextureFromFileInMemoryEx创建非2的次幂图像将被扩充成2的次幂(就算用了D3DX_DEFAULT_NONPOW2也没用)

    只有一个函数比较特殊:D3DXCreateTextureFromFileEx,用它创建图像可以完美支持非2的次幂图像,但实际游戏中很少用这个函数,故总体上,创建一个非2的次幂纹理,还是显卡说了算,我没找到除了D3DXCreateTextureFromFileEx之外,D3D会帮你做兼容的函数。
    对于2D游戏来讲,将纹理扩充成2的次幂将是一个致命打击,特别是对于使用商业资源进行做游戏的人来讲尤其如此。
    难怪windows游戏编程大师技巧的作者也认为,用D3D做2D很麻烦。
    我想,有用D3D做过2D游戏的朋友,应该会有同感。

    求高手指正缺漏。
    mark一下,同求高手 为什么说实际游戏中很少用D3DXCreateTextureFromFileEx呢?这函数有问题?
    引用 2 楼 my8197933 的回复:
    为什么说实际游戏中很少用D3DXCreateTextureFromFileEx呢?这函数有问题?


    专业一点的游戏,没有人不去做资源封包处理。 哦!明白~~~~~~ D3DXCreateTextureFromFileEx 会和DX版本有不同

    一般都用Device::CreateTexture来处理 = =除了D3D之外,OPENGL更麻烦,只支持三种尺寸的纹理。(我什么都不知道,求高人指教) 看来,DX9就是直接把内存也给显卡化了,或3D化了,就是说他不像ddraw一样可以自由定义表面的大小,而是在内存中就直接强制以2的次幂进行存储,统一将游戏开发3D化,其实这也很好理解,毕竟DX8以后就全是为3D服务了,而3D游戏就是靠显卡。

    以下是在我笔记本(不支持非2的次幂图片)上的测试情况:
    创建100张32位600×600的tga图片(总量为137M)的比较:

    1:[DX9]D3DXCreateTextureFromFileInMemoryEx()
    占用内存:550M

    2:[DX9]D3DXCreateTexture()
    占用内存:556M

    3:[DX9]D3DXCreateTextureFromFileEx()
    占用内存:149M

    4:[DDraw]IDirectDrawSurface7::CreateSurface()
    占用内存:145M 5:[DX9]IDirect3DDevice9::CreateTexture()
    创建失败,必须手动将参数调整为2的次幂才行
  • 相关阅读:
    MVC3、如何应用EntityFramework 连接MySql 数据库 Kevin
    DEV EXPRESS Summary Footer 不显示 Kevin
    装饰模式 Kevin
    Dev 控件 GridControl 控件 二次绑定数据源的问题。 Kevin
    System.InvalidOperationException 异常 Kevin
    LINQ to XML Kevin
    代理模式——代码版“吊丝的故事” Kevin
    VS2012 中的设备 面板 Kevin
    maven 学习笔记(三)创建一个较复杂的 eclipse+android+maven 工程
    maven 学习笔记(一)eclipse+android+maven
  • 原文地址:https://www.cnblogs.com/lancidie/p/2288398.html
Copyright © 2011-2022 走看看