我试图创建一个片段着色器,可以在某些材质属性是颜色类型或纹理的情况下使用。但我遇到了很大的问题。 假设我有一个像这样的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处缺少纹理绑定我不确定我做错了什么。我没有绑定因为没有纹理。
提前致谢
答案 0 :(得分:1)
即使您未在函数中使用它,每个纹理,缓冲区或采样器参数也必须在参数表中绑定相应的对象。在您的情况下,您可以绑定&#34;虚拟&#34;,1x1纹理以满足此要求,或者您可以有两个着色器变体(因此有两个渲染管道状态),一个使用漫反射颜色,另一个使用样本漫反射纹理。