从IDirect3DTexture9进行后移植后显示IDirect3DTexture8的问题

从IDirect3DTexture9进行后移植后显示IDirect3DTexture8的问题,c,game-engine,direct3d,xbox,quake,C,Game Engine,Direct3d,Xbox,Quake,我正在尝试通过ID软件将Quake 1的Direct3d9端口向后移植到Direct3d8,以便将其移植到原始Xbox(仅使用D3D8 API) 更改使用Direct3d8后,它会在屏幕上以小正方形显示一些混合像素:/(参见图片) 有人知道这里出了什么问题吗?它可以完美地与D3D9配合使用,是否需要一些额外的参数,我缺少D3D8所需的参数,可能是矩形音高 传入的数据是Quake 1.lmp 2d图像文件。它由两个整数(宽度和高度)和一个宽度x高度字节字符串组成,每个字节都是地震调色板的索引 它已

我正在尝试通过ID软件将Quake 1的Direct3d9端口向后移植到Direct3d8,以便将其移植到原始Xbox(仅使用D3D8 API)

更改使用Direct3d8后,它会在屏幕上以小正方形显示一些混合像素:/(参见图片)

有人知道这里出了什么问题吗?它可以完美地与D3D9配合使用,是否需要一些额外的参数,我缺少D3D8所需的参数,可能是矩形音高

传入的数据是Quake 1.lmp 2d图像文件。它由两个整数(宽度和高度)和一个宽度x高度字节字符串组成,每个字节都是地震调色板的索引

它已传递给D3D_ResampleTexture()函数

任何帮助都将不胜感激

守则:

void D3D\u重采样纹理(image\t*src,image\t*dst)
{
int y,x,srcpos,srcbase,dstpos;
无符号int*dstdata,*srcdata;
//取一个无符号指针,指向实际要填充的dest数据
dstdata=(无符号整数*)dst->data;
//更容易访问src数据以进行32位重采样
srcdata=(unsigned int*)src->data;
//最近的邻居
对于(y=0,dstpos=0;yheight;y++)
{
srcbase=(y*src->高度/dst->高度)*src->宽度;
对于(x=0;xwidth;x++,dstpos++)
{
srcpos=srcbase+(x*src->width/dst->width);
if(src->flags和IMAGE_32位)
dstdata[dstpos]=srcdata[srcpos];
else if(src->调色板)
dstdata[dstpos]=src->palete[src->data[srcpos]];
else系统错误(“D3D_重采样纹理:!(标志和图像32位),未设置调色板”);
}
}
}
无效D3D\u加载纹理设置3(LPDIRECT3DTEXTURE8/*9*/*tex,图像\u t*图像)
{
int i;
图像缩放;
D3DLOCKED_RECT LockRect;
memset(&LockRect,0,sizeof(D3DLOCKED_RECT));
//首先在这里检查缩放
用于(scaled.width=1;scaled.widthwidth;scaled.width*=2);
对于(scaled.height=1;scaled.heightheight;scaled.height*=2);
//钳制到最大纹理大小
如果(scaled.width>/*d3d\U设备Caps.MaxTextureWidth*/640)scaled.width=/*d3d\U设备Caps.MaxTextureWidth*/640;
如果(scaled.height>/*d3d_设备Caps.MaxTextureHeight*/480)scaled.height=/*d3d_设备Caps.MaxTextureHeight*/480;
IDirect3DDevice8/*9*/_CreateTexture(d3d_设备,scaled.width,scaled.height,
(图像->标志和图像\u MIPMAP)?0:1,
/*(图像->标志和图像\u MIPMAP)?D3DUSAGE\u AUTOGENMIPMAP:/0,
(图像->标志和图像字母)?D3DFMT_A8R8G8B8:D3DFMT_X8R8G8B8,
D3DPOOL_管理,
特克斯
);
//锁定纹理矩形
//(*tex)->LockRect(0,&LockRect,NULL,0);
IDirect3DTexture8/*9*/_LockRect(*tex,0,&LockRect,NULL,0);
//填写-如何填写取决于缩放比例
如果(scaled.width==图像->宽度和scaled.height==图像->高度)
{
//无缩放
对于(i=0;i<(缩放宽度*缩放高度);i++)
{
无符号整数p;
//检索正确的纹理-这将是直接或调色板查找
if(图像->标志和图像\u 32位)
p=((无符号*)图像->数据)[i];
else if(图像->调色板)
p=图像->调色板[图像->数据[i]];
else系统错误(“D3D_加载纹理:!(标志和图像32位),未设置调色板”);
//把它放回去
((无符号*)LockRect.pBits)[i]=p;
}
}
其他的
{
//在缩放数据指针中保存锁位
scaled.data=(字节*)LockRect.pBits;
//将数据重新采样到纹理中
D3D_重采样纹理(图像和缩放);
}
//打开它
//(*tex)->UnlockRect(0);
IDirect3DTexture8/*9*/_UnlockRect(*tex,0);
//告诉Direct 3D,我们不久将需要使用此托管资源
//修理工
//(*tex)->预加载();
}
LPDIRECT3DTEXTURE8/*9*/D3D\u加载纹理设置2(图像*t图像)
{
d3d_纹理_t*tex;
//找一根火柴
//创建一个新的
tex=(d3d_纹理)malloc(sizeof(d3d_纹理));
//链接到
tex->next=d3d_纹理;
d3d_纹理=tex;
//填写结构
tex->LastUsage=0;
tex->d3d_纹理=NULL;
//复制图像
memcpy(&tex->TexImage,image,sizeof(image_t));
//通过direct 3d上传
D3D_加载纹理设置3(&tex->D3D_纹理,图像);
//返回我们得到的纹理
返回tex->d3d_纹理;
}
LPDIRECT3DTEXTURE8/*9*/D3D_LoadTexture(字符*标识符、整型宽度、整型高度、字节*数据、/*bool*/qboolean mipmap、/*bool*/qboolean alpha)
{
图像;
image.data=数据;
image.flags=0;
image.height=高度;
image.width=宽度;
image.palete=d_8至24表格;
strcpy(image.identifier,identifier);
如果(mipmap)image.flags |=image|u mipmap;
如果(alpha)image.flags |=image|u alpha;
返回D3D_LoadTextureStatege2(&image);
}

锁定纹理时,必须观察返回的
D3DLOCKED_RECT
结构的
Pitch
成员。您的代码假设所有数据都是连续的,但
间距可以大于扫描线的宽度,以便将一条扫描线末端没有连续像素的分区和其他缓冲区布局锁定到下一条扫描线的开始


请看我的书中的一个例子,看看如何访问曲面并正确使用
螺距

对于遇到此问题的任何其他人来说,这是由于图像加载到Xbox内存中的方式,需要对其进行旋转