当前位置: 首页 > news >正文

【研发类-游戏开发Skills】shader-programming-glsl 技能

编写高效GLSL着色器(顶点/片段)的专家指南,适用于Web和游戏引擎,涵盖语法、uniforms和常见效果。

技能概述

下载地址:antigravity-awesome-skills/skills/shader-programming-glsl at main · sickn33/antigravity-awesome-skills · GitHub

shader-programming-glsl 技能是一个全面的GPU着色器编写指南,使用GLSL(OpenGL着色语言)。学习语法、uniforms、varying变量以及Swizzling和向量运算等关键数学概念,用于创建视觉效果。

主要功能

  • 顶点着色器开发:教授如何将3D坐标转换为2D屏幕空间(gl_Position)
  • 片段着色器开发:指导如何为单个像素着色(gl_FragColor)
  • Uniforms和Varyings:深入讲解uniform和varying变量的使用
  • Swizzling和向量运算:教授向量组件的自由访问和重排序
  • 视觉效果实现:提供常见视觉效果的实现方法
  • 性能优化:分享着色器性能优化的最佳实践

触发条件

在以下情况下应该调用此技能:

  • 在WebGL、Three.js或游戏引擎中创建自定义视觉效果
  • 优化图形渲染性能
  • 实现后处理效果(模糊、泛光、颜色校正)
  • 在GPU上程序化生成纹理或几何体

核心概念

1. 结构:顶点 vs 片段

理解渲染管线:

  • 顶点着色器:将3D坐标转换为2D屏幕空间(gl_Position)
  • 片段着色器:为单个像素着色(gl_FragColor)

顶点着色器(基础)

// Vertex Shader (basic)
attribute vec3 position;
uniform mat4 modelViewMatrix;
uniform mat4 projectionMatrix;

void main() {
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}

片段着色器(基础)

// Fragment Shader (basic)
uniform vec3 color;

void main() {
gl_FragColor = vec4(color, 1.0);
}

2. Uniforms和Varyings

  • uniform:对所有顶点/片段不变的数据(从CPU传递)
  • varying:从顶点着色器插值到片段着色器的数据

传递UV坐标

// Passing UV coordinates
varying vec2 vUv;

// In Vertex Shader
void main() {
vUv = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}

// In Fragment Shader
void main() {
// Gradient based on UV
gl_FragColor = vec4(vUv.x, vUv.y, 1.0, 1.0);
}

3. Swizzling和向量运算

自由访问向量组件:vec4 color = vec4(1.0, 0.5, 0.0, 1.0);

  • color.rgbvec3(1.0, 0.5, 0.0)
  • color.zyxvec3(0.0, 0.5, 1.0)(重排序)

使用示例

示例:简单光线步进(SDF球体)

float sdSphere(vec3 p, float s) {
return length(p) - s;
}

void mainImage(out vec4 fragColor, in vec2 fragCoord) {
vec2 uv = (fragCoord - 0.5 * iResolution.xy) / iResolution.y;
vec3 ro = vec3(0.0, 0.0, -3.0); // Ray Origin
vec3 rd = normalize(vec3(uv, 1.0)); // Ray Direction

float t = 0.0;
for(int i = 0; i < 64; i++) {
vec3 p = ro + rd * t;
float d = sdSphere(p, 1.0); // Sphere radius 1.0
if(d < 0.001) break;
t += d;
}

vec3 col = vec3(0.0);
if(t < 10.0) {
vec3 p = ro + rd * t;
vec3 normal = normalize(p);
col = normal * 0.5 + 0.5; // Color by normal
}

fragColor = vec4(col, 1.0);
}

最佳实践

  • 推荐:使用mix()进行线性插值,而不是手动计算
  • 推荐:使用step()smoothstep()进行阈值处理和软边缘(避免if分支)
  • 推荐:将数据打包到向量(vec4)中以最小化内存访问
  • 不推荐:在循环内使用重分支(if-else),这会损害GPU并行性
  • 不推荐:在着色器内计算常量值;在CPU上预先计算它们(uniforms)

故障排除

问题:着色器编译但屏幕是黑色的

解决方案:

  • 检查gl_Position.w是否正确(通常为1.0)
  • 检查uniforms是否实际从宿主应用程序设置
  • 验证UV坐标在[0, 1]范围内

限制说明

  • 仅在任务明确匹配上述范围时使用此技能
  • 不要将输出作为环境特定验证、测试或专家审查的替代品
  • 如果缺少所需的输入、权限、安全边界或成功标准,请停止并请求澄清
http://www.jsqmd.com/news/1221042/

相关文章:

  • 十万点不崩:ECharts 大数据量渲染的降采样与增量更新策略
  • MPI-IS Mesh社区贡献指南:如何参与开源网格处理项目
  • 亲身到店探访上海帝舵官方售后服务中心|完整官方电话和网点地址(2026年7月最新) - 帝舵中国官方服务中心
  • 郑州小户型局部改造:2026实测评测空间改造能力超强 - 优企甄选
  • UVa 10343 Base64 Decoding
  • macm1使用docker部署opencode arm
  • 「ECG信号处理——(32)面向可穿戴设备的ECG运动伪影去除算法对比研究」2026年05月25日
  • LongCat-2.0-FP8在企业级应用中的实践:美团AI技术栈解析
  • 构建企业级配置系统:node-jsonc-parser在微服务架构中的应用
  • 2026武汉钻石回收价格行情指南 正规渠道无隐形扣费实测推荐 - 奢侈品回收机构参考
  • Windows Terminal Quake 支持哪些系统?跨平台兼容性详解
  • GraphRAG真能提效吗?先看流程里最慢的那一步
  • M-EMACS编程环境配置指南:支持Python、C++、Rust、Go等20+编程语言
  • 别让用户干等:流式对话的中断、重试与多会话并发管理
  • 第4天:数据到底存在哪里?——理解内存的本质
  • Slug未来路线图:URL短链服务的演进方向和技术趋势
  • 2026年7月最新劳力士济南万达广场(章丘店)维修保养服务电话 - 劳力士官方服务中心
  • 壶关县室内空气检测公司哪家靠谱?横向对比多家机构,甲醛检测治理专业度深度评测 - 专注室内空气检测治理
  • 开源项目第163期:wigolo — 零 API Key、零费用的本地优先 Agent 网络搜索工具,对比 Tavily/Exa/Firecrawl
  • ScrollScreenshot安装与配置:从零开始搭建Android滚动截图环境
  • Traquer社区精选:用户分享的3个创意应用场景
  • WAIC2026:一键拍出文物“证件照”,扫描全能王AI去反光“看清”千年古画
  • 067、3A联动与协同控制:曝光、对焦、白平衡的闭环优化
  • 如何永久保存微信聊天记录:WeChatMsg让你的数字记忆不再消失
  • Devstral-Small-2-24B-Instruct-2512-5bit核心功能解析:图像描述、视觉问答、多模态对话
  • 数据压缩原理与应用 | 实验五 | 基于DCT量化的音频编解码
  • 提升SEO排名:gulp-htmlmin助力网站性能优化的终极方案
  • 2026 国内高端网站建设公司靠谱推荐,13家高端网站设计公司综合排名(大型建站大厂 + 独立设计工作室),专注品牌官网、企业站定制开发的知名高端建站企业完整盘点 - 产业观察报
  • 港口AI预警系统(散货监控+跨境跟踪+一屏全域管控)
  • 2026丽水大冰块优选推荐榜单:哪家配送更靠谱? - 热点咨讯