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

Next.js项目GLSL Shader加载报错:snoise3无匹配重载函数

Next.js + @react-three/fiber 加载GLSL snoise3报错的解决办法

问题根源

你遇到的报错是因为Webpack没正确处理glslify的编译指令和模块导入,加上next/font的Babel配置冲突,导致snoise3函数无法被识别。


方法1:手动引入snoise3代码(最稳妥,无配置冲突)

不用依赖glslify的编译,直接把snoise3的GLSL代码拿到自己项目里:

  1. 把snoise3的原始代码存到src/shaders/utils/snoise3.glsl(代码可从glsl-noise的simplex/3d模块复制)
  2. 在你的着色器文件开头用#include引入:
#include "./utils/snoise3.glsl"

void main() {
  float noise = snoise3(vec3(position.x, position.y, position.z));
  // 你的着色器逻辑
}
  1. 在next.config.js中添加raw-loader规则,支持加载GLSL文件:
/** @type {import('next').NextConfig} */
const nextConfig = {
  webpack: (config) => {
    config.module.rules.push({
      test: /\.(glsl|vs|fs|vert|frag)$/,
      exclude: /node_modules/,
      use: ['raw-loader']
    })
    return config
  },
  // 保留你原有的next/font配置
  experimental: {
    fontLoaders: [
      { loader: '@next/font/google', options: { subsets: ['latin'] } }
    ]
  }
}

module.exports = nextConfig
  1. 组件里导入着色器时加?raw后缀:
import vertexShader from '../shaders/vertex.glsl?raw'
import fragmentShader from '../shaders/fragment.glsl?raw'

function MyMesh() {
  return (
    <mesh>
      <sphereGeometry />
      <shaderMaterial vertexShader={vertexShader} fragmentShader={fragmentShader} />
    </mesh>
  )
}

方法2:修复ify-loader的配置(适配Next.js)

调整Webpack配置,让ify-loader正确处理glslify,同时避开next/font的Babel冲突:

const nextConfig = {
  webpack: (config) => {
    // 添加GLSL文件处理规则
    config.module.rules.push({
      test: /\.(glsl|vs|fs|vert|frag)$/,
      use: [
        'raw-loader',
        {
          loader: 'ify-loader',
          options: { transform: 'glslify' }
        }
      ]
    })
    // 解决next/font的Babel冲突:禁止Babel处理GLSL文件
    config.module.rules.forEach(rule => {
      if (rule.oneOf) {
        rule.oneOf.forEach(oneOfRule => {
          if (oneOfRule.test?.test('.js')) {
            oneOfRule.exclude = [...(oneOfRule.exclude || []), /\.(glsl|vs|fs|vert|frag)$/]
          }
        })
      }
    })
    return config
  },
  // next/font配置保持不变
  experimental: {
    fontLoaders: [
      { loader: '@next/font/google', options: { subsets: ['latin'] } }
    ]
  }
}

module.exports = nextConfig

然后着色器里正常使用glslify指令:

#pragma glslify: snoise3 = require(glsl-noise/simplex/3d)

void main() {
  float noise = snoise3(vec3(position));
  // ...你的着色器逻辑
}

先安装依赖:npm install ify-loader glsl-noise raw-loader

方法3:使用@react-three/drei的ShaderMaterial

drei的ShaderMaterial内置了glslify处理,无需修改Webpack配置:

import { ShaderMaterial } from '@react-three/drei'

function MyMesh() {
  return (
    <mesh>
      <sphereGeometry />
      <ShaderMaterial
        vertexShader={`
          #pragma glslify: snoise3 = require(glsl-noise/simplex/3d)
          void main() {
            float noise = snoise3(vec3(position));
            gl_Position = projectionMatrix * modelViewMatrix * vec4(position + vec3(noise*0.1), 1.0);
          }
        `}
        fragmentShader={`
          void main() {
            gl_FragColor = vec4(1.0, 0.5, 0.2, 1.0);
          }
        `}
      />
    </mesh>
  )
}

安装依赖:npm install glsl-noise


验证步骤

  1. 删除node_modules和.next文件夹,重新安装依赖:npm install
  2. 重启开发服务器:npm run dev
  3. 检查控制台是否仍有报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 14:40:24