【问题标题】:D3D9 CubeMap textureD3D9 CubeMap 纹理
【发布时间】:2021-06-30 14:45:22
【问题描述】:

我正在制作一个纹理立方体贴图,图像在所有 6 个面上输出。如何在 6 面上打印分割图像?我想在不使用着色器的情况下制作它,我想知道一个我可以学习 directX 的网站 有没有可以推荐的网站?

这是我的代码。 ㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ

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);

 }

【问题讨论】:

    标签: c++ directx-9


    【解决方案1】:

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

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

    这是一个使用 DirectX 12 Skybox 的示例实现,它利用了 DirectX Tool Kit for DX12。只要您需要Direct3D Hardware Feature Level 10.0 或更高版本,同样的技术也适用于 Direct3D 11。

    除非您专门使用 Windows XP,否则此时您没有理由学习 Direct3D 9。 Direct3D 11 是您应该关注的“主流”图形 API。请参阅Microsoft DocsDirectX Tool Kit

    【讨论】:

    • 嗯,难道没有库隐藏不同directX版本、OpenGL等之间的差异吗?可能更喜欢使用这些来获得更多可移植代码......只需看一下duckduckgo就可以看到this,所以这个想法至少似乎与外太空无关;)
    • 当然有很多库、游戏引擎等抽象了图形API之间的区别。您仍然受制于底层图形 API、驱动程序和显卡的功能。能够将相同的图形资源同时作为立方体贴图和 2D 纹理阵列处理并不是 Direct3D 9 时代驱动程序的特性。 DirectX 11 和现代 OpenGL 可以做到,当然 DirectX 12 和 Vulkan 也可以。根据设计,DirectX Tool Kit 不会显着抽象差异,因为它旨在帮助教授 DirectX 的底层版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多