D3D9 CubeMap 贴图

D3D9 CubeMap texture

我正在制作纹理立方体贴图,图像在所有 6 个面都输出。如何在 6 面上打印分割图像?我正在寻找可以学习 directX 的网站。有没有可以推荐的网站?

这是我的代码。 [=1ṁ=]

struct CUBEVERTEX
{
    float x, y, z;
    float tu, tv;
};
void SkyBox::onInit(float scale)
{
    CUBEVERTEX vertice[] =
    {
   {-1.0f,  1.0f, -1.0f,   0.0f, 0.0f },
   { 1.0f,  1.0f, -1.0f,   1.0f, 0.0f },
   { 1.0f, -1.0f, -1.0f,   1.0f, 1.0f },
   { 1.0f, -1.0f, -1.0f,   1.0f, 1.0f },
   {-1.0f, -1.0f, -1.0f,   0.0f, 1.0f },
   {-1.0f,  1.0f, -1.0f,   0.0f, 0.0f },
                                  
   { 1.0f,  1.0f,  1.0f,   0.0f, 0.0f },
   {-1.0f,  1.0f,  1.0f,   1.0f, 0.0f },
   {-1.0f, -1.0f,  1.0f,   1.0f, 1.0f },
   {-1.0f, -1.0f,  1.0f,   1.0f, 1.0f },
   { 1.0f, -1.0f,  1.0f,   0.0f, 1.0f },
   { 1.0f,  1.0f,  1.0f,   0.0f, 0.0f },
                                  
   {-1.0f, -1.0f, -1.0f,   0.0f, 0.0f },
   { 1.0f, -1.0f, -1.0f,   1.0f, 0.0f },
   { 1.0f, -1.0f,  1.0f,   1.0f, 1.0f },
   { 1.0f, -1.0f,  1.0f,   1.0f, 1.0f },
   {-1.0f, -1.0f,  1.0f,   0.0f, 1.0f },
   {-1.0f, -1.0f, -1.0f,   0.0f, 0.0f },
                                  
   {-1.0f,  1.0f,  1.0f,   0.0f, 0.0f },
   { 1.0f,  1.0f,  1.0f,   1.0f, 0.0f },
   { 1.0f,  1.0f, -1.0f,   1.0f, 1.0f },
   { 1.0f,  1.0f, -1.0f,   1.0f, 1.0f },
   {-1.0f,  1.0f, -1.0f,   0.0f, 1.0f },
   {-1.0f,  1.0f,  1.0f,   0.0f, 0.0f },
                                  
   {-1.0f,  1.0f,  1.0f,   0.0f, 0.0f },
   {-1.0f,  1.0f, -1.0f,   1.0f, 0.0f },
   {-1.0f, -1.0f, -1.0f,   1.0f, 1.0f },
   {-1.0f, -1.0f, -1.0f,   1.0f, 1.0f },
   {-1.0f, -1.0f,  1.0f,   0.0f, 1.0f },
   {-1.0f,  1.0f,  1.0f,   0.0f, 0.0f },
                                  
   { 1.0f,  1.0f, -1.0f,   0.0f, 0.0f },
   { 1.0f,  1.0f,  1.0f,   1.0f, 0.0f },
   { 1.0f, -1.0f,  1.0f,   1.0f, 1.0f },
   { 1.0f, -1.0f,  1.0f,   1.0f, 1.0f },
   { 1.0f, -1.0f, -1.0f,   0.0f, 1.0f },
   { 1.0f,  1.0f, -1.0f,   0.0f, 0.0f }
};
m_pd3dDevice->CreateVertexBuffer(sizeof(vertice), 0, D3DFVF_CUBEVERTEX, D3DPOOL_DEFAULT, 
&m_pVB, 0);

void* pVertice;
m_pVB->Lock(0, sizeof(vertice), &pVertice, 0);
memcpy(pVertice, vertice, sizeof(vertice));
m_pVB->Unlock();
}
void SkyBox::render()
{
D3DXMATRIX matWorld;
D3DXMatrixIdentity(&matWorld);

m_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);
m_pd3dDevice->SetTexture(0, texture);

m_pd3dDevice->SetStreamSource(0, m_pVB, 0, sizeof(CUBEVERTEX));
m_pd3dDevice->SetFVF(D3DFVF_CUBEVERTEX);
m_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 12);

 }

在 Direct3D 9 中将立方体贴图直接渲染为天空盒是无法实现的,尤其是在“无着色器”要求的情况下。在 Direct3D 9 中,您需要将资源创建为立方体贴图以在环境场景中使用,然后创建六个单独的 2D 纹理以将其渲染为天空盒——这意味着在内存中有每个立方体贴图面的两个副本。

在 Direct3D 10 或更高版本中,您可以创建一个资源,然后创建两个着色器资源视图:一个作为立方体贴图,另一个资源作为 2D 纹理数组。这会在内存中产生每个立方体贴图面的一个副本。然后,您可以使用着色器 在天空盒上渲染 2D 纹理阵列的各个面。

这是一个使用 DirectX 12 Skybox that leverages the DirectX Tool Kit for DX12. Same technique will work for Direct3D 11 as long as you require Direct3D Hardware Feature Level 10.0 或更高版本的示例实现。

Unless you are specifically using Windows XP, there's no reason you should learn Direct3D 9 at this point. Direct3D 11 is the 'mainstream' graphics API you should look at. See Microsoft Docs and DirectX Tool Kit.