游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2541|回复: 5

每次调用DrawPrimitive都会导致前面画的东西消失,这是怎么

[复制链接]

59

主题

404

帖子

404

积分

中级会员

Rank: 3Rank: 3

积分
404
发表于 2010-1-12 11:06:00 | 显示全部楼层 |阅读模式
我最近写了一个使用D3D9绘制2D的程序, 其中2D绘图部分使用了着色器.

问题是每画一个物体之后, 前面的物体居然不见了. 这太奇怪了, 找了很久都没发现问题所在.

在两个物体绘制之间我没有调用任何可能导致清屏的函数, 而且两次绘图调用都是夹在 BeginScene 和 EndScene 之间的

更为奇怪的是, 当我把第二个物体的透明度调成 50% 半透明后, 前面画的东西居然从这个物体的透明处显现出来了, 真怪了


其相关代码如下:
// 顶点着色器
float4 g_ViewportTextureSize : register(c0);

void VSMain(inout        float2 TexUV        : TEXCOORD,
        inout        float4 Color        : COLOR,
        in                float2 Pos                : POSITION,
        out                float4 OutPos        : POSITION)
{
        OutPos = float4(Pos, 0.0f, 1.0f);
        OutPos.xy -= 0.5f;
        OutPos.xy /= g_ViewportTextureSize.xy;
        OutPos.xy *= float2(2.0f, -2.0f);
        OutPos.xy -= float2(1.0f, -1.0f);
        TexUV /= g_ViewportTextureSize.zw;
}

// 像素着色器
sampler g_TextureSampler : register(s0);

float4 PSMain(in float2 TexUV : TEXCOORD, in float4 Color : COLOR) : COLOR
{
        return tex2D(g_TextureSampler, TexUV) * Color;
}



5

主题

755

帖子

757

积分

高级会员

Rank: 4

积分
757
发表于 2010-1-12 11:14:00 | 显示全部楼层

Re:每次调用DrawPrimitive都会导致前面画的东西消失,这是怎

你在同一个位置贴2张一样大的。没错啊就是看不到后面的了。没看到你对第一特别处理啊

59

主题

404

帖子

404

积分

中级会员

Rank: 3Rank: 3

积分
404
 楼主| 发表于 2010-1-12 11:16:00 | 显示全部楼层

Re:每次调用DrawPrimitive都会导致前面画的东西消失,这是怎

话说, 设备创建完毕后我没有设置设备的 世界/视图 等矩阵, 是否是造成这种原因的根本所在?

因为我做的是2d绘图系统, 矩阵这些实在用不上, 所以我就没调用任何 SetTransform 相关函数..

59

主题

404

帖子

404

积分

中级会员

Rank: 3Rank: 3

积分
404
 楼主| 发表于 2010-1-12 11:18:00 | 显示全部楼层

Re:每次调用DrawPrimitive都会导致前面画的东西消失,这是怎

我是在不同位置贴两张图片哎, 并没有重合

59

主题

404

帖子

404

积分

中级会员

Rank: 3Rank: 3

积分
404
 楼主| 发表于 2010-1-12 11:21:00 | 显示全部楼层

Re:每次调用DrawPrimitive都会导致前面画的东西消失,这是怎

而且更让人郁闷的是, 后面画的物体绘制大小的改变, 直接导致前面画的物体跟着改变.

如果后面画的物体的透明度设置为 0 则整个屏幕什么都没有了

59

主题

404

帖子

404

积分

中级会员

Rank: 3Rank: 3

积分
404
 楼主| 发表于 2010-1-12 20:45:00 | 显示全部楼层

Re:每次调用DrawPrimitive都会导致前面画的东西消失,这是怎

问题解决. 分享下经验:

我做的这个2d渲染引擎, 使用了batch批处理技术, 就是把一包相同属性的图元都写在VB/IB里, 并不马上绘制

但是我犯了个很严重的错误, 即我以为DrawPrimitive之后VB/IB就可以擦掉原有数据写新的数据了, 如果不擦掉原有数据则没事.

还有一点很重要, VB/IB Lock时, 不能指定 D3DLOCK_DISCARD 标记, 否则后果比较严重, 问题接踵而来!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-16 12:21

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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