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

Shader报错求助:当前着色器用varying变量但前序未写入

问题:着色器报错“前序着色器未对varying变量写入”

当前着色器使用varying _I;DATA;g_mapCoord,但前序着色器未对其写入
当前着色器使用varying _I;DATA;worldPosition,但前序着色器未对其写入

报错原因分析

你的着色器管线数据流存在两处关键不匹配,导致Fragment着色器无法获取到期望的变量:

  1. worldPosition变量传递完全断裂
    顶点着色器输出了DATA结构体中的worldPosition,但曲面细分控制着色器(TCS)仅接收并传递了v_mapCoord,完全未处理worldPosition;后续的曲面细分求值着色器(TES)、几何着色器(Geom)也没有接力传递该变量。最终Fragment着色器试图从DATA结构体读取worldPosition时,没有任何前序着色器提供该值,触发报错。

  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:55:22