游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3986|回复: 6

改变texture的surface数据,然后显示texture,怎么显示不出来

[复制链接]

1

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2009-3-17 23:51:00 | 显示全部楼层 |阅读模式
我在写个raytrace程序,大致思路是这样的:加载屏幕大小的texture,获取其surface ,通过对屏幕每个像素进行raytrace后,将得到的颜色信息放到surface里,这样我就得到了一个屏幕大小的texture,而我的texture里的数据就是我raytrace得到的结果。最后用屏幕坐标显示我的texture,就得到了raytrace的结果。可是最后屏幕显示的还是空白(我clear的时候是0xffffffff)。然后自己就舍弃D3D显示的一套,直接用GDI的setpixel来对每一个象素进行着色,最后成功了。我现在纳闷,为什么用D3D那套不行啊。我就简单给surface上的每个象素都搞成0xffff0000,结果也不行(还是白色)。
D3D那套大致代码如下:
//顶点格式声明 :
struct VIEWPORTVERT
{
        float x,y,z,rhw;  // transformed coords
        float tu,tv;       // texture coords
};
#define  D3DFVF_VIEWPORTVERTEX (D3DFVF_XYZRHW|D3DFVF_TEX1)

//初始化texture
// create a texture to store the color of the viewport
D3DXCreateTexture(gd3dDevice,md3dPP.BackBufferWidth,md3dPP.BackBufferHeight,0,0,
                 D3DFMT_X8B8G8R8,D3DPOOL_MANAGED,&mWriteTex);
mWriteTex->GetSurfaceLevel(0,&mWriteSurface);

//初始化顶点,也就四个点,viewport的四个角
// The aspect ratio depends on the backbuffer dimensions, which can
        // possibly change after a reset.  So rebuild the projection matrix.
        float viewPortWidth = (float)md3dPP.BackBufferWidth;
        float viewPortHeight = (float)md3dPP.BackBufferHeight;

        VIEWPORTVERT vertices[] =
        {
                { 0.0f,0.0f,0.5f,1.0f,0.0f,0.0f },//x,y,z,rhw,tu,tv
                { 0.0f,viewPortWidth,0.5f,1.0f,0.0f,1.0f},
                { viewPortHeight,0.0f,0.5f,1.0f,1.0f,0.0f},
                { viewPortHeight,viewPortWidth,0.5f,1.0f,1.0f,1.0f},

        };
        if( FAILED( gd3dDevice->CreateVertexBuffer( 4*sizeof(VIEWPORTVERT), 0, D3DFVF_VIEWPORTVERTEX, D3DPOOL_DEFAULT, &vertexBuffer,NULL) ) )
                MessageBox(0,"can't create vertex buffer","error",1);
        void* pVertices;
        HR(vertexBuffer->Lock(0,sizeof(vertices),(void**)&pVertices,0));
        memcpy(pVertices,vertices,sizeof(vertices));
        vertexBuffer->Unlock();


//修改surface数据,都搞成0xffff0000
D3DSURFACE_DESC surfaceDesc;
        mWriteSurface->GetDesc(&surfaceDesc);
        // Get a pointer to the surface pixel data.
        D3DLOCKED_RECT lockedRect;
        HRESULT re = mWriteSurface->LockRect(
                &lockedRect,// pointer to receive locked data
                0,          // lock entire surface
                0);         // no lock flags specified
        // Iterate through each pixel in the surface and set it to red.
                DWORD* imageData = (DWORD*)lockedRect.pBits;
        for(int i = 0; i < surfaceDesc.Height; i++)
        {
                for(int j = 0; j < surfaceDesc.Width; j++)
                {
                        // index into texture, note we use the pitch and divide by
                        // four since the pitch is given in bytes and there are 4 bytes per DWORD.
                        int index = i * lockedRect.Pitch / 4 + j;
                        imageData[index] = 0xffff0000;
                }
        }
        mWriteSurface->UnlockRect();

// 用修改过的texture去显示
// Clear the backbuffer and depth buffer
        HR(gd3dDevice->Clear(0,0,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,0xffffffff,1.0f,0));
        HR(gd3dDevice->BeginScene());
    HR(gd3dDevice->SetTexture(0,mWriteTex));
        HR(gd3dDevice->SetStreamSource(0,vertexBuffer,0,sizeof(VIEWPORTVERT)));
        HR(gd3dDevice->SetFVF(D3DFVF_VIEWPORTVERTEX));
        HR(gd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,2));
       
        HR(gd3dDevice->EndScene());
        // Present the backbuffer.
        HR(gd3dDevice-&gtresent(0,0,0,0));

谢谢了,诸位哥们,帮我看看。

0

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2009-3-18 13:14:00 | 显示全部楼层

Re: 改变texture的surface数据,然后显示texture,怎么显示不

顶点格式里不要RHW

1

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
 楼主| 发表于 2009-3-18 15:13:00 | 显示全部楼层

Re:改变texture的surface数据,然后显示texture,怎么显示不出来

可是,我定义的顶点是屏幕坐标系的,这样的话两个三角形,再附带texture就填充了屏幕。不过还是要谢谢。

0

主题

2

帖子

4

积分

新手上路

Rank: 1

积分
4
发表于 2009-3-18 23:24:00 | 显示全部楼层

Re:改变texture的surface数据,然后显示texture,怎么显示不出来

直接创建的纹理不用mWriteTex->GetSurfaceLevel(0,&mWriteSurface);
直接 mWriteTex->LockRect(....)就可以了,从文件创建的纹理才需要先得到surFace再lockRect()

1

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
 楼主| 发表于 2009-3-19 22:39:00 | 显示全部楼层

Re:改变texture的surface数据,然后显示texture,怎么显示不出来

先谢谢楼上的提醒。不过,我用了后,还是没有改变,我期望得到红色窗口,还是白色的。

5

主题

686

帖子

697

积分

高级会员

Rank: 4

积分
697
QQ
发表于 2009-3-20 10:03:00 | 显示全部楼层

Re:改变texture的surface数据,然后显示texture,怎么显示不出来

你的需求不就是显示一幅图片吗?何必要用d3d呢?或者你用D3DXSprite代替绘制图片,关掉mip过滤,关掉alphatest和blend
要不直接用D3DXLoadSurfaceFromSurface,把你的图像直接拷贝到rendertarget

1

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
 楼主| 发表于 2009-3-21 00:56:00 | 显示全部楼层

Re:改变texture的surface数据,然后显示texture,怎么显示不出来

谢谢楼上的提醒啊,我猛然间想起来自己没有写SetRenderState函数,没有对三角形的方向进行设置,后来加了一句话:gd3dDevice->SetRenderState(D3DRS_CULLMODE ,D3DCULL_CW),然后红色显示出来了。但是没有占满屏幕,就是窗口右边(约占四分之一)还是白色 。我想估计还有其他地方设置不对,我再找找。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-20 01:51

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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