SetStreamSource的解惑

SetStreamSource的解惑

HRESULT SetStreamSource(

[in]  UINT StreamNumber,

[in]  IDirect3DVertexBuffer9  *pStreamData,

[in]  UINT OffsetInBytes,

[in]  UINT Stride

);

这个是DirectX中SetStreamSource函数的原型声明,文档上说的很简单,就是把顶点缓存和设备数据流绑定,剩下的就不大清楚了。

1 参数解释

StreamNumber:这个是设备数据流的序号,一般程序是用的都是单流,此时设置参数为0。如果想试用多个数据流,就得使用顶点声明,其实FVF最终也会在内部转换为顶点声明。

pStreamData:这个是顶点缓存。

OffsetInBytes:这个偏移量是相对顶点缓存的偏移量,绘制函数才绘制的时候也是从相对于顶点缓存的此偏移量开始计算的。所以它并不是顶点缓存的起始位置相对于数据流起始位置的偏移量。后面的程序可以解释。

Stride:这个跨度自然就是单个顶点的大小了,绘图函数也是根据这个跨度进行取点的。

2 示例代码

bool InitObject()
{
         intnVertexNum = 6;
         HRESULT hRe = NULL;
         hRe = g_pDevice->CreateVertexBuffer(nVertexNum*sizeof(D3DVertex),0,
                                                        D3DFVF_VERTEX,D3DPOOL_MANAGED,&g_pVertex,NULL);
         if(FAILED(hRe) )
         {
                   MessageBox(NULL,TEXT("Failed to create Vertex buffer"),TEXT("ERROR"),MB_OK);
                   returnfalse;
         }

         D3DCOLOR dcol =D3DCOLOR_XRGB(255,255,255);
         D3DVertex *Vertexs = NULL;
         g_pVertex->Lock(0,0,(void**)&Vertexs,0);
         Vertexs[0] =D3DVertex(320.0f,150.0f,0.5f,1.0f,D3DCOLOR_XRGB(255,255,0));
         Vertexs[1] =D3DVertex(420.0f,350.0f,0.5f,1.0f,D3DCOLOR_XRGB(255,0,0));
         Vertexs[2] =D3DVertex(220.0f,150.0f,0.5f,1.0f,D3DCOLOR_XRGB(0,255,0));
         Vertexs[3] =D3DVertex(320.0f,200.0f,0.5f,1.0f,D3DCOLOR_XRGB(255,255,0));
         Vertexs[4] =D3DVertex(420.0f,400.0f,0.5f,1.0f,D3DCOLOR_XRGB(255,0,0));
         Vertexs[5] = D3DVertex(220.0f,200.0f,0.5f,1.0f,D3DCOLOR_XRGB(0,255,0));
         g_pVertex->Unlock();
         ///---------------------------------------------------------------------
         nVertexNum = 4;
         hRe = g_pDevice->CreateVertexBuffer(nVertexNum*sizeof(D3DVertex),0,
                                                        D3DFVF_VERTEX,D3DPOOL_MANAGED,&g_pVertex2,NULL);
         if(FAILED(hRe) )
         {
                   MessageBox(NULL,TEXT("Failed to create Vertex buffer"),TEXT("ERROR"),MB_OK);
                   returnfalse;
         }

         D3DVertex *Vertexs2 = NULL;
         g_pVertex2->Lock(0,0,(void**)&Vertexs2,0);
         Vertexs2[0] =D3DVertex(440.0f,150.0f,0.5f,1.0f,D3DCOLOR_XRGB(255,255,0));
         Vertexs2[1] =D3DVertex(540.0f,350.0f,0.5f,1.0f,D3DCOLOR_XRGB(255,0,0));
         Vertexs2[2] =D3DVertex(340.0f,150.0f,0.5f,1.0f,D3DCOLOR_XRGB(0,255,0));
         Vertexs2[3] = D3DVertex(600.0f,150.0f,0.5f,1.0f,D3DCOLOR_XRGB(0,255,0));
         g_pVertex2->Unlock();

         D3DXVECTOR3 vPosition(0.0f, 0.0f,-5.0f);
         D3DXVECTOR3 vTarget(0.0f, 0.0f, 0.0f);
         D3DXVECTOR3 vUp(0.0f, 1.0f, 0.0f);
    D3DXMATRIX vView;
         D3DXMatrixLookAtLH(&vView,&vPosition,&vTarget,&vUp);
   g_pDevice->SetTransform(D3DTS_VIEW, &vView);

         D3DXMATRIX mProj;
         //D3DXMatrixOrthoLH(&vProj,(FLOAT)g_nWidth,(FLOAT)g_nHeight,1.0f,1000.0f);
         D3DXMatrixPerspectiveFovLH(&mProj,D3DX_PI* 0.5f,
                   (float)g_nWidth/ (float)g_nHeight, 1.0f,1000.0f);
         g_pDevice->SetTransform(D3DTS_PROJECTION,&mProj);
         g_pDevice->SetRenderState(D3DRS_CULLMODE,D3DCULL_CCW);
         g_pDevice->SetRenderState(D3DRS_LIGHTING,TRUE);
         return true;
}

