怎样旋转某个指定的Texture

acexiaoe 2014-05-05 11:07:49
通常利用纹理坐标变换可以通过device完成对某个stage的纹理坐标的变换,如果我有两个texture,利用sprite分别draw出来,我希望只变换其中一个texture而另一个保持不变,但是利用Texture Coordinate Transformations 技术貌似搞不定

伪代码:
IDirect3DTexture9* pTexture1 = NULL;
IDirect3DTexture9* pTexture2 = NULL;
CreateTexture(...);
...
D3DXMATRIX m1,m2,m3;
...
D3DXMatrixRotationZ( &m1, angle);

...
pDevice->SetTexture( 0, pTexture1 ); //貌似这里这么设置没有任何用处,我只想让pTexture1旋转angle度角
pDevice->SetTextureStageState( 0, D3DD3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2 );
pDevice->SetTransform( D3DTX_TEXTURE0, &m1);

请教应该怎么处理呢?
...全文
498 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
acexiaoe 2014-05-24
  • 打赏
  • 举报
回复
引用 8 楼 wurh80 的回复:
果断用shader吧 少年
引用 7 楼 ljb1672 的回复:
微软的帮助对Texture Coordinate Transformations 说得不是很清晰,建议在PS中实现,少于5行代码就可以实现。
谢谢,那就这样吧~~
无名剑 2014-05-21
  • 打赏
  • 举报
回复
引用 6 楼 acexiaoe 的回复:
[quote=引用 5 楼 WJN92 的回复:] [quote=引用 2 楼 acexiaoe 的回复:]
引用
SetTransform()函数有这功能?
有的啊~ http://msdn.microsoft.com/en-us/library/windows/desktop/bb206248(v=vs.85).aspx 昨天尝试过获取纹理的Surface,然后LockRect住这个Surface直接操作像素,成功了一半,修改过后的纹理利用D3DXSaveSurfaceToFile可以看到时正确的,但是利用sprite渲染到屏幕上就黑屏,后来利用RenderToTarget的方法直接重绘纹理,不过效率感觉并不是很高…… 我也在考虑用shader了 anyway,thx
sprite 本来就有旋转功能啊[/quote]
引用 4 楼 wurh80 的回复:
直接旋转Sprite不就完了?
比如texture是一个圆形刻度环(带数字),如果我只希望显示出刻度环的一部分,这时我想到两种方法,一个是在sprite上加一个部分透明texture作为遮罩,另一个就是利用sprite的draw函数中限定pSrcRect不变,而变换Texture本身,因为这个参数是一个RECT*,如果只变换这个参数是达不到我想要的效果的。第一个方法会遮住我刻度环旁边的一些元素,我希望刻度环是个透明的,所以就有了这个问题,不知道我解释明白了没有 [/quote] 果断用shader吧 少年
ljb1672 2014-05-18
  • 打赏
  • 举报
回复
微软的帮助对Texture Coordinate Transformations 说得不是很清晰,建议在PS中实现,少于5行代码就可以实现。
acexiaoe 2014-05-14
  • 打赏
  • 举报
回复
引用 5 楼 WJN92 的回复:
[quote=引用 2 楼 acexiaoe 的回复:]
引用
SetTransform()函数有这功能?
有的啊~ http://msdn.microsoft.com/en-us/library/windows/desktop/bb206248(v=vs.85).aspx 昨天尝试过获取纹理的Surface,然后LockRect住这个Surface直接操作像素,成功了一半,修改过后的纹理利用D3DXSaveSurfaceToFile可以看到时正确的,但是利用sprite渲染到屏幕上就黑屏,后来利用RenderToTarget的方法直接重绘纹理,不过效率感觉并不是很高…… 我也在考虑用shader了 anyway,thx
sprite 本来就有旋转功能啊[/quote]
引用 4 楼 wurh80 的回复:
直接旋转Sprite不就完了?
比如texture是一个圆形刻度环(带数字),如果我只希望显示出刻度环的一部分,这时我想到两种方法,一个是在sprite上加一个部分透明texture作为遮罩,另一个就是利用sprite的draw函数中限定pSrcRect不变,而变换Texture本身,因为这个参数是一个RECT*,如果只变换这个参数是达不到我想要的效果的。第一个方法会遮住我刻度环旁边的一些元素,我希望刻度环是个透明的,所以就有了这个问题,不知道我解释明白了没有
无名剑 2014-05-08
  • 打赏
  • 举报
回复
直接旋转Sprite不就完了?
WJN92 2014-05-08
  • 打赏
  • 举报
