游戏开发论坛

 找回密码
 立即注册
搜索
楼主: tjpanda88

这是怎么实现的?

[复制链接]

20

主题

451

帖子

470

积分

中级会员

Rank: 3Rank: 3

积分
470
发表于 2006-2-7 19:47:00 | 显示全部楼层

Re:这是怎么实现的?

楼上的正解~
一般来说是将象素的r,g,b值同时乘以一个想提高的百分比,比如1.2,就是提高20%的亮度。
不过在vb中通过lock来锁定缓存操作所有点可能效率会比较低~
我的程序是在d3d中的,所以很容易使用Pixel Shader。对应的Pixel Shader的代码如下:(PS 1.1,HLSL代码)
sampler2D TextureSampler;

float4 rHighlight(float2 tex : TEXCOORD0) : COLOR
{
float4 color0 = tex2D(TextureSampler,tex);
return color0+color0*float4(0.2,0.2,0.2,0.0);
};

technique Highlight
{
    pass P0
    {
        // shaders
    PixelShader = compile ps_1_1 rHighlight();
    }
}

37

主题

171

帖子

177

积分

注册会员

Rank: 2

积分
177
 楼主| 发表于 2006-2-7 23:25:00 | 显示全部楼层

Re:这是怎么实现的?

以我现在的能力好像还不能把它改成VB代码.能不能写一个VB的,多谢了!

130

主题

2714

帖子

2714

积分

金牌会员

Rank: 6Rank: 6

积分
2714
发表于 2006-2-8 01:07:00 | 显示全部楼层

Re:这是怎么实现的?

你有没MSN??

20

主题

451

帖子

470

积分

中级会员

Rank: 3Rank: 3

积分
470
发表于 2006-2-8 01:53:00 | 显示全部楼层

Re:这是怎么实现的?

上面那段不是c语言代码,是叫你把它保存成文件,然后用vb写程序读取然后用HLSL编译后写到GPU里面去~
上面那个你不能改成vb代码的,改了DirectX9就不认了

37

主题

171

帖子

177

积分

注册会员

Rank: 2

积分
177
 楼主| 发表于 2006-2-8 14:29:00 | 显示全部楼层

Re:这是怎么实现的?

刚才查了一下才知道HLSL是什么东西,看来我对DirectX9的了解太少了.
我先去研究一下看看能不能把它弄到GPU里面去.

64

主题

855

帖子

856

积分

高级会员

Rank: 4

积分
856
QQ
发表于 2006-2-8 16:31:00 | 显示全部楼层

Re:这是怎么实现的?

最终颜色 = 纹理颜色 * 明暗度 // 类似于Shader中的 mul 指令或者固定管线的 D3DTOP_MODULATE 操作

20

主题

451

帖子

470

积分

中级会员

Rank: 3Rank: 3

积分
470
发表于 2006-2-8 17:00:00 | 显示全部楼层

Re:这是怎么实现的?

不过如果是pixelshader1.1的话不能乘以1以上的数字哦,所以变暗可以那么乘不过变量就要用源颜色+原颜色*百分比才行的

37

主题

171

帖子

177

积分

注册会员

Rank: 2

积分
177
 楼主| 发表于 2006-2-8 17:22:00 | 显示全部楼层

Re: 这是怎么实现的?

我刚才查了几篇关于这个的文章.
我把那个文件读到了Effect里面也设置了Technique属性.
可不知道为什么没有效果.
大家帮我看看,我哪里写错了,是不是完全理解错了.

sf_20062817226.rar

132.74 KB, 下载次数:

20

主题

451

帖子

470

积分

中级会员

Rank: 3Rank: 3

积分
470
发表于 2006-2-8 18:48:00 | 显示全部楼层

Re:这是怎么实现的?

你只初始化了PixelShader,但是没用它渲染~
你要在draw2d方法前面加上:
effect.begin
effect.beginpass(0)
然后在draw2d后面加上
effect.endpass
effect.end

37

主题

171

帖子

177

积分

注册会员

Rank: 2

积分
177
 楼主| 发表于 2006-2-8 22:36:00 | 显示全部楼层

Re:这是怎么实现的?

那个东西我加了呀! 而且我在屏幕上渲染两个图一个要加亮,一个不加亮(当然这是设想)
    Private Sub Render2D()
        M_Sprite.Draw2D(M_Pic1, New Point(0, 0), 0, New Point(400, 100), &HFFFFFFFF)
        Dim numPasses As Integer, i As Integer

        numPasses = effect.Begin(0)
        For i = 0 To numPasses - 1
            effect.BeginPass(i)
            M_Sprite.Draw2D(M_Pic2, New Point(0, 0), 0, New Point(200, 100), &HFFFFFFFF)
            effect.EndPass()
        Next
        effect.End()
    End Sub
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-23 09:12

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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