C++ 立方体贴图纹理问题(D3D11,C+;+;)

C++ 立方体贴图纹理问题(D3D11,C+;+;),c++,directx,textures,C++,Directx,Textures,我渲染的立方体贴图有纹理问题,似乎无法解决。我用direct x的纹理工具生成了一个立方体贴图,然后用 D3DX11CreateShaderResourceViewFromFile(device, L"cubemap.dds", 0, 0, &fullcubemap, 0); 立方体贴图纹理的质量一点也不高,看起来确实拉伸/扭曲了。我可以肯定地说,用于立方体贴图的图像匹配正确,但目前一点也不好 我不知道为什么会这样。是因为我的纹理太大/太小还是其他原因?如果是由于纹理的大小,建议的纹

我渲染的立方体贴图有纹理问题,似乎无法解决。我用direct x的纹理工具生成了一个立方体贴图,然后用

D3DX11CreateShaderResourceViewFromFile(device, L"cubemap.dds", 0, 0, &fullcubemap, 0);
立方体贴图纹理的质量一点也不高,看起来确实拉伸/扭曲了。我可以肯定地说,用于立方体贴图的图像匹配正确,但目前一点也不好

我不知道为什么会这样。是因为我的纹理太大/太小还是其他原因?如果是由于纹理的大小,建议的纹理大小是多少?我用的是球体而不是立方体

编辑:

着色器:

cbuffer SkyboxConstantBuffer {
    float4x4 world;
    float4x4 view;
    float4x4 projection;
};

TextureCube gCubeMap;

SamplerState samTriLinearSam {
    Filter = MIN_MAG_MIP_LINEAR;
    AddressU = Wrap;
    AddressV = Wrap;
};

struct VertexIn {
    float4 position : POSITION;
};

struct VertexOut {
    float4 position : SV_POSITION;
    float4 spherePosition : POSITION;
};

VertexOut VS(VertexIn vin) {
    VertexOut vout = (VertexOut)0;

    vin.position.w = 1.0f;

    vout.position = mul(vin.position, world);
    vout.position = mul(vout.position, view);
    vout.position = mul(vout.position, projection);

    vout.spherePosition = vin.position;

    return vout;
}

float4 PS(VertexOut pin) : SV_Target {
    return gCubeMap.Sample(samTriLinearSam, pin.spherePosition);//float4(1.0, 0.5, 0.5, 1.0);
}

RasterizerState NoCull {
    CullMode = None;
};

DepthStencilState LessEqualDSS {
    DepthFunc = LESS_EQUAL;
};

technique11 SkyTech {
    pass p0 {
        SetVertexShader(CompileShader(vs_4_0, VS()));
        SetGeometryShader(NULL);
        SetPixelShader(CompileShader(ps_4_0, PS()));

        SetRasterizerState(NoCull);
        SetDepthStencilState(LessEqualDSS, 0);
    }
}
抽签:

最初,我计划使用此代码段更新着色器中的TextureCube变量

ID3DX11EffectShaderResourceVariable * cMap;
cMap = skyboxShader->GetVariableByName("gCubeMap")->AsShaderResource();
cMap->SetResource(fullcubemap);
但这似乎没有任何效果,事实上,如果没有下面这条线,我正在使用的立方体贴图纹理的球体与场景中另一个对象的纹理一起使用,那么这里可能发生了什么?但我不知道会发生什么

immediateContext->PSSetShaderResources(0, 1, &fullcubemap);//textures
编辑:可能不是上面提到的,意识到如果不更新,就会应用旧纹理,因为每次绘制后都不会擦除

编辑:尝试使用球体和立方体绘制立方体贴图,但仍然存在相同的纹理问题

编辑:尝试以不同方式加载着色器资源视图

D3DX11_IMAGE_LOAD_INFO loadSMInfo;
loadSMInfo.MiscFlags = D3D11_RESOURCE_MISC_TEXTURECUBE;

ID3D11Texture2D* SMTexture = 0;
hr = D3DX11CreateTextureFromFile(device, L"cubemap.dds",
    &loadSMInfo, 0, (ID3D11Resource**)&SMTexture, 0);

D3D11_TEXTURE2D_DESC SMTextureDesc;
SMTexture->GetDesc(&SMTextureDesc);

D3D11_SHADER_RESOURCE_VIEW_DESC SMViewDesc;
SMViewDesc.Format = SMTextureDesc.Format;
SMViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
SMViewDesc.TextureCube.MipLevels = SMTextureDesc.MipLevels;
SMViewDesc.TextureCube.MostDetailedMip = 0;

hr = device->CreateShaderResourceView(SMTexture, &SMViewDesc, &fullcubemap);
仍然产生相同的输出,有什么想法吗

编辑:尝试增加zfar距离,无论我输入什么值,纹理都保持完全相同

第二个纹理的示例,视图距离增加。

该纹理用于我场景中的另一个对象,效果很好

编辑:我一直试图弄乱纹理/对象的缩放

为了实现这一点,我使用了 vin位置=vin位置*50.0f

这开始看起来有点像它应该是什么样子,然而,当我转动相机角度时,图像消失了,所以我显然知道这是不正确的,但是如果我能正确地按像素或顶点缩放图像,我相信我能得到最终结果

编辑:

我可以确认立方体贴图的渲染是正确的,我忽略了视图/投影空间,只是使用了world并设法得到了这个,这是我想要的高质量图像,只是不正确。是的,这些面是不正确的,但我现在不担心这一点,交换它们很容易,我只需要在正确的空间中以这种质量进行渲染


当在摄影机空间中时,是否考虑它是否在球体的外部/内部?如果我的纹理在球体的外部,并且我从内部看到了视图,它看起来就不一样了?

问题在于你的纹理大小,它很小,你要在更大的表面上应用它,用更多的像素制作更大的纹理


它确认zfar和缩放与此无关

终于发现了问题,愚蠢的错误

scb.world = XMMatrixTranspose(sworld);
scb.view = XMMatrixTranspose(sview);
scb.projection = XMMatrixTranspose(sprojection);

您是否尝试在
Sample()
调用中使用
pin.spherePosition.xyz
,因为它要求位置为
float3
?@NicoSchertler是的,我尝试过,仍然产生相同的结果,或者非常相似。我想到了两个快速猜测:您没有使用
D3DX11\u IMAGE\u LOAD\u INFO loadsInfo
D3DX11\u DEFAULT
初始化所有未使用的成员,这可能会导致加载多维数据集地图时出错。或者这可能是一个mipmapping问题,并且使用了最粗糙的mipmap,您可以尝试使用SampleLevel和LOD=0对其进行测试,并将
SMViewDesc
设置为null,以获取视图的整个资源。@Gnietschow感谢您的回复。两者都不起作用。我不知道发生了什么事。纹理的分辨率相当高,生成的立方体贴图不使用mipmap,因此应该可以正常工作。我已经用正确渲染的立方体贴图更新了我的帖子,只有在放入视图/投影空间时才会出现问题。我不确定是否有问题,我已经尝试了不同大小的多个纹理,它们看起来都是一样的。如果你看我文章中的第二幅图像,纹理实际上是从我场景中的另一个对象中提取的,它渲染得非常好。只有当应用于立方体贴图时,它才会扭曲。谢谢你的回复!
scb.world = XMMatrixTranspose(sworld);
scb.view = XMMatrixTranspose(sview);
scb.projection = XMMatrixTranspose(sprojection);