OpenGL着色器GLSL怎么写

轻敏同学_6276

轻敏同学_6276

2026-10-28

344人浏览

原创

能跑的GLSL着色器核心三点:版本声明匹配上下文(如WebGL1用#version 100)、in/out变量名与类型严格配对、gl_Position和gl_FragColor(或modern版out vec4 frag_color)必须存在且赋值;纹理坐标需顶点着色器读入attribute再out传递,片段着色器in接收并texture采样,注意精度声明和Y轴翻转。

opengl着色器glsl怎么写

直接写能跑的 GLSL 着色器,核心就三点:版本声明必须对、输入输出语义要配对、gl_Position 和 gl_FragColor(或现代版 frag_color)不能漏。其他全是围绕这三点展开的细节。

顶点着色器里怎么传纹理坐标给片段着色器

顶点着色器负责把纹理坐标从 attribute 读进来,再通过 out 变量传出去;片段着色器用 in 接收,中间经过光栅化插值。常见错误是类型不一致或变量名没对上。

  • out 变量在顶点着色器中必须显式声明,比如 out vec2 vTexCoord;
  • 对应片段着色器里得写 in vec2 vTexCoord;,名字和类型必须完全一致
  • WebGL 或 OpenGL 3.3+ 中,attribute 和 varying 已废弃,只用 in/out 配对
  • 纹理坐标的 Y 轴常需翻转:vTexCoord = vec2(aTexCoord.x, 1.0 - aTexCoord.y);,否则贴图上下颠倒

片段着色器里怎么正确采样纹理

采样前要确保 sampler2D uniform 已绑定、纹理单元已激活、texture 函数参数类型匹配。最容易被忽略的是精度声明和采样坐标范围。

  • 必须加精度限定符,WebGL 必须写 precision mediump float;,否则编译失败
  • uniform sampler2D uTexture; 声明后,在 JS 中要用 gl.uniform1i(gl.getUniformLocation(prog, "uTexture"), 0); 指定纹理单元
  • texture(uTexture, vTexCoord) 的第二个参数必须是 vec2,传 vec3 或标量会报错
  • 如果 vTexCoord 超出 [0,1] 范围且没设好 wrap mode,可能显示黑块或重复拉伸

#version 写多少才不会报错

不是越高越好,必须和你的 OpenGL / WebGL 上下文版本严格匹配。错配会导致编译器直接拒绝,连错误详情都不给。

Soundful
Soundful

Soundful是一款通过曲风模板快速生成原创免版税音乐的 AI 音乐平台。

下载
  • WebGL 1 对应 #version 100(ES 版本),用 attribute/varying,无 layout
  • WebGL 2 或 OpenGL 3.3+ 推荐 #version 330 core,用 in/out,支持 layout(location = N)
  • OpenGL 4.6 开发可选 #version 460 core,但驱动支持度参差,调试工具如 RenderDoc 对它更友好
  • 写了 #version 460 却用 OpenGL 4.5 上下文创建 context,着色器根本不会编译——不是警告,是静默失败

为什么 gl_FragColor 改成 frag_color 就不亮了

这是 GLSL 版本升级带来的输出变量变更。旧版隐式提供 gl_FragColor,新版要求你显式声明 out 变量并赋值,否则 GPU 不知道往哪写颜色。

  • #version 100 或 120:直接写 gl_FragColor = vec4(1.0);
  • #version 330 及以上:必须声明 out vec4 frag_color;,然后写 frag_color = vec4(1.0);
  • 漏掉 out 声明、拼错变量名、或忘记赋值,都会导致黑屏——没有默认输出,GPU 不会猜
  • 多个输出(如 MRT)时,layout(location = 0) 等修饰符必须明确,否则顺序不确定

真正卡住人的往往不是语法本身,而是上下文版本、API 绑定顺序、精度声明这三者之间的隐性耦合。写完着色器别急着调逻辑,先确认 gl.getShaderInfoLog 和 gl.getProgramInfoLog 有没有隐藏的编译/链接失败信息——很多“不生效”其实是停在了第一步。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

20

16

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

2026.10.28

20

15

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

2026.10.28

0

10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

120

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

60

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

60

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

40

10

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

2026.10.22

60

25

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

2026.10.22

20

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习