游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3053|回复: 9

不用shader可以用法线贴图吗

[复制链接]

57

主题

139

帖子

141

积分

注册会员

Rank: 2

积分
141
发表于 2007-7-13 13:56:00 | 显示全部楼层 |阅读模式
rt
在sdk里找了半天也没找到怎么用法线贴图

121

主题

2029

帖子

2034

积分

金牌会员

Rank: 6Rank: 6

积分
2034
QQ
发表于 2007-7-13 18:27:00 | 显示全部楼层

Re:不用shader可以用法线贴图吗

sdk当然不会讲 。自己搜paper。
给你个提示,bump map

12

主题

217

帖子

220

积分

中级会员

Rank: 3Rank: 3

积分
220
发表于 2007-7-16 10:09:00 | 显示全部楼层

Re:不用shader可以用法线贴图吗

dotproduct3就是normal map的混合操作

10

主题

219

帖子

236

积分

中级会员

Rank: 3Rank: 3

积分
236
QQ
发表于 2007-7-16 11:40:00 | 显示全部楼层

Re:不用shader可以用法线贴图吗

所有用shader实现的效果,在CPU上都可以做出来
本质上就是图象处理

32

主题

1259

帖子

1351

积分

金牌会员

Rank: 6Rank: 6

积分
1351
发表于 2007-7-16 12:44:00 | 显示全部楼层

Re:不用shader可以用法线贴图吗

法线贴图. 如果不用phong lighting 的话, 一点都看不出效果.

121

主题

2029

帖子

2034

积分

金牌会员

Rank: 6Rank: 6

积分
2034
QQ
发表于 2007-7-16 18:34:00 | 显示全部楼层

Re:不用shader可以用法线贴图吗

准确的说应该是如果不用per-pixel lighting 看不出来。。。

32

主题

377

帖子

378

积分

中级会员

Rank: 3Rank: 3

积分
378
发表于 2007-7-16 18:38:00 | 显示全部楼层

Re:不用shader可以用法线贴图吗

可以,这个跟vs一个道理。你不用shader,可以预先对内存里的顶点数据进行处理
,处理完毕后一并交由默认的渲染管道处理。对于纹理同样可以预先对纹理的各点
进行处理,再交由渲染管道。

不同之处在于,前者使用cpu计算,后者使用gpu。

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2007-7-16 18:45:00 | 显示全部楼层

Re:不用shader可以用法线贴图吗

我也在搞shader版的法线贴图,没有书,只有代码,对切线空间转置变换不理解。
以下是部分代码:
OutputVS NormalMapVS(float3 posL      : POSITION0,
                     float3 tangentL  : TANGENT0,
                     float3 binormalL : BINORMAL0,
                     float3 normalL   : NORMAL0,
                     float2 tex0      : TEXCOORD0)
{
    // Zero out our output.
        OutputVS outVS = (OutputVS)0;
       
        // Build TBN-basis.
        float3x3 TBN;
        TBN[0] = tangentL;
        TBN[1] = binormalL;
        TBN[2] = normalL;
       
        // Matrix transforms from object space to tangent space.
        float3x3 toTangentSpace = transpose(TBN); //就是这里不明白。
       
        // Transform eye position to local space.
        float3 eyePosL = mul(float4(gEyePosW, 1.0f), gWorldInv);
       
        // Transform to-eye vector to tangent space.
        float3 toEyeL = eyePosL - posL;
        outVS.toEyeT = mul(toEyeL, toTangentSpace);
       
        // Transform light direction to tangent space.
        float3 lightDirL = mul(float4(gLight.dirW, 0.0f), gWorldInv).xyz;
        outVS.lightDirT  = mul(lightDirL, toTangentSpace);
       
        // Transform to homogeneous clip space.
        outVS.posH = mul(float4(posL, 1.0f), gWVP);
       
        // Pass on texture coordinates to be interpolated in rasterization.
        outVS.tex0 = tex0;
       
        // Done--return the output.
    return outVS;
}

float4 NormalMapPS(float3 toEyeT    : TEXCOORD0,
                   float3 lightDirT : TEXCOORD1,
                   float2 tex0      : TEXCOORD2) : COLOR
{
        // Interpolated normals can become unnormal--so normalize.
        toEyeT    = normalize(toEyeT);
        lightDirT = normalize(lightDirT);
       
        // Light vector is opposite the direction of the light.
        float3 lightVecT = -lightDirT;
       
        // Sample normal map.
        float3 normalT = tex2D(NormalMapS, tex0);
       
        // Expand from [0, 1] compressed interval to true [-1, 1] interval.
    normalT = 2.0f*normalT - 1.0f;
   
    // Make it a unit vector.
        normalT = normalize(normalT);
       
        // Compute the reflection vector.
        float3 r = reflect(-lightVecT, normalT);
       
        // Determine how much (if any) specular light makes it into the eye.
        float t  = pow(max(dot(r, toEyeT), 0.0f), gMtrl.specPower);
       
        // Determine the diffuse light intensity that strikes the vertex.
        float s = max(dot(lightVecT, normalT), 0.0f);
       
        // If the diffuse light intensity is low, kill the specular lighting term.
        // It doesn't look right to add specular light when the surface receives
        // little diffuse light.
        if(s <= 0.0f)
             t = 0.0f;
       
        // Compute the ambient, diffuse and specular terms separatly.
        float3 spec = t*(gMtrl.spec*gLight.spec).rgb;
        float3 diffuse = s*(gMtrl.diffuse*gLight.diffuse).rgb;
        float3 ambient = gMtrl.ambient*gLight.ambient;
       
        // Get the texture color.
        float4 texColor = tex2D(TexS, tex0);
       
        // Combine the color from lighting with the texture color.
        float3 color = (ambient + diffuse)*texColor.rgb + spec;
       
        // Output the color and the alpha.
    return float4(color, gMtrl.diffuse.a*texColor.a);
}

32

主题

377

帖子

378

积分

中级会员

Rank: 3Rank: 3

积分
378
发表于 2007-7-16 18:50:00 | 显示全部楼层

Re:不用shader可以用法线贴图吗

楼上,其实在你的原贴中,有个兄弟讲清楚了,就是求逆。

为什么要求逆,这个道理跟view转换是一样的。

119

主题

1367

帖子

1393

积分

金牌会员

Rank: 6Rank: 6

积分
1393
发表于 2007-7-16 21:07:00 | 显示全部楼层

Re:不用shader可以用法线贴图吗

是啊,明白了。呵呵。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-25 19:27

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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