游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1635|回复: 3

我想要vp中把这个点的屏幕坐标以一个纹理坐标的形式传

[复制链接]

4

主题

7

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2008-11-18 11:46:00 | 显示全部楼层 |阅读模式
请问这个应怎样写着色器代码。
// 下面这是个已有的代码,但是没有看懂,哪位高人可以帮忙解释一下。。

在vp中
oPos = mul(worldViewProjMatrix, pos);
       
       
// Projective texture coordinates, adjust for mapping
float4x4 scalemat = float4x4( 0.5,   0,   0, 0.5,
                           0,-0.5,   0, 0.5,                                                                   0,   0, 0.5, 0.5,
                        0,   0,   0,   1);
projectionCoord = mul(scalemat, oPos);

//在fp中
// Do the tex projection manually so we can distort _after_
float2 final = projectionCoord.xy / projectionCoord.w;

此时final中保存的就是屏幕坐标了,不过是0-1空间的。
哪位帮忙解释一下为什么要这样写..

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2008-11-18 12:11:00 | 显示全部楼层

Re:我想要vp中把这个点的屏幕坐标以一个纹理坐标的形式

投影空间的范围是x:[-1,1], y:[-1,1], z:[0,1],scalemat将其放缩到[0,1]
最后从齐次坐标系转换到仿射坐标系

4

主题

7

帖子

9

积分

新手上路

Rank: 1

积分
9
 楼主| 发表于 2008-11-18 13:57:00 | 显示全部楼层

Re:我想要vp中把这个点的屏幕坐标以一个纹理坐标的形式

楼上的大哥,我算了一下矩阵乘法,好像不是啊。
( 0.5x, -0.5y, 0.5z, ( 0.5x - 0.5y + 0.5z + w ) )
这个值和你说的不太一样啊!!

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2008-11-18 17:07:00 | 显示全部楼层

Re:我想要vp中把这个点的屏幕坐标以一个纹理坐标的形式

它的scalemat用的是列矩阵,应该是opengl的glsl。
所以是scalemat * oPos
(0.5x + 0.5, -0.5y + 0.5, 0.5z + 0.5, 1)

不过我觉得放缩后再projectionCoord.xy / projectionCoord.w不太对头……
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-20 21:58

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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