回复
引用 2 楼 acexiaoe 的回复:
引用
SetTransform()函数有这功能?
有的啊~ http://msdn.microsoft.com/en-us/library/windows/desktop/bb206248(v=vs.85).aspx 昨天尝试过获取纹理的Surface,然后LockRect住这个Surface直接操作像素,成功了一半,修改过后的纹理利用D3DXSaveSurfaceToFile可以看到时正确的,但是利用sprite渲染到屏幕上就黑屏,后来利用RenderToTarget的方法直接重绘纹理,不过效率感觉并不是很高…… 我也在考虑用shader了 anyway,thx
sprite 本来就有旋转功能啊
acexiaoe 2014-05-07
  • 打赏
  • 举报
回复
引用 1 楼 Renyq 的回复:
[quote=引用 楼主 acexiaoe 的回复:] pDevice->SetTransform( D3DTX_TEXTURE0, &m1);
SetTransform()函数有这功能? 纹理坐标转换要在切线空间进行 ,还是在Shader中实现吧。[/quote] PS:应该是pDevice->SetTransform( D3DTS_TEXTURE0, &m1);
acexiaoe 2014-05-07
  • 打赏
  • 举报
回复
引用
SetTransform()函数有这功能?
有的啊~ http://msdn.microsoft.com/en-us/library/windows/desktop/bb206248(v=vs.85).aspx 昨天尝试过获取纹理的Surface,然后LockRect住这个Surface直接操作像素,成功了一半,修改过后的纹理利用D3DXSaveSurfaceToFile可以看到时正确的,但是利用sprite渲染到屏幕上就黑屏,后来利用RenderToTarget的方法直接重绘纹理,不过效率感觉并不是很高…… 我也在考虑用shader了 anyway,thx
  • 打赏
  • 举报
回复
引用 楼主 acexiaoe 的回复:
pDevice->SetTransform( D3DTX_TEXTURE0, &m1);
SetTransform()函数有这功能? 纹理坐标转换要在切线空间进行 ,还是在Shader中实现吧。
以前一直不知道在GUI里面画出的图片可以旋转,所以遇到想要旋转图片时,都是把图片贴到一个面片上,旋转面片,很是不方便,最近发现在GUI里是可以旋转图片的,所以写到这里分享给大家。下面贴一个例子,利用图片旋转写的一个钟表的代码,不废话,直接上代码。   var Tu1 : Texture2D;   var Time1 : float = 0;   function FixedUpdate () {    Time1 += Time.deltaTime;   }   function OnGUI () {    GUI.Label(Rect(250,170,161,62),getTime(Time1));       GUIUtility.RotateAroundPivot (6*Time1, Vector2(103, 200));    GUI.DrawTexture(Rect(100,100,6,100),Tu1);//秒针    GUIUtility.RotateAroundPivot (-6*Time1, Vector2(103, 200));       GUIUtility.RotateAroundPivot (0.1*Time1, Vector2(103, 200));    GUI.DrawTexture(Rect(100,120,6,80),Tu1);//分针    GUIUtility.RotateAroundPivot (-0.1*Time1, Vector2(103, 200));       GUIUtility.RotateAroundPivot (0.1/60*Time1, Vector2(103, 200));    GUI.DrawTexture(Rect(100,140,6,60),Tu1);//时针    GUIUtility.RotateAroundPivot (-0.1/60*Time1, Vector2(103, 200));   }    function getTime(time : float) : String{    if(time<0){    return "00:00:00";    }    var lastTime : String = "";    var hour = Mathf.FloorToInt(time/3600$);    if(hour/10 >=1){    lastTime+="" + hour;    }else{    lastTime +="0" + hour;    }    var minute = Mathf.FloorToInt(time/60`);    if(minute/10 >=1){    lastTime+=":" + minute;    }else{    lastTime +=":0" + minute;    }    var second = Mathf.FloorToInt(time`);    if(second/10 >=1){    lastTime+=":" + second;    }else{    lastTime +=":0" + second;    }    return lastTime;   }   简单介绍一下代码   GUIUtility.RotateAroundPivot (6*Time1, Vector2(103, 200))为旋转GUI的代码,第一个参数为旋转的角度,第二个参数为旋转的中心点,在它之下的GUI元素都会执行该旋转,例如图片、文字等。当你只想旋转某一GUI元素而其他元素不旋转事就得给它一个停止旋转的代码,很简单,停止旋转时给它一个反向的角度,ok。   为了便于测试,在钟表左边给出一个数字时间经行对比。getTime(time : float)可用于实现场景中时间的显示,或者倒计时的显示等,需要的直接拿走,哈哈哈~

8,325

社区成员

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

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