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的次幂才行
  • 相关阅读:
    Eq Eqv Equal
    list append 总是复制前面的参数,而不复制最后一个参数
    Teach Yourself Scheme in Fixnum Days 13 Jump跳转
    python 操作 office
    python ImportError: DLL load failed: %1 不是有效的 Win32 应用程序
    pywin32 安装错误 ImportError: DLL load failed: 不是有效的 Win32 应用程序
    Python version 2.7 required, which was not found in the registry
    scheme 解释器Guile 使用
    Teach Yourself Scheme in Fixnum Days 6 recursion递归
    求一个正则表达式,字母不能重复
  • 原文地址:https://www.cnblogs.com/lancidie/p/2288398.html
Copyright © 2011-2022 走看看