Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Directx D3D9圆原虫_Directx_Primitive_Ellipse_Direct3d9 - Fatal编程技术网

Directx D3D9圆原虫

Directx D3D9圆原虫,directx,primitive,ellipse,direct3d9,Directx,Primitive,Ellipse,Direct3d9,我试图画一个每个顶点都有D3D9和DrawPrimitive的2D圆,但不知怎的失败了 下面图片中的白点代表我的顶点,青色圆用我的函数渲染 这是我的椭圆函数 RETURN CRender::Ellipse( SPos Position, SSize Size, int Sides, int LineWidth, CColor* BgColor, CColor* LineColor, float Abundance ) { // check if parameters valid

我试图画一个每个顶点都有D3D9和DrawPrimitive的2D圆,但不知怎的失败了

下面图片中的白点代表我的顶点,青色圆用我的函数渲染

这是我的椭圆函数

RETURN CRender::Ellipse( SPos Position, SSize Size, int Sides, int LineWidth, CColor* BgColor, CColor* LineColor, float Abundance )
{
    // check if parameters valid
    if( !BgColor || !LineColor ) return R_FAILED; // check pointers
    if( Abundance > 1 || Abundance < 0 ) (Abundance > 1) ? Abundance = 1 : Abundance = 0; // max. & min. abundance

    // instance needed vars
    int VertexSize = ( Sides * Abundance ); // how much vertices to draw ?
    int abSize = VertexSize * sizeof( CUSTOMVERTEX ); // absolute size in byte
    double PosOffset = 0; // used in function below
    LPDIRECT3DVERTEXBUFFER9 VertexBuffer = NULL; // instance vertex buffer
    CUSTOMVERTEX* Vertex = new CUSTOMVERTEX[ VertexSize ]; // instance vertices
    D3DXVECTOR2* Line = new D3DXVECTOR2[ VertexSize ]; // instance outline
    VOID* pData = NULL; // pipe data

    // calc vertices
    Vertex[ 0 ] = FillVertex( Position.X, Position.Y, /*Position.Z*/ 0, 1, BgColor->ToDWORD() );
    for( int i = 1; i <= VertexSize; i++, PosOffset += (2*PI) / Sides )
    {
        // corrections
        while( PosOffset > 2*PI ) PosOffset -= 2*PI;
        // instance vertex
        Vertex[ i ] = FillVertex(    ( cos(PosOffset) * Size.Width ) + Position.X,
                                    ( sin(PosOffset) * Size.Height ) + Position.Y,
                                    /*( tan(PosOffset) * Size.Depth ) + Position.Z*/ 0, // fix 2D position
                                    1, BgColor->ToDWORD() );
    }

    // instance buffer
    Device->CreateVertexBuffer( abSize, D3DUSAGE_WRITEONLY, CUSTOMFVF, D3DPOOL_MANAGED, &VertexBuffer, NULL );

    // prepare buffer
    VertexBuffer->Lock( NULL, abSize, (void**)&pData, NULL );
    memcpy( pData, Vertex, abSize );
    VertexBuffer->Unlock( );

    // prepare primitive
    Device->SetRenderState( D3DRS_ZENABLE, D3DZB_FALSE );
    Device->SetRenderState( D3DRS_ALPHABLENDENABLE, true );
    Device->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
    Device->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );

    // draw primitive
    Device->SetStreamSource( 0, VertexBuffer, NULL, sizeof( CUSTOMVERTEX ) );
    Device->DrawPrimitive( D3DPT_TRIANGLEFAN, 0, VertexSize - 2 );

    return R_OK;
}
RETURN CRender::Ellipse(SPos位置、SSize大小、int边、int线宽、CColor*BgColor、CColor*LineColor、float丰度)
{
//检查参数是否有效
如果(!BgColor | |!LineColor)返回R|u失败;//检查指针
如果(丰度>1 | |丰度<0)(丰度>1)?丰度=1:丰度=0;//最大和最小丰度
//实例所需变量
int VertexSize=(边*丰度);//要绘制多少顶点?
int abSize=VertexSize*sizeof(CUSTOMVERTEX);//绝对大小(字节)
double PosOffset=0;//在下面的函数中使用
LPDIRECT3DVERTEXBUFFER9 VertexBuffer=NULL;//实例顶点缓冲区
CUSTOMVERTEX*Vertex=新CUSTOMVERTEX[VertexSize];//实例顶点
D3DXVECTOR2*Line=新的D3DXVECTOR2[VertexSize];//实例轮廓
VOID*pData=NULL;//管道数据
//计算顶点
顶点[0]=FillVertex(Position.X,Position.Y,/*Position.Z*/0,1,BgColor->ToDWORD());
对于(inti=1;i2*PI)PosOffset-=2*PI;
//实例顶点
顶点[i]=填充顶点((cos(PosOffset)*Size.Width)+Position.X,
(sin(PosOffset)*尺寸高度)+位置Y,
/*(tan(PosOffset)*大小.深度)+位置.Z*/0,//固定2D位置
1、BgColor->ToDWORD());
}
//实例缓冲区
设备->创建VertexBuffer(abSize、D3DUSAGE_WRITEONLY、CUSTOMFVF、D3DPOOL_MANAGED和VertexBuffer,NULL);
//准备缓冲液
VertexBuffer->Lock(NULL,abSize,(void**)和pData,NULL);
memcpy(pData、Vertex、abSize);
VertexBuffer->Unlock();
//准备原语
设备->设置渲染状态(D3DRS\u ZENABLE,D3DZB\u FALSE);
设备->设置渲染状态(D3DRS_字母可还原,真);
设备->设置渲染状态(D3DRS\u SRCBLEND,D3DBLEND\u SRCALPHA);
设备->设置渲染状态(D3DRS\u destlend,D3DBLEND\u INVSRCALPHA);
//绘图原语
设备->设置流源(0,VertexBuffer,NULL,sizeof(CUSTOMVERTEX));
设备->绘图原语(D3DPT_三角形,0,顶点大小-2);
返回R_OK;
}
我不知道我做错了什么,显然最后两个顶点不会被画出来。
如果有人能向我解释出什么问题,我会非常高兴的

这是几何体类型D3DPT_TRIANGLEFAN的正确行为,假设您要将椭圆拆分为4条边,您将需要5个顶点(加上椭圆的中心v0),如下所示,因此您将得到5-2=3个三角形风扇,即v0v1v2、v0v2v3和v0v3v4,但您不会得到v0v4v1,Direct3D不会为您这样做

如果要获取最后一个三角形风扇v0v4v1,则需要一个额外的顶点来存储v1,如

vextex[5] = vertex[1]
现在你有6个顶点,所以你将得到6-2=4个三角形扇,包括V0v1

您需要两个额外的顶点,一个用于椭圆的中心,一个用于最后一个顶点

int VertexSize = ( Sides * Abundance ) + 2;
将这条线添加到for循环下方,这将添加最后一个顶点以绘制最后一个三角形扇形

Vertex[VertexSize -1] = Vertex[1];