弧面为二次多项式的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);
}
... {
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);
}