gpt4 book ai didi

c++ - 将纹理放在立方体的一个表面上不起作用

转载 作者:行者123 更新时间:2023-11-30 02:07:19 25 4
gpt4 key购买 nike

我正在尝试将纹理放在立方体的一个表面上(如果面向 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);

最佳答案

免责声明:我没有 Direct3D 经验,但有扎实的 OpenGL 和一般计算机图形学经验。由于基本概念并没有真正的不同,我尝试给出一个答案,我确信其正确性为 99%。

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

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

同样使用 (0,0) 的纹理坐标不会神奇地禁用单个面的纹理。您只能绘制整个原始纹理或不绘制纹理,尽管您可能会使用纹理坐标和纹理的环绕模式(可能还有纹理边界)来使“非纹理”面使用纹理中的统一颜色,因此 < em>看起来没有纹理。

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

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

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

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

关于c++ - 将纹理放在立方体的一个表面上不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7999470/

25 4 0
文章推荐: C++ 游戏 : pthread_cond_signal doesn't wake up opponent thread
文章推荐: android - 当我在 Android 中按下操作栏菜单时如何隐藏导航栏
文章推荐: java - 将位图从相机保存到手机需要 25 秒以上
文章推荐: java - Thymeleaf 返回 String 数组而不是 List