SetRenderState 到底要怎么用呢?很是苦恼。。。请教高人

mrsupersky 2012-09-27 11:55:57
没有用任何效果的时候是这样子的



位图是16位 565RGB的位图。

dev.SetRenderState(RenderState.DestinationBlend, Blend.One);


用了上面的代码后效果是这样子的



__

__
虽然用了效果以后黑色不见了,但是还是问题多多

显示出来的颜色很淡(有点透明),而且感觉也太亮了。。。。

求解决方法。。。

...全文
572 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
mrsupersky 2013-02-10
  • 打赏
  • 举报
回复
引用 26 楼 wurh80 的回复:
游戏中每一帧的渲染不是把渲染状态设置死画全部的 根据对应要渲染的对象的需要 调节对应的渲染状态 然后把东西画好 如果想弄清楚 我建议是去好好看看SDK 另外要直观去查看东西如何渲染 不妨用PIX(DX SDK 自带的调试shader工具)去调试一下别人写好的游戏 查看人家每一帧到底都绘制了些什么。这样调节几次相信学的不仅仅是一个setrendersta……
太高级了,我比较笨,不会用。。。
无名剑 2013-02-10
  • 打赏
  • 举报
回复
游戏中每一帧的渲染不是把渲染状态设置死画全部的 根据对应要渲染的对象的需要 调节对应的渲染状态 然后把东西画好 如果想弄清楚 我建议是去好好看看SDK 另外要直观去查看东西如何渲染 不妨用PIX(DX SDK 自带的调试shader工具)去调试一下别人写好的游戏 查看人家每一帧到底都绘制了些什么。这样调节几次相信学的不仅仅是一个setrenderstate的东西而已
mrsupersky 2013-01-20
  • 打赏
  • 举报
回复
引用 24 楼 woaidebushini 的回复:
到底会不会啊,!~~
就是不会啊。。。才问的。。。
woaidebushini 2012-12-27
  • 打赏
  • 举报
回复
到底会不会啊,!~~
zephyr3d 2012-12-26
  • 打赏
  • 举报
回复
补充一下,加载纹理时要设置纹理格式为带alpha通道的格式,1位就够了,比如D3DFMT_A1R5G5B5
zephyr3d 2012-12-26
  • 打赏
  • 举报
回复
还没解决吗?如果原图是黑底的565, 还有个方案,就是加载纹理的时候设置黑色为colorkey,然后打开alphatest,关闭alpha混合,这个适用于硬边抠图.如果要平滑融合的话,没有alpha是不可能实现的,你可以用1+1的融合模式.
Kevin_qing 2012-12-22
  • 打赏
  • 举报
回复
上面回复的shader 写错了: 改成 clip(i.color.x+i.color.y+i.color.z-0.01); o.color=float4(i.color.xyz,1); 然后ls的第二张图片应该是直接add 1,1这么用的
mrsupersky 2012-12-22
  • 打赏
  • 举报
回复
引用 19 楼 Kevin_qing 的回复:
办法1. 固定管线 混合设置成add 1-sc, 1 能够比较接近color key的效果。 2.用ps处理下tex就能达到和color key完全一样的效果 pixel shader o.color=float4(i.color.xyz,clamp(i.color.x+i.color.y+i.color.z,0,1)); blend 设置 ……
晕,csdn不知道什么情况。。。我之前在帖子里面上传的图片 挂掉了,居然。。。 ——下面这种是colorkey没法解决的。。。。
Kevin_qing 2012-12-22
  • 打赏
  • 举报
回复
办法1. 固定管线 混合设置成add 1-sc, 1 能够比较接近color key的效果。 2.用ps处理下tex就能达到和color key完全一样的效果 pixel shader o.color=float4(i.color.xyz,clamp(i.color.x+i.color.y+i.color.z,0,1)); blend 设置 add 1-sa,1 sa指source alpha sc指source color
mrsupersky 2012-12-21
  • 打赏
  • 举报
回复
能不能只是用混合状态 实现。。。。 因为,这个游戏是基于D3D Sprite 对象 实现的 2D 游戏。就是类似上面 那样的图片一张一张 往上画最终实现一副完美的画面。。。 但是纹理的数量太多,我不想每个都去单独设置混合,那样效率也很低。。。CPU吃紧。。。
彩阳 2012-12-18
  • 打赏
  • 举报
回复
那么就这样,创建一个纹理,格式含有Alpha通道。自己解码图片或者使用其它的库解码,再填充至你创建的纹理。
mrsupersky 2012-12-18
  • 打赏
  • 举报
回复
引用 15 楼 jiangcaiyang123 的回复:
混合属性要设置好。 引用 3 楼 dengyejing 的回复:srcblend=srcalpha dstblend=1-srcalpha 支持楼上的。你的那个是加亮的颜色混合效果,在Photoshop和GIMP里面都有选择。 你可以使用ColorKey去掉黑色,然后使用Alpha混合技术实现。记住,图片一定要有Alpha通道。16位的图片Alpha通道只有1……
不行,都已经说过了图片是rgb565的,我费那么大力气就是希望避免去改动游戏的原来的资源文件。。。这样我的游戏就可以实时使用官方的资源。。。真是弄不明白大家都非要给图片加上alpha,就算要加怎么加?已经说过了图片是rgb566而不是rgb555原图中的颜色不存在alpha,都听不懂吗。。。
彩阳 2012-12-17
  • 打赏
  • 举报