void RenderScene()
{
         DWORD DDXCLEAR =D3DCLEAR_TARGET|D3DCLEAR_STENCIL|D3DCLEAR_ZBUFFER;
         g_pDevice->Clear(0,NULL,DDXCLEAR,D3DCOLOR_XRGB(0,0,0),1.0f,0);
         g_pDevice->BeginScene();
         HRESULT hr;
         hr =g_pDevice->SetStreamSource(0,g_pVertex,0,2*sizeof(D3DVertex));
         //g_pDevice->SetStreamSource(0,g_pVertex2,3*sizeof(D3DVertex),sizeof(D3DVertex));
         g_pDevice->SetFVF(D3DFVF_VERTEX);
         g_pDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,1);

         hr =g_pDevice->SetStreamSource(0,g_pVertex2,sizeof(D3DVertex),sizeof(D3DVertex) );
         g_pDevice->SetFVF(D3DFVF_VERTEX);
         g_pDevice->DrawPrimitive(D3DPT_TRIANGLELIST,0,1);

         g_pDevice->EndScene();
         g_pDevice->Present(NULL,NULL,NULL,NULL);
}

3 结果

4 总结

<1>SetStreamSource函数的作用是将顶点缓存与数据流绑定,并在其中指定绘图的起始点相对顶点缓存的偏移量,数据流的序号。

<2>一个程序可以有多个顶点缓存。

<3>数据流设置完毕后,还要设置FVF,其实这个最终还要在内部转换为顶点的声明。

<4>SetStreamSource中的OffsetInBytes是说的绘图开始点距离顶点缓存起始位置的偏移量。

时间: 2024-10-28 20:59:40

SetStreamSource的解惑的相关文章

