游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4112|回复: 8

如何渲染灰度图???

[复制链接]

67

主题

390

帖子

392

积分

中级会员

Rank: 3Rank: 3

积分
392
发表于 2011-6-7 11:13:00 | 显示全部楼层 |阅读模式

如何渲染这种灰度图??使得越黑的地方,越透明,越白的地方越不透明?

0

主题

275

帖子

676

积分

高级会员

Rank: 4

积分
676
发表于 2011-6-7 12:19:00 | 显示全部楼层

Re:如何渲染灰度图???

你是?要做AlphaBlend吧 操作一灰?Alpha
Rt=Rs*A+Rd(1-A)
Gt=Gs*A+Gd(1-A)
Bt=Bs*A+Bd(1-A)

67

主题

390

帖子

392

积分

中级会员

Rank: 3Rank: 3

积分
392
 楼主| 发表于 2011-6-7 13:17:00 | 显示全部楼层

Re: Re:如何渲染灰度图???

Aming: Re:如何渲染灰度图???

你是?要做AlphaBlend吧 操作一灰?Alpha
Rt=Rs*A+Rd(1-A)
Gt=Gs*A+Gd(1-A)
Bt=Bs*A+Bd(1-A)


代码怎么写?(我用的是DX9)

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2011-6-8 20:45:00 | 显示全部楼层

Re: Re: Re:如何渲染灰度图???

轩辕崇正: Re: Re:如何渲染灰度图???



代码怎么写?(我用的是DX9)


要看是固定管线还是着色器。
固定管线的是在 SetRenderState 以及 SetTextureStageState
(你是以灰度图表示的alpha,所以实际上不能用alpha blend,只能是color blend)

m_pd3dDevice->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE);
m_pd3dDevice->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_SELECTARG1);
// 这两行是不考虑光照的写法。具体看你需求,这不不属于这里讨论的范围。

m_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCCOLOR); // 这里应该是D3DBLEND_ONE,否则重复计算了
m_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCCOLOR);

67

主题

390

帖子

392

积分

中级会员

Rank: 3Rank: 3

积分
392
 楼主| 发表于 2011-6-8 22:39:00 | 显示全部楼层

Re: Re: Re: Re:如何渲染灰度图???

instemast: Re: Re: Re:如何渲染灰度图???



要看是固定管线还是着色器。
固定管线的是在 SetRenderState 以及 SetTextureStageState
(你是以灰度...


谢谢了,果然把黑色都去掉了。
但是能否再加个颜色呢?因为我实际要渲染的是一个字体灰度图,我需要调整字体的颜色.
我试了一下,修改顶点色不起作用.?
参考这张图:

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2011-6-9 01:08:00 | 显示全部楼层

Re:如何渲染灰度图???

    其实我还写错了(那样做是以灰度图为alpha图,渲染它自身,这就重复计算了,
    应该是以灰度图为alpha图,渲染白色)

    m_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
    m_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCCOLOR);

================================================================================

需要使用颜色,这不大好办了(你为什么不弄张带alpha通道的图呢?)

一个近似的方式是这样(使用 src * alpha + dest 这种alpha混合方式):

m_pd3dDevice->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR1);

m_pd3dDevice->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_DIFFUSE);
m_pd3dDevice->SetTextureStageState(0,D3DTSS_COLORARG2, D3DTA_TEXTURE);
m_pd3dDevice->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_MODULATE);

m_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
m_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);

67

主题

390

帖子

392

积分

中级会员

Rank: 3Rank: 3

积分
392
 楼主| 发表于 2011-6-9 09:09:00 | 显示全部楼层

Re: Re:如何渲染灰度图???

instemast: Re:如何渲染灰度图???

    其实我还写错了(那样做是以灰度图为alpha图,渲染它自身,这就重复计算了,
    应该是以灰度图为alp...


恩,D3DBLEND_ONE的方式更平滑一些,我起先也是用的D3DBLEND_ONE方式,只是这种方式不容易调整顶点颜色,就是说,渲染出来的图片会受制于后台缓冲色,往往很淡,比如后台缓冲色为白色,那么结果就是什么也渲染不出来。
这是设的0xffff00ff顶点色,结果渲染效果很淡


不用alpha的图片是为了节省空间,因为加了alpha的话,我所有字体纹理的大小将扩大近一倍,同时也意味着载入到内存时也将扩大一倍的内存。

PS:
如果不好调整顶点颜色,可否用一张纹理与其作融合处理?
比如用一张纯红色图片,和这个灰度图进行融合,使得字体的颜色也变成了这个红色,或者用一张彩色图片和这个字体融合,让字体有丰富的纹理?我朋友用shader很容易实现这个特效,但固定管道不知道有没办法?

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2011-6-9 16:01:00 | 显示全部楼层

Re:如何渲染灰度图???

不用alpha的图片是为了节省空间,因为加了alpha的话,我所有字体纹理的大小将扩大近一倍,同时也意味着载入到内存时也将扩大一倍的内存。

其实,只需要alpha通道就够了。不过不存在只有alpha通道的格式。
那你可以载入时把灰度值转化成纹理的alpha通道。lock纹理并写入像素即可。

m_pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
m_pd3dDevice->SetTextureStageState(0,D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);

m_pd3dDevice->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR1);
m_pd3dDevice->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_DIFFUSE);
m_pd3dDevice->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_SELECTARG1);

m_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCCOLOR);
m_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCCOLOR);

如果不好调整顶点颜色,可否用一张纹理与其作融合处理?

不管是用彩色纹理还是顶点颜色都是差不多的操作,都不好办。

比如说顶点颜色和灰度图混合的方式:
(这里只能采用 src * alpha + dest 这种alpha混合公式)

m_pd3dDevice->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR1);
m_pd3dDevice->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_DIFFUSE);
m_pd3dDevice->SetTextureStageState(0,D3DTSS_COLORARG2, D3DTA_TEXTURE);
m_pd3dDevice->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_MODULATE);

m_pd3dDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_ONE);
m_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ONE);

* 如果要用彩色纹理和灰度图混合就需要2个texture stage,还需要混入D3DTA_DIFFUSE(包括了顶点的光照结果)

67

主题

390

帖子

392

积分

中级会员

Rank: 3Rank: 3

积分
392
 楼主| 发表于 2011-6-9 18:16:00 | 显示全部楼层

Re: Re:如何渲染灰度图???

instemast: Re:如何渲染灰度图???

不用alpha的图片是为了节省空间,因为加了alpha的话,我所有字体纹理的大小将扩大近一倍,同时也意味着载...


恩,看来的确不好办,罢了,我还是直接保存alpha通道数据了,谢谢了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-9 14:14

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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