游戏开发论坛

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: 微无渊

[DX9]关于非2的次幂纹理

[复制链接]

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
 楼主| 发表于 2013-4-9 17:25:38 | 显示全部楼层
疯子阿虹 发表于 2013-4-8 23:00
找个简单算法其实并不算很困难。或者可以让美术先帮着和好。
否则你就创建512 x 512不就完了?????? ...

我就是想知道,别人是如何解决这类问题的,就是用什么样的算法.
既然没人愿意说,就算了。

201

主题

1437

帖子

1963

积分

金牌会员

Rank: 6Rank: 6

积分
1963
QQ
发表于 2013-4-11 17:47:59 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

0

主题

12

帖子

32

积分

注册会员

Rank: 2

积分
32
发表于 2013-4-13 20:56:18 | 显示全部楼层
可以创建512*512的纹理大小,当然,你也可以用256*256,用256*256尺寸来读取速度是最快的,但是因为你的是300*300,用256*256读的话,图片贴上去可能效果不好,当然,你可以通过纹理过滤来调整效果。如果你想指定某个顶点的纹理坐标,比如(30,30),那么纹理坐标应该是(30/300,30/300) = (0.1,0.1)。如果你想获得读取后纹理的实际尺寸,可以通过d3dTex->GetLevelDesc()来获取,如果想获得文件中原纹理的大小,可以用过这个函数D3DXCreateTextureFromFileEx来创建并获取纹理的原尺寸,这个函数还可以操作纹理的过滤方式、映射方式,如果尺寸参数指定为D3DX_DEFAULT_NONPOW2,则读取纹理的时候会按原纹理的大小读取,就是300*300,如果机器不支持的话,那么尺寸可以设置为0,Direct3D会以2的次幂来读取,其大小大于原尺寸,就是说会以512*512来读取,详细参数可以到MSDN中查看该函数的说明。

0

主题

12

帖子

32

积分

注册会员

Rank: 2

积分
32
发表于 2013-4-18 13:16:15 | 显示全部楼层
还有一个办法,可以使用C或者C++的文件操作来读取位图的数据,然后再写到DirectX的纹理接口中,那么要不要调整为2的次幂,你可以自己来操作,D3DXCreateTextureFromFileEx()这些函数大概也是这样子来操作的,位图数据最终还是二进制的数,你甚至可以把300张的位图数据全放到一个文件里(不是文件夹),然后你可以通过你自己定义的标识来识别是否为下一张纹理图,这样操作起来会麻烦一些,但是很灵活。《3D游戏编程大师技巧》就是这样做的,你可以参考一下。

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
 楼主| 发表于 2013-4-18 19:10:40 | 显示全部楼层
本帖最后由 微无渊 于 2013-4-18 19:12 编辑
zx504287 发表于 2013-4-18 13:16
还有一个办法,可以使用C或者C++的文件操作来读取位图的数据,然后再写到DirectX的纹理接口中,那么要不要 ...

没听懂

3D游戏编程大师技巧关于纹理的存储我非常清楚,就是读16位像素到内存(通过Load_Bitmap_File()函数),没有你说的文件的概念.

0

主题

12

帖子

32

积分

注册会员

Rank: 2

积分
32
发表于 2013-4-19 14:22:01 | 显示全部楼层
额......那你有没有看Load_Bitmap_File()这个函数的实现?它里面有个OpenFile(),_lread()等文件操作API函数,这些都是Windows 自带的API函数。另外纹理接口可以先创建而没有位图数据,通过d3d9Device接口可以创建一个没有位图数据的纹理接口,然后你可以填充指定的位图数据。其实你还可以把所有文件用你的压缩算法压缩后存放到硬盘,然后读取的时候通过你的解压缩算法,再进行操作,那样就算把文件传给人家,人家也无法使用。只是有点复杂……

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
 楼主| 发表于 2013-4-19 20:25:02 | 显示全部楼层
本帖最后由 微无渊 于 2013-4-19 21:00 编辑
zx504287 发表于 2013-4-19 14:22
额......那你有没有看Load_Bitmap_File()这个函数的实现?它里面有个OpenFile(),_lread()等文件操作API函 ...

你可能没理解我的意思,我再强调一下:
Load_Bitmap_File() 是把像素转换成16位,存储到他的自定义结构里,另外他的代码本身就有bug,就是seek调用错误

其实就算我完全不知道这个函数写了什么,也无妨,因为,他的光栅化函数,每一行是怎么写的,我心里十分清楚,它就是用这16位像素来渲染的,他的ddraw也是基于16位的,如果是窗口模式,还必须把桌面的色深调整成16位,否则看到的画面将是错乱的.

0

主题

4

帖子

46

积分

新手上路

Rank: 1

积分
46
发表于 2013-4-29 20:02:03 | 显示全部楼层
个人以为可以采用以下方法,当然只是建议,自己没用过,所以不敢保证有效:
就是先判断图片是否非2,如果非2,就创建一个指定大小的纹理,如300×300,然后获取它的表面DC,然后使用GDI、GDI+、CImage等方式读取图片,并渲染到刚创建的纹理DC中去。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-13 19:46

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表