You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SharpDX:修改MiniTri示例绘制纹理却显示黑色的问题求助

排查SharpDX D3D11纹理渲染全黑问题

从你遇到的SharpDX D3D11纹理渲染全黑问题来看,结合你给出的代码片段,我整理了几个最可能的排查方向,你可以逐一检查:

  • 确认纹理资源与ShaderResourceView是否正确创建
    很多时候全黑是因为纹理根本没加载成功,或者ShaderResourceView创建失败。建议你加个异常捕获,或者用调试工具验证资源状态:

    try {
        // 替换成你的纹理路径
        var texture = Texture2D.FromFile(device, "texture.png");
        var shaderResourceView = new ShaderResourceView(device, texture);
    } catch (SharpDXException ex) {
        Console.WriteLine($"纹理加载/SRV创建失败: {ex.Message}");
    }
    

    另外要确保纹理格式是D3D11支持的,比如常见的PNG、JPG都没问题,但如果是特殊格式可能需要额外处理。

  • 检查顶点数据与输入布局是否包含UV坐标
    要渲染纹理,顶点必须携带UV纹理坐标,而且顶点输入布局(InputLayout)要和HLSL着色器的输入结构完全匹配。比如你的顶点结构体应该包含UV:

    public struct TexturedVertex {
        public Vector3 Position;
        public Vector2 UV; // 必须添加这个字段
    }
    

    对应的InputLayout需要添加TEXCOORD元素:

    var inputElements = new[] {
        new InputElement("POSITION", 0, Format.R32G32B32_Float, 0, 0),
        new InputElement("TEXCOORD", 0, Format.R32G32_Float, 12, 0) // 偏移量对应Position的字节数(3*4=12)
    };
    inputLayout = new InputLayout(device, vertexShaderBytecode, inputElements);
    

    如果顶点没有UV,着色器根本没法采样纹理,最终只能输出黑色。

  • 验证HLSL着色器的纹理采样逻辑
    顶点着色器需要把UV坐标传递到像素着色器,像素着色器要正确使用采样器和纹理资源。比如:
    顶点着色器(VS):

    struct VSInput {
        float3 pos : POSITION;
        float2 uv : TEXCOORD0;
    };
    struct PSInput {
        float4 pos : SV_POSITION;
        float2 uv : TEXCOORD0;
    };
    PSInput VS(VSInput input) {
        PSInput output;
        output.pos = mul(float4(input.pos, 1.0f), WorldViewProj);
        output.uv = input.uv; // 必须传递UV到PS
        return output;
    }
    

    像素着色器(PS):

    Texture2D mainTexture : register(t0);
    SamplerState mainSampler : register(s0);
    float4 PS(PSInput input) : SV_TARGET {
        return mainTexture.Sample(mainSampler, input.uv); // 正确采样纹理
    }
    

    还要记得在渲染前把资源绑定到对应的寄存器:

    // 绑定纹理到像素着色器的t0寄存器
    context.PixelShader.SetShaderResource(0, shaderResourceView);
    // 绑定采样器到像素着色器的s0寄存器
    context.PixelShader.SetSampler(0, sampler);
    
  • 补全采样器状态的缺失参数
    你给出的SamplerStateDescription代码被截断了,要确保参数完整,比如MaximumLod、MinimumLod等关键参数要正确设置,否则采样器可能无法正常工作:

    sampler = new SamplerState(device, new SamplerStateDescription() {
        Filter = Filter.MinMagMipLinear,
        AddressU = TextureAddressMode.Clamp,
        AddressV = TextureAddressMode.Clamp,
        AddressW = TextureAddressMode.Clamp,
        BorderColor = SharpDX.Color.Black,
        ComparisonFunction = Comparison.Never,
        MaximumAnisotropy = 16,
        MinimumLod = 0.0f,
        MaximumLod = float.MaxValue,
        MipLodBias = 0.0f
    });
    
  • 开启D3D11调试层抓错误
    强烈建议你开启D3D11的调试层,它会输出详细的错误信息,比如资源绑定错误、着色器编译错误等。创建Device时加上调试标志:

    var deviceFlags = DeviceCreationFlags.Debug;
    using (var device = new Device(DriverType.Hardware, deviceFlags)) {
        // 你的设备初始化逻辑
    }
    

    然后查看Visual Studio的输出窗口,里面会有D3D11调试层给出的具体问题提示,这往往是最快定位问题的方法。

内容的提问来源于stack exchange,提问作者jdm555

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:21:02