gpt4 book ai didi

c - 从 IDirect3DTexture9 向后移植后显示 IDirect3DTexture8 的问题

转载 作者:太空宇宙 更新时间:2023-11-04 03:34:47 35 4
gpt4 key购买 nike

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

在进行更改以使用 Direct3d8 后,它会在屏幕上显示一些看起来像小方 block 的混合像素:/(见图片)。

有人知道这里出了什么问题吗?它与 D3D9 完美配合,是否需要一些额外的参数,我缺少 D3D8 的要求,也许是矩形间距?

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

它已传递给 D3D_ResampleTexture() 函数。

任何帮助将不胜感激。

Image output using D3D8

Image output using D3D9

代码:

void D3D_ResampleTexture (image_t *src, image_t *dst)
{
int y, x , srcpos, srcbase, dstpos;

unsigned int *dstdata, *srcdata;

// take an unsigned pointer to the dest data that we'll actually fill
dstdata = (unsigned int *) dst->data;

// easier access to src data for 32 bit resampling
srcdata = (unsigned int *) src->data;

// nearest neighbour for now
for (y = 0, dstpos = 0; y < dst->height; y++)
{
srcbase = (y * src->height / dst->height) * src->width;

for (x = 0; x < dst->width; x++, dstpos++)
{
srcpos = srcbase + (x * src->width / dst->width);

if (src->flags & IMAGE_32BIT)
dstdata[dstpos] = srcdata[srcpos];
else if (src->palette)
dstdata[dstpos] = src->palette[src->data[srcpos]];
else Sys_Error ("D3D_ResampleTexture: !(flags & IMAGE_32BIT) without palette set");
}
}
}


void D3D_LoadTextureStage3 (LPDIRECT3DTEXTURE8/*9*/ *tex, image_t *image)
{
int i;
image_t scaled;

D3DLOCKED_RECT LockRect;

memset (&LockRect, 0, sizeof(D3DLOCKED_RECT));

// check scaling here first
for (scaled.width = 1; scaled.width < image->width; scaled.width *= 2);
for (scaled.height = 1; scaled.height < image->height; scaled.height *= 2);

// clamp to max texture size
if (scaled.width > /*d3d_DeviceCaps.MaxTextureWidth*/640) scaled.width = /*d3d_DeviceCaps.MaxTextureWidth*/640;
if (scaled.height > /*d3d_DeviceCaps.MaxTextureHeight*/480) scaled.height = /*d3d_DeviceCaps.MaxTextureHeight*/480;


IDirect3DDevice8/*9*/_CreateTexture(d3d_Device, scaled.width, scaled.height,
(image->flags & IMAGE_MIPMAP) ? 0 : 1,
/*(image->flags & IMAGE_MIPMAP) ? D3DUSAGE_AUTOGENMIPMAP :*/ 0,
(image->flags & IMAGE_ALPHA) ? D3DFMT_A8R8G8B8 : D3DFMT_X8R8G8B8,
D3DPOOL_MANAGED,
tex
);

// lock the texture rectangle
//(*tex)->LockRect (0, &LockRect, NULL, 0);
IDirect3DTexture8/*9*/_LockRect(*tex, 0, &LockRect, NULL, 0);

// fill it in - how we do it depends on the scaling
if (scaled.width == image->width && scaled.height == image->height)
{
// no scaling
for (i = 0; i < (scaled.width * scaled.height); i++)
{
unsigned int p;

// retrieve the correct texel - this will either be direct or a palette lookup
if (image->flags & IMAGE_32BIT)
p = ((unsigned *) image->data)[i];
else if (image->palette)
p = image->palette[image->data[i]];
else Sys_Error ("D3D_LoadTexture: !(flags & IMAGE_32BIT) without palette set");
// store it back
((unsigned *) LockRect.pBits)[i] = p;
}
}
else
{
// save out lockbits in scaled data pointer
scaled.data = (byte *) LockRect.pBits;

// resample data into the texture
D3D_ResampleTexture (image, &scaled);
}

// unlock it
//(*tex)->UnlockRect (0);
IDirect3DTexture8/*9*/_UnlockRect(*tex, 0);

// tell Direct 3D that we're going to be needing to use this managed resource shortly
//FIXME
//(*tex)->PreLoad ();
}


LPDIRECT3DTEXTURE8/*9*/ D3D_LoadTextureStage2 (image_t *image)
{
d3d_texture_t *tex;

// look for a match

// create a new one
tex = (d3d_texture_t *) malloc (sizeof (d3d_texture_t));

// link it in
tex->next = d3d_Textures;
d3d_Textures = tex;

// fill in the struct
tex->LastUsage = 0;
tex->d3d_Texture = NULL;

// copy the image
memcpy (&tex->TexImage, image, sizeof (image_t));

// upload through direct 3d
D3D_LoadTextureStage3 (&tex->d3d_Texture, image);

// return the texture we got
return tex->d3d_Texture;
}


LPDIRECT3DTEXTURE8/*9*/ D3D_LoadTexture (char *identifier, int width, int height, byte *data, /*bool*/qboolean mipmap, /*bool*/qboolean alpha)
{
image_t image;

image.data = data;
image.flags = 0;
image.height = height;
image.width = width;
image.palette = d_8to24table;

strcpy (image.identifier, identifier);

if (mipmap) image.flags |= IMAGE_MIPMAP;
if (alpha) image.flags |= IMAGE_ALPHA;

return D3D_LoadTextureStage2 (&image);
}

最佳答案

当您锁定纹理时,您必须观察返回的 D3DLOCKED_RECT 结构的 Pitch 成员。您的代码假设所有数据都是连续的,但是 Pitch 可以大于扫描线的宽度,以便锁定子区域和其他不连续的缓冲区布局一个扫描线末尾到下一个扫描线开头的像素。

Chapter 4我的书"The Direct3D Graphics Pipeline"查看访问表面并正确使用 Pitch 的示例。

关于c - 从 IDirect3DTexture9 向后移植后显示 IDirect3DTexture8 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33459102/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com