游戏开发论坛

 找回密码
 立即注册
搜索
查看: 14097|回复: 27

关于directx渲染到纹理的问题

[复制链接]

4

主题

28

帖子

28

积分

注册会员

Rank: 2

积分
28
发表于 2006-10-28 12:51:00 | 显示全部楼层 |阅读模式
我写了一个渲染到纹理的demo

其中在第二步的时候要把那个渲染的目标文理再渲染到buffer中显示出来,这个时候设置SetTexture()的第一个参数应该是什么啊?为什么我设置0的时候不能正常显示,设置为其他数字的时候反而可以正常显示出来了呢?

还有,如果我想将HLSL中的piexel shader的输出结果渲染到纹理中为什么貌似失败了?请问有什么不一样吗?

非常感谢高手给与指导~~~~~!

106

主题

743

帖子

745

积分

高级会员

Rank: 4

积分
745
QQ
发表于 2006-10-28 18:41:00 | 显示全部楼层

Re:关于directx渲染到纹理的问题

SetTexture(参数1:第几层纹理,参数2:纹理指针)。
原因:HLSL的piexel shader关联了每层纹理的操作,如要改变,只有重写这部分代码。

4

主题

28

帖子

28

积分

注册会员

Rank: 2

积分
28
 楼主| 发表于 2006-10-28 20:53:00 | 显示全部楼层

Re: 关于directx渲染到纹理的问题

那默认的不是在第零层吗?

如果要重写应该怎么样写啊?非常希望得到指点

谢谢!

106

主题

743

帖子

745

积分

高级会员

Rank: 4

积分
745
QQ
发表于 2006-10-28 23:36:00 | 显示全部楼层

Re:关于directx渲染到纹理的问题

HLSL我是不会的,我只会VS,PS,而且只是基础部分。

4

主题

28

帖子

28

积分

注册会员

Rank: 2

积分
28
 楼主| 发表于 2006-10-29 16:01:00 | 显示全部楼层

Re: Re:关于directx渲染到纹理的问题

hwbnet: Re:关于directx渲染到纹理的问题

SetTexture(参数1:第几层纹理,参数2:纹理指针)。
原因:HLSL的piexel shader关联了每层纹理的操作,如要改变,只有重写这部分代码。



这位高手能不能帮我解释下啊,什么叫做关联了每一层纹理的啊?确实发现一般的render to texture方法不起效果

106

主题

743

帖子

745

积分

高级会员

Rank: 4

积分
745
QQ
发表于 2006-10-29 17:51:00 | 显示全部楼层

Re:关于directx渲染到纹理的问题

例如:
有纹理1,2,3。
在HLSL中对纹理的操作是:纹理0层和1层的颜色相加并输出。
然后关联纹理:
SetRenderTarget(0,纹理1)
SetRenderTarget(1,纹理2)
SetRenderTarget(2,纹理3)
结果就是:纹理1+纹理2
如果:
SetRenderTarget(0,纹理2)
SetRenderTarget(1,纹理3)
SetRenderTarget(2,纹理1)
结果就是:纹理2+纹理3

4

主题

28

帖子

28

积分

注册会员

Rank: 2

积分
28
 楼主| 发表于 2006-10-29 20:03:00 | 显示全部楼层

Re: 关于directx渲染到纹理的问题

有点懂你的意思了

但是我现在只有一层纹理,hlsl中执行的也是最简单的取样操作而已

为什么render出去还是有问题?下面是我的这一段代码,希望楼上高手指导,不胜感激

if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
{
g_pd3dDevice->SetRenderTarget( 0, pRenderSurface );
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, 0xffffffff, 1.0f, 0 );

sortEffect->SetTechnique("sortTechnique");

g_pd3dDevice->SetStreamSource(0, Quad, 0, sizeof(Vertex));
g_pd3dDevice->SetFVF(Vertex::FVF);

unsigned int numPasses = 0;
sortEffect->Begin(&numPasses, 0);

for( int i = 0; i<numPasses; i++ )
{
sortEffect->BeginPass(i);
g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &proj);
g_pd3dDevice->SetTexture(0, Tex);
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
sortEffect->EndPass();
}
sortEffect->End();


///////////////////////////////////////


g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, 0xffffffff, 1.0f, 0 );
g_pd3dDevice->SetRenderTarget( 0, pBackBuffer );
g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &proj);
g_pd3dDevice->SetTexture(0, pRenderTexture);

g_pd3dDevice->SetStreamSource(0, Quad, 0, sizeof(Vertex));
g_pd3dDevice->SetFVF(Vertex::FVF);
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);

g_pd3dDevice->EndScene();

g_pd3dDevice-&gtresent( NULL, NULL, NULL, NULL );
}

4

主题

28

帖子

28

积分

注册会员

Rank: 2

积分
28
 楼主| 发表于 2006-10-29 20:05:00 | 显示全部楼层

Re:关于directx渲染到纹理的问题

by the way,我的显示结果是一片空白,就好像什么也没有渲染进去的样子

0

主题

114

帖子

114

积分

注册会员

Rank: 2

积分
114
发表于 2006-10-29 20:56:00 | 显示全部楼层

Re:关于directx渲染到纹理的问题

貌似楼上的回答在误导观众,楼主希望在一个pass中渲染一个场景,然后把这个结果渲染到backbuffer把,这个首先要CreateTexture : RenderTarget,然后把这个纹理的surface当作RT,做第一次渲染。然后下一个用窗口大小的Rectange去Render这个纹理,这时候看你怎么写的shader了,如果用的类似:
sampler s_normal : register(s0) = sampler_state
{
    MipFilter = LINEAR;
    MinFilter = LINEAR;
    MagFilter = LINEAR;
};
表示用第0个texture stage来做sampler,那么,你把上次渲染得结果纹理SetTexture( pRT , 0 );
这样就可以了。
至于SetRenderTarget多个RT,似乎用处是一次DP,绘制到多个RT上面吧

0

主题

114

帖子

114

积分

注册会员

Rank: 2

积分
114
发表于 2006-10-29 21:01:00 | 显示全部楼层

Re:关于directx渲染到纹理的问题

貌似只有类似这样的PS代码,才会用到多个SetRenderTarget
struct PS_OutPut
{
        float4        rt0 : COLOR0;
        float4        rt1 : COLOR1;
};

PS_OutPut ps(VS_OUT i)
{
        PS_OutPut OutPut;
        float3 nor = tex2D(s_normal,i.tex);
        nor = (nor - 0.5f) * 2.0f;
        nor = normalize(nor);
       
        i.lightDir = normalize(i.lightDir);

        LightDesc temp = g_Light;
        temp.Direction = i.lightDir;

        float4 Specular;
        float4 Diffuse = DoLightingDiffuseByDir( temp , i.objPos , nor , i.diff );
        Specular = DoLightingSpecularByDir( temp , i.objPos , nor );
        Diffuse *= tex2D(s_diffuse,i.tex);
        Diffuse.xyz += Specular.xyz;

        OutPut.rt0 = Diffuse;
        OutPut.rt1 = Diffuse;
        return OutPut;
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-4 22:38

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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