将纹理放在多维数据集的一个表面上是行不通的

时间:2011-11-03 17:43:11

标签: c++ directx direct3d

我试图将纹理放在立方体的一个表面上(如果面向XY平面,纹理将面向你)。

没有画出纹理,只有线框,我想知道我做错了什么。我认为它是顶点坐标?

这里有一些代码:

struct paperVertex {
    D3DXVECTOR3 pos;
    DWORD color;        // The vertex color
    D3DXVECTOR2 texCoor;
    paperVertex(D3DXVECTOR3 p, DWORD c, D3DXVECTOR2 t) {pos = p; color = c; texCoor = t;}
    paperVertex() {pos = D3DXVECTOR3(0,0,0); color = 0; texCoor = D3DXVECTOR2(0,0);}
};

D3DCOLOR color1 = D3DCOLOR_XRGB(255, 255, 255);
D3DCOLOR color2 = D3DCOLOR_XRGB(200, 200, 200);
vertices[0] = paperVertex(D3DXVECTOR3(-1.0f, -1.0f, -1.0f), color1, D3DXVECTOR2(1,0));  // bottom left corner of tex
vertices[1] = paperVertex(D3DXVECTOR3(-1.0f,  1.0f, -1.0f), color1, D3DXVECTOR2(0,0));  // top left corner of tex
vertices[2] = paperVertex(D3DXVECTOR3( 1.0f,  1.0f, -1.0f), color1, D3DXVECTOR2(0,1));  // top right corner of tex
vertices[3] = paperVertex(D3DXVECTOR3(1.0f, -1.0f, -1.0f), color1, D3DXVECTOR2(1,1));   // bottom right corner of tex
vertices[4] = paperVertex(D3DXVECTOR3(-1.0f, -1.0f,  1.0f), color1, D3DXVECTOR2(0,0));
vertices[5] = paperVertex(D3DXVECTOR3(-1.0f,  1.0f,  1.0f), color2, D3DXVECTOR2(0,0));
vertices[6] = paperVertex(D3DXVECTOR3(1.0f,  1.0f,  1.0f), color2, D3DXVECTOR2(0,0));
vertices[7] = paperVertex(D3DXVECTOR3(1.0f, -1.0f,  1.0f), color1, D3DXVECTOR2(0,0));

D3DXCreateTextureFromFile( md3dDev, "texture.bmp", &gTexture);
md3dDev->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
md3dDev->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);

md3dDev->SetTexture(0, gTexture);
md3dDev->SetStreamSource(0, mVtxBuf, 0, sizeof(paperVertex));
md3dDev->SetVertexDeclaration(paperDecl);
md3dDev->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME);
md3dDev->SetIndices(mIndBuf);
md3dDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, VTX_NUM, 0, NUM_TRIANGLES);

1 个答案:

答案 0 :(得分:4)

免责声明:我没有Direct3D经验,但具有扎实的OpenGL和一般的计算机图形体验。由于基本概念并没有真正区别,我尝试了一个答案,其正确性我99%肯定。

您在渲染之前立即调用md3dDev->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME),并想知道为什么只绘制线框?

请记住,使用纹理并不能将线框模型神奇地转变为实体模型。它仍然是线框模型,纹理仅应用于线框。您只能将整个原始图形绘制为线框。

同样地,使用(0,0)的纹理坐标不会神奇地禁用单个面的纹理。您只能绘制整个原始纹理或不纹理,但您可以使用纹理坐标和纹理的包装模式(可能还有纹理边框)来使“非纹理”面使用纹理中的均匀颜色,从而< em>看起来就像没有纹理。

但一般来说,要在单个图元中实现这种偏离的渲染样式(如纹理/非纹理,尤其是线框/实体),您将无法将图元分割为多个图形并使用其专用图形绘制每个图元。渲染风格。

编辑:根据您的评论:如果您不需要线框,为什么要启用呢?除了禁用线框,使用当前纹理坐标,其他面不仅仅具有纹理中的单一颜色,而是纹理的一些奇怪的扭曲版本。这是因为您的顶点(及其纹理坐标)在不同的面之间共享,但此时的纹理坐标仅为正面创建,看起来合理。

在这种情况下,您不会绕过复制顶点,因此每个面使用一组4个唯一顶点。在立方体的情况下,您实际上不再需要索引数组,因为每个面都需要自己的顶点。这是因为顶点在概念上代表了所有顶点的属性(位置,颜色,texCoord,...),你不能有两个顶点共享一个位置但具有不同的纹理坐标(你可以,但你需要)两个不同的顶点)。一旦你相应地复制了顶点,你可以给每个角顶点各自的纹理坐标(如果你想要它们正常纹理,那将是通常的[0,1] -quad,或者如果你想要它们的话,那么全部为0)一种颜色,在这种情况下是纹理的左下角(或D3D左上角?)的颜色。

如果您想要点亮立方体并且需要每个面的法线,而不是内插的每顶点法线,则会出现同样的问题。在这种情况下,您还必须引入仅在其正常属性中偏离的重复顶点。始终要记住,顶点在概念上由所有顶点属性组成,如果两个顶点具有相同的位置但颜色不同/法线/ texCoord / ......它们在概念上(实际上)是不同的顶点。