金属碎片着色器中的测试属性

时间:2016-07-12 15:12:26

标签: metal

我试图创建一个片段着色器,可以在某些材质属性是颜色类型或纹理的情况下使用。但我遇到了很大的问题。 假设我有一个像这样的Material结构:

typedef struct {  
    vector_float4 diffuseColor;  
    bool useDiffuseTexture;  
} Material; 

和片段功能:

fragment float4 fragment_main(Vertex vert [[stage_in]],  
                              constant Constants &uniforms [[buffer(0)]],  
                              constant Material &material [[buffer(1)]],  
                              texture2d<float> diffuseTexture [[texture(0)]],  
                              sampler          diffuseTextureSampler [[sampler(0)]]  
                              )  
{...}

在片段主体中,我要么:

float4 diffuseColor = material.diffuseColor;

或者材质是否具有漫反射纹理:

float4 diffuseColor = diffuseTexture.sample(diffuseTextureSampler, float2(vert.textcoords));  

问题是我无法真正测试着色器中是否存在纹理,所以我认为我会将它作为param传递给结构体:

bool useDiffuseTexture;

但出于某种原因这段代码:

float4 diffuseColor = material.diffuseColor;  
if (material.useDiffuseTexture == true ) {  
        diffuseColor = diffuseTexture.sample(diffuseTextureSampler, float2(vert.textcoords));  
}

始终调用 diffuseTexture 并引发错误:

在diffuseTexture [0]

的索引0处缺少纹理绑定

我不确定我做错了什么。我没有绑定因为没有纹理。

提前致谢

1 个答案:

答案 0 :(得分:1)

即使您未在函数中使用它,每个纹理,缓冲区或采样器参数也必须在参数表中绑定相应的对象。在您的情况下,您可以绑定&#34;虚拟&#34;,1x1纹理以满足此要求,或者您可以有两个着色器变体(因此有两个渲染管道状态),一个使用漫反射颜色,另一个使用样本漫反射纹理。