回复
混合属性要设置好。
引用 3 楼 dengyejing 的回复:
srcblend=srcalpha dstblend=1-srcalpha
支持楼上的。你的那个是加亮的颜色混合效果,在Photoshop和GIMP里面都有选择。 你可以使用ColorKey去掉黑色,然后使用Alpha混合技术实现。记住,图片一定要有Alpha通道。16位的图片Alpha通道只有1位,24位的在R6G6B6A6中有Alpha通道,32位的设置一下就有Alpha通道了。看看我的文章
mrsupersky 2012-12-15
  • 打赏
  • 举报
回复
引用 13 楼 Binzo 的回复:
很多参数选择的。
是的,但是参数狂多,根本搞不清楚,哪些效果要怎样配出来... 问题是,原理我也没有搞清楚.... 尤其是遇到16位图像和24位等没有带Alpha通道的图....
Binzo 2012-11-10
  • 打赏
  • 举报
回复
很多参数选择的。
mrsupersky 2012-11-09
  • 打赏
  • 举报
回复
引用 9 楼 leisuregame 的回复:
楼主不要想当然了,要正确显示这些图片本身就需要使用alpha通道,图片加个alpha通道很麻烦吗?在ddraw下你还可以有colorkey可用,d3d下如果不使用alpha通道你大概只有去写ps了,把黑色的像素discard掉
而且你看上面的效果,就是没有Alpha,但是,其实就是颜色淡了一点,所以其实懂的人应该知道问题所在的...
mrsupersky 2012-11-09
  • 打赏
  • 举报
回复
引用 9 楼 leisuregame 的回复:
楼主不要想当然了,要正确显示这些图片本身就需要使用alpha通道,图片加个alpha通道很麻烦吗?在ddraw下你还可以有colorkey可用,d3d下如果不使用alpha通道你大概只有去写ps了,把黑色的像素discard掉
我就是用的D3D,再加载为纹理的时候,我已经选择了ColorKey,因此图片中的#000000 已经可以过滤掉了, 但是问题是,#000023 如何显示成例如背景色是 #f10034 两个颜色如何合成的问题。。。。 这个问题比较复杂。 但是,事实上人家的源程序里面就是没用使用Alpha通道。。。!!! 16位的位图压缩格式。。。哪里来的Alpha?而且本身在运行这个游戏的时候就需要实时解压。如果对每个像素再做处理CPU是吃不消的!!! 应该就是用的颜色混合。。。只是我对D3D 的混合公式不理解罢了。。。。
zephyr3d 2012-11-09
  • 打赏
  • 举报
回复
[我就是用的D3D,再加载为纹理的时候,我已经选择了ColorKey,因此图片中的#000000 已经可以过滤掉了] 你在D3DX创建纹理过程中设置ColorKey,其效果也就是把该颜色替换为alpha值为0的黑色,如果你贴图本身就没有alpha通道的话是不起作用的,但是你可以在创建贴图时指定像素格式为ARGB格式,让D3DX库替你创建alpha通道,然后渲染时指定(srcalpha, 1-srcalpha)blend模式也可以了.但是这样也会影响载入纹理的速度,不如直接提供为带通道的格式 [而且你看上面的效果,就是没有Alpha,但是,其实就是颜色淡了一点,所以其实懂的人应该知道问题所在的..] 告诉你为什么 假设你原来背景上某个点的像素值是(R1, G1, B1), 要画上去的纹理中对应的点的颜色是(R2, G2, B2),你使用的是1+1的blend模式,上面的效果中得到的点的颜色值RGB等于(R1+R2, G1+G2, B1+B2),如果R2,G2,B2都是0,也就是黑色的话,结果自然就是背景色,好像colorkey的效果,但不是黑色的地方和背景叠加,当然会变亮.
zephyr3d 2012-11-07
  • 打赏
  • 举报
回复
楼主不要想当然了,要正确显示这些图片本身就需要使用alpha通道,图片加个alpha通道很麻烦吗?在ddraw下你还可以有colorkey可用,d3d下如果不使用alpha通道你大概只有去写ps了,把黑色的像素discard掉
mrsupersky 2012-11-07
  • 打赏
  • 举报
回复
引用 7 楼 leisuregame 的回复:
图片需要添加alpha通道,存成RGBA格式,黑的地方alpha设置为0,其他地方设置为1,在渲染时打开AlphaBlending,设置blend模式为SrcAlpha, InvSrcAlpha就可以了,也可以使用AlphaTest抠去Alpha为0的部分
不行啊,加Alpha多麻烦啊,而且人家本身程序就是可以显示的,而且完全没问题... 因此肯定是有办法的... 应该是我自己学习不够吧.....还没有完全理解D3D的 一些 固定功能管线的效果.... 包括ColorBlend....
加载更多回复(7)

8,305

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