游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2321|回复: 4

关于Direct3D几何流水线疑惑

[复制链接]

1

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2012-5-11 23:53:00 | 显示全部楼层 |阅读模式
bool CreateTriangle()
{
        Device->CreateVertexBuffer(3*sizeof(Vertex),D3DUSAGE_WRITEONLY,D3DFVF_XYZ,
                D3DPOOL_MANAGED,&Triangle,0);

        Vertex* vertex;
        Triangle->Lock(0,0,(void**)&vertex,0);

        vertex[0] = Vertex(-1.0f, 0.0f, 2.0f);
        vertex[1] = Vertex( 0.0f, 1.0f, 2.0f);
        vertex[2] = Vertex( 1.0f, 0.0f, 2.0f);

        Triangle->Unlock();

        D3DXMATRIX proj;

        D3DXMatrixPerspectiveFovLH(
                        &proj,                        // result
                        D3DX_PI * 0.5f,               // 90 - degrees
                        (float)Width / (float)Height, // aspect ratio
                        1.0f,                         // near plane
                        1000.0f);                     // far plane

        Device->SetTransform(D3DTS_PROJECTION, &proj);

        //
        // Set wireframe mode render state.
        //
        Device->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);

        return true;
}

以上代码是DirectX龙书上的一个小例子,按照龙书所说的流水线应该是世界变换-观察变换-投影变换-视口变换,从左到右,
执行完Triangle->Unlock();应该要调用D3DXMatrixLookAtLH进行观察变换的设置,为什么可以跳过观察变换直接进行投影变换

26

主题

417

帖子

476

积分

中级会员

总版主

Rank: 3Rank: 3

积分
476
发表于 2012-5-12 10:31:00 | 显示全部楼层

Re:关于Direct3D几何流水线疑惑

在无关显示正确性下, 把view matrix看做Identity,就可以直接到projection matrix
我是这么理解的

1

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2012-5-12 12:24:00 | 显示全部楼层

Re: Re:关于Direct3D几何流水线疑惑

playerwing: Re:关于Direct3D几何流水线疑惑

在无关显示正确性下, 把view matrix看做Identity,就可以直接到projection matrix
我是这么理解的


我在看DirectX游戏开发终极指南时发现一个例子是在屏幕中间输出一个三角形,这个例子更加特殊,连摄像机,观察变换,投影变换都没有设置,出奇的是居然可以正常显示,请教下,在创建完device对象,是否在device内部就存在有摄像机,观察变换,投影变换的默认值,以至于可以跳过这些设置?

2

主题

31

帖子

57

积分

注册会员

Rank: 2

积分
57
发表于 2012-5-15 22:47:00 | 显示全部楼层

Re:关于Direct3D几何流水线疑惑

纺织厂生产衣服,10几道工序,其中一道工序改变,相应的机器可能要做一下调整.
比如生产产品S和产品B件若干件.他们的机器设置肯定不一样.
你肯定是生产完S后,再生产B.这样所有设备只要一次设置一次就行了.
而不是一会生产S,一会生产B,那么效率就大大降低了,因为每次生产不同的产品,途中你都要对设备做调整.


显卡的固定管线也是一样的道理. 也分几道工序.工序中设备状态(显卡部件的设备状态),称之渲染状态.
只要你在处理数据时,不是频繁的切换渲染状态,即SetRenderState 乱用一气,效率就差不到哪去了.
所以渲染编程时,要尽可能地把渲染状态一致的物体组织在一起,然后按批渲染,象.x文件就是这样的,这绵id3dxmesh有个优化函数,就是为也把纹理相同的三角片面组织在一起(对显卡来说,递交给他的纹理不同,就会引发一次渲染状态改变),然后按批渲染. 另一方面,考虑如何不渲染...以后你自然会理解的.

----------------------
关于流水线,理解到这一点就差不多了.


固管,不是白叫的,它有一套默认的设备设置(渲染状态).所以程序员不指定什么也没关系.

比如视图转换,默认情况下,相机坐标系和世界坐标系,是重合的. 当你去自定义的话,只是因为你想一开始就从你想要的角度去看这个三角面,如果懒人一个,当然不用指定了.
因为考虑到例子中三角面的三个顶点位置, 相机是从Z正方向看那个三角面,已经可以达到预期的可视要求了.
为什么达到预期的可视要求?
透视矩阵,设width/height= 4/3.角度取得是90度.所以很快可得口算到这个大致的转换矩阵
1.33 0  0  0
0    1  0  0
0    0  1  1
0    0 -1  0

你把上面的三个点做矩阵转换,再规一.就得到三个点标:
(-0.65,   0)
(    0, 0.5)
(0.65,    0)  
然后[-1,1]范围的这个二维平面画一下,就知道它会显示在屏幕的上半部分.

当然实际做法都是在世界坐标系下去考虑的,实际效果再慢慢调整相机位置,这时,你必然要亲自设置相机的位置及视线了.

0

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2012-5-16 10:39:00 | 显示全部楼层

Re: Re: Re:关于Direct3D几何流水线疑惑

human_cn: Re: Re:关于Direct3D几何流水线疑惑



我在看DirectX游戏开发终极指南时发现一个例子是在屏幕中间输出一个三角形,这个例子更加特殊,连摄像机...


不用设置worldviewproj的原因是:顶点格式为XYZRHW
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-2-28 12:20

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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