Shader报错求助:当前着色器用varying变量但前序未写入
问题:着色器报错“前序着色器未对varying变量写入”
当前着色器使用varying _I;DATA;g_mapCoord,但前序着色器未对其写入
当前着色器使用varying _I;DATA;worldPosition,但前序着色器未对其写入
报错原因分析
你的着色器管线数据流存在两处关键不匹配,导致Fragment着色器无法获取到期望的变量:
worldPosition变量传递完全断裂
顶点着色器输出了DATA结构体中的worldPosition,但曲面细分控制着色器(TCS)仅接收并传递了v_mapCoord,完全未处理worldPosition;后续的曲面细分求值着色器(TES)、几何着色器(Geom)也没有接力传递该变量。最终Fragment着色器试图从DATA结构体读取worldPosition时,没有任何前序着色器提供该值,触发报错。g_mapCoord的传递格式不匹配
Fragment着色器期望通过DATA结构体接收g_mapCoord,但几何着色器(Geom)输出的是单独的g_mapCoord变量,而非包含它的DATA结构体。这种结构体与独立变量的格式不匹配,导致Fragment着色器判定前序未写入DATA结构体中的g_mapCoord,从而报错。
修复方案
针对worldPosition的修复(如果Fragment确实需要该变量)
需要在整个管线中接力传递该变量:
- 在TCS中添加输出变量:
out vec3 tc_worldPosition[];,并在main函数中写入:tc_worldPosition[gl_InvocationID] = In[gl_InvocationID].worldPosition; - 在TES中添加输入和输出变量:
in vec3 tc_worldPosition[];、out vec3 te_worldPosition;,并通过tessellation坐标插值计算(参考mapCoord的插值逻辑) - 在Geom中添加输入和输出变量:
in vec3 te_worldPosition[];、out vec3 g_worldPosition;,在循环中写入:g_worldPosition = te_worldPosition[i];
针对g_mapCoord的修复
统一变量传递格式,二选一:
方案一:让Geom输出
DATA结构体// Geom着色器修改 out DATA { vec2 g_mapCoord; vec3 worldPosition; // 如果需要传递worldPosition则添加 } Out; // 在循环中赋值 Out.g_mapCoord = te_mapCoord[i];保持与Fragment的
in DATA结构体输入格式一致。方案二:修改Fragment为接收独立变量
// Fragment着色器修改 in vec2 g_mapCoord; in vec3 worldPosition; // 如果后续传递了该变量则添加与Geom的输出格式保持一致。
内容的提问来源于stack exchange,提问作者Artrm Kovalchuk
相关产品推荐
相关产品推荐

