|
1、请问,d3d中,在一个指定的多边形上贴纹理,是一个什么原理呢?
2、我曾经搞了一个试验,建立一个ddraw页面,里面放张图。再在d3d中建立一个矩形(矩形的顶点个数和页面以及图片的大小是一样的,都是80×80),然后,把页面的内容(其实是rgb)付给3d矩形中对应的顶点的颜色。这样,折腾了半天后,最终效果是那张图显示在了矩形上面。(不过,其实具体在对每个顶点一一赋值的时候,我采取了一个很怪的做法才获得成功,函数将在下面付上。)不知道纹理贴图的原理是不是就是这样呢?
不过不管是不是这样,我又觉得奇怪了:我建立的矩形顶点分布是比较疏散的,怎么可能在每个顶点的颜色付得一个值后就组成一张图呢?(而我作这个试验原先的想法是:这样作最后得到的效果应该是一张看上去比较模糊的马赛克似的图)
这就是那个给顶点的颜色赋值的函数:
void Reflect(int x,int z){
VOID *pVertices;
lpD3DVertexBuffer->Lock(0,3321*sizeof(CUSTOMVERTEX),(BYTE**)&pVertices,0);
BYTE* ddsd=(BYTE*)ddsd_src.lpSurface;
int n=z*3240+24+162*40+x*40;
int width=81-x;
int height=79-z;
_asm{
mov eax,ddsd//指向ddraw页面的指针,页面在以前就lock了
mov ebx,pVertices//指向顶点缓存的指针
mov esi,width
mov edi,height
add eax,320*80//怪的地方就是这里!eax是一个指向了上面说的ddraw页面的指针。而这里要对这个指针(也就是eax)加上320×80,最后出来的效果才正确,否则矩形上显示出来的只是整张图的一角。可是,我是完全想不通!这个eax(指针)加上这么个数,都不知道指到哪点去了?怎么还出来了上面说的效果呢?//
add ebx,n
FirstLoop:
push ebx
push eax
push esi
SecondLoop:
mov ecx,[eax]
mov [ebx],ecx
add ebx,40
sub eax,4
dec esi
jnz SecondLoop
pop esi
pop eax
pop ebx
add eax,ddsd_src.lPitch
add ebx,81*40
dec edi
jnz FirstLoop
emms
}
lpD3DVertexBuffer->Unlock();
}
还望哪位大侠帮助小弟! |
|