【java解惑】前缀自增自减和后缀自增自减问题

    如下代码: public class Example025 { public static void main(String[] args) { int ape = 100; int it = 100; int ape_it = 100; for (int i = 0; i < 100; i++) { ape--; it = it--; ape_it = --ape_it; } System.out.println("ape = " + ape); System.out.

解惑:NFC手机如何轻松读取银行卡信息?

自支付宝钱包8.0推出了NFC新功能,只要将支持NFC功能的手机靠近公交卡.银行卡等带有芯片的IC卡上,可迅速读取卡内余额.卡的信息,还可以给卡进行充值,非常贴心实用. 但是很多网友表示担忧,要是别人用手机紧贴着我的银行卡,那么信息不就轻易泄露了,这样会威胁我的资金安全吗?并有不少伪专家宣称,NFC手机有可能成为黑客的"提款机",可以实现转账操作,风险很大,网友表示很担心.真实情况是什么样的呢?让我从专业的角度,给大家道出内幕. NFC(近场通信,NearFieldCommunicat

[转载]Python 包管理工具解惑

原文链接:http://zengrong.net/post/2169.htm Python 包管理工具解惑 python packaging 一.困惑 作为一个 Python 初学者,我在包管理上感到相当疑惑(嗯,是困惑).主要表现在下面几个方面: 这几个包管理工具有什么不同? distutils setuptools distribute disutils2 distlib pip 什么时候该用pip,什么时候该用 setup.py ,它们有关系么? easy_install.ez_setup

Java动态绑定机制的内幕解惑

在Java方法调用的过程中,JVM是如何知道调用的是哪个类的方法源代码? 这里面到底有什么内幕呢? 这篇文章我们就将揭露JVM方法调用的静态(static binding)和动态绑定机制(auto binding). ★ 静态绑定机制 Java代码   //被调用的类 package hr.test; class Father{ public static void f1(){ System.out.println("Father- f1()"); } } //调用静态方法 impor

微信公众平台开发教程新手解惑40则

[编者按]由CSDN和<程序员>杂志联合主办的 2014年微信开发者大会 将于8月23日在北京举行,邀请了来自于一线的微信开发商技术负责人或资深工程师从企业应用开发高级篇.智能客服与LBS.微信支付.微信上的HTML5社交应用.微信小店开发等角度为与会者带来实战分享( 议程 ).目前报名处于优惠票价阶段,通过申请加入CSDN CTO俱乐部即可享受8折购票价格(票款中均含午餐),在8月1日前完成付款的同学还将免费获赠微信开发图书一本(两选一,活动现场发放).  值得一提的是,CSDN优秀博主.畅

《Java 解惑》笔记(一)

<Java 解惑>里都是一些编程时容易忽略的细节,却也蛮有意思的,所以将里面的内容稍作整理,简略地概括一下: 1.奇数性 在编程的时候经常会遇到要判断传进来的参数是否为奇数,而且容易惯性地认为判断余数是否为1即可,如下代码: public static boolean isOdd ( int i ) { return i % 2 == 1 } 这段程序在四分之一的时间里返回的都是错误的答案 因为在所有的 int 数值中,有一半都是负数,而 isOdd 方法对于对所有负奇数的判断都会失败.在任何

【解惑】Java动态绑定机制的内幕

在Java方法调用的过程中,JVM是如何知道调用的是哪个类的方法源代码? 这里面到底有什么内幕呢? 这篇文章我们就将揭露JVM方法调用的静态(static binding) 和动态绑定机制(auto binding) . ★ 静态绑定机制 //被调用的类 package hr.test; class Father{ public static void f1(){ System.out.println("Father— f1()"); } } //调用静态方法 import hr.te

java解惑之常常忘记的事

java解惑之常常忘记的事 2012-10-17 18:38:57|  分类: JAVA |  标签:基础知识  软件开发  |举报|字号 订阅 针对刚接触java的菜鸟来说,java基础知识都是我们必须认真学习的,但是在工作过几年时间的老鸟来说,有时候也会对java的基础知识产生疑问,对于这种不确定,并且很容易混淆的知识点,java解惑已经为大家进行了很好的总结,现在借用一个作者的总结,进行一下罗列,希望能对你有所帮助. 1. 奇偶判断 不要使用 i % 2 == 1 来判断是否是奇数,因为i

Java解惑七:更多类之谜

谜题66 继承的问题. 对于实例方法:命名相同时,子类会覆写父类的方法,且访问权限至少和父类一样大. 对于域:命名相同时,子类会隐藏父类的域,且访问权限任意. 谜题67 不要重用库中的类名. 谜题68 命名的问题. 类名应该以大写字母开头,形式为:MixedCase. 变量以小写字母开头,形式为:mixedCase. 常量以大写字母开头,形式为:MIXED_CASE. 单个大写字母,只能用于类型参数,形式为:Map<K, V>. 包名应该都是小写,形式为:lower.case. 当一个变量和一