弧面为二次多项式的uv纹理设置 directx void SphereCylDemo::bulidCurveBuffer() ... { if(g_pVB==NULL) ...{ if( FAILED( gd3dDevice->CreateVertexBuffer( 6*x_step*y_step*sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_MANAGED, &g_pVB, NULL ) ) ) ...{ int error = 0; } } FILE* pFile = fopen("log.txt", "w"); CUSTOMVERTEX* pVertices; g_pVB->Lock( 0, 0, (void**)&pVertices, 0 ); float _sumx = 0.5; float _sumx1 = 0.5; float eachStep= 0.5/(x_step/2); for(int k=0;k<x_step;k++) ...{ float x0 = 0; float x1 = 0; int i = 0; if(k<=x_step/2) ...{ i = x_step/2 -k; float xx = (float)(abs(i-x_step/2))/(x_step/2); float len_segment = eachStep/sqrt(1+(2*A*xx+B)*(2*A*xx+B)); x0 = _sumx1; _sumx1 = _sumx1 - len_segment; x1 = _sumx1; //x0=0; //x1=0; int i1 = (i-1); for(int j=0;j<y_step;j++) ...{ int j1 = (j+1); float y0 = (float)j/y_step; float y1 = (float)j1/y_step; //0 pVertices->position.x = x0; pVertices->position.y = y0; pVertices->position.z = 0; pVertices->color = D3DCOLOR_XRGB(255, 255, 255); pVertices->tu = (float)i/x_step; pVertices->tv = (float)j/y_step; pVertices++; //1 pVertices->position.x = x1; pVertices->position.y = y0; pVertices->position.z = 0; pVertices->color = D3DCOLOR_XRGB(255, 255, 255); pVertices->tu = (float)i1/x_step; pVertices->tv = (float)j/y_step; pVertices++; //2 pVertices->position.x = x0; pVertices->position.y = y1; pVertices->position.z = 0; pVertices->color = D3DCOLOR_XRGB(255, 255, 255); pVertices->tu = (float)i/x_step; pVertices->tv = (float)j1/y_step; pVertices++; //2 pVertices->position.x = x0; pVertices->position.y = y1; pVertices->position.z = 0; pVertices->color = D3DCOLOR_XRGB(255, 255, 255); pVertices->tu = (float)i/x_step; pVertices->tv = (float)j1/y_step; pVertices++; //1 pVertices->position.x = x1; pVertices->position.y = y0; pVertices->position.z = 0; pVertices->color = D3DCOLOR_XRGB(255, 255, 255); pVertices->tu = (float)i1/x_step; pVertices->tv = (float)j/y_step; pVertices++; //3 pVertices->position.x = x1; pVertices->position.y = y1; pVertices->position.z = 0; pVertices->color = D3DCOLOR_XRGB(255, 255, 255); pVertices->tu = (float)i1/x_step; pVertices->tv = (float)j1/y_step; pVertices++; } } else ...{ i = k; float xx = (float)(abs(i-x_step/2))/(x_step/2); float len_segment = eachStep/sqrt(1+(2*A*xx+B)*(2*A*xx+B)); x0 = _sumx; _sumx = _sumx + len_segment; x1 = _sumx; int i1 = (i+1); for(int j=0;j<y_step;j++) ...{ int j1 = (j+1); float y0 = (float)j/y_step; float y1 = (float)j1/y_step; //0 pVertices->position.x = x0; pVertices->position.y = y0; pVertices->position.z = 0; pVertices->color = D3DCOLOR_XRGB(255, 255, 255); pVertices->tu = (float)i/x_step; pVertices->tv = (float)j/y_step; pVertices++; //2 pVertices->position.x = x0; pVertices->position.y = y1; pVertices->position.z = 0; pVertices->color = D3DCOLOR_XRGB(255, 255, 255); pVertices->tu = (float)i/x_step; pVertices->tv = (float)j1/y_step; pVertices++; //1 pVertices->position.x = x1; pVertices->position.y = y0; pVertices->position.z = 0; pVertices->color = D3DCOLOR_XRGB(255, 255, 255); pVertices->tu = (float)i1/x_step; pVertices->tv = (float)j/y_step; pVertices++; //2 pVertices->position.x = x0; pVertices->position.y = y1; pVertices->position.z = 0; pVertices->color = D3DCOLOR_XRGB(255, 255, 255); pVertices->tu = (float)i/x_step; pVertices->tv = (float)j1/y_step; pVertices++; //3 pVertices->position.x = x1; pVertices->position.y = y1; pVertices->position.z = 0; pVertices->color = D3DCOLOR_XRGB(255, 255, 255); pVertices->tu = (float)i1/x_step; pVertices->tv = (float)j1/y_step; pVertices++; //1 pVertices->position.x = x1; pVertices->position.y = y0; pVertices->position.z = 0; pVertices->color = D3DCOLOR_XRGB(255, 255, 255); pVertices->tu = (float)i1/x_step; pVertices->tv = (float)j/y_step; pVertices++; } } fprintf(pFile,"%.4f , %.4f ",x0,x1); } fclose(pFile); g_pVB->Unlock(); } void SphereCylDemo::drawCurve() ... { IDirect3DDevice9* pd3dDevice = gd3dDevice; pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE); pd3dDevice->SetTexture( 0, mCylTex ); pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE); pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) ); pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX ); //HR(pd3dDevice->SetIndices(g_pIB)); //设置格式 pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, x_step*y_step*2); pd3dDevice->SetTexture(0,NULL);}