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

OSG新版GLSL语法全解析

“OSG 新版语法”其实不是 OSG(OpenSceneGraph)本身的语法变化,而是 OSG 使用的 OpenGL GLSL(OpenGL Shading Language) 的更新与封装方式变化。
OSG 只是调用 OpenGL shader 功能(即 GLSL),所以“新版语法”其实是指 GLSL 3.30+ 或 4.x 的规范,而不是 OSG 自定义语法。

下面我帮你系统总结:


🧩 一、GLSL 在 OSG 中的使用结构

OSG 使用 osg::Shaderosg::Program 管理 GLSL 代码:

osg::ref_ptr<osg::Program> program = new osg::Program;
program->addShader(osg::Shader::readShaderFile(osg::Shader::VERTEX, "shader.vert"));
program->addShader(osg::Shader::readShaderFile(osg::Shader::FRAGMENT, "shader.frag"));osg::StateSet* ss = geode->getOrCreateStateSet();
ss->setAttributeAndModes(program, osg::StateAttribute::ON);
ss->addUniform(new osg::Uniform("myColor", osg::Vec3(1.0f, 0.0f, 0.0f)));

🧠 二、GLSL 新版语法(以 #version 330 core 为例)

GLSL 3.30 之后有明显语法更新,与旧版(1.20、1.30)不同:

功能旧版写法新版写法(推荐)
顶点输入attribute vec3 position;layout(location = 0) in vec3 aPos;
顶点输出 / 片元输入varying vec2 texCoord;out vec2 fragTexCoord;(在顶点) / in vec2 fragTexCoord;(在片元)
uniform 声明uniform mat4 modelViewProj;同旧版,但更严格类型检查
颜色输出gl_FragColor = vec4(1.0);layout(location=0) out vec4 FragColor;
纹理采样texture2D(sampler, uv)texture(sampler, uv)
矩阵乘法gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;自定义 uniform: uniform mat4 MVP; gl_Position = MVP * vec4(aPos,1.0);
光照等固定管线变量旧版使用 gl_Normal, gl_Color新版完全废弃,由用户自己传入

⚙️ 三、OSG 与 GLSL 的常见内置变量和 Uniform

新版 OSG 不再自动传递固定管线变量(如 gl_ModelViewMatrix),但你可以在 C++ 层手动设置。

下面是一些 OSG 常见自动或自定义传递的 uniform 名称与用途:

变量名类型来源 / 含义
osg_ModelViewMatrixmat4模型视图矩阵
osg_ProjectionMatrixmat4投影矩阵
osg_ModelViewProjectionMatrixmat4模型视图投影矩阵
osg_NormalMatrixmat3法线矩阵(视图空间下的法线变换)
osg_ViewMatrixmat4摄像机视图矩阵
osg_Viewportvec4当前视口
osg_FrameTimefloat当前帧时间(如果启用)
osg_DeltaFrameTimefloat帧间时间差
osg_FrameNumberint帧编号
osg_SimulationTimefloat模拟时间

这些变量在启用 osg::StateSetsetUseShaderDefines(true) 或绑定了相机的状态集时可以自动注入。


🧩 四、顶点/片元着色器常见模板

✅ 顶点着色器

#version 330 corelayout(location = 0) in vec3 aPos;      // 顶点位置
layout(location = 1) in vec3 aNormal;   // 顶点法线
layout(location = 2) in vec2 aTexCoord; // 纹理坐标out vec2 fragTexCoord; // 传递给片元着色器uniform mat4 osg_ModelViewProjectionMatrix;void main()
{gl_Position = osg_ModelViewProjectionMatrix * vec4(aPos, 1.0);fragTexCoord = aTexCoord;
}

✅ 片元着色器

#version 330 corein vec2 fragTexCoord;
out vec4 FragColor;uniform sampler2D diffuseMap;void main()
{vec3 color = texture(diffuseMap, fragTexCoord).rgb;FragColor = vec4(color, 1.0);
}

🧱 五、OSG 常用 Uniform 类型对应关系(C++ → GLSL)

OSG C++ Uniform 类型GLSL 对应类型示例
osg::Uniform::FLOATfloatuniform float time;
osg::Uniform::FLOAT_VEC2vec2uniform vec2 offset;
osg::Uniform::FLOAT_VEC3vec3uniform vec3 lightDir;
osg::Uniform::FLOAT_VEC4vec4uniform vec4 color;
osg::Uniform::FLOAT_MAT4mat4uniform mat4 MVP;
osg::Uniform::INTintuniform int layerIndex;
osg::Uniform::SAMPLER_2Dsampler2Duniform sampler2D tex;

🔧 六、OSG 新版 Shader 开发技巧

  1. 保持 GLSL 版本一致(顶点与片元)

  2. 使用 layout(location = x) 明确绑定输入

  3. 所有 inout 变量必须一一对应类型

  4. 用自定义 uniform 替代旧的固定管线矩阵

  5. 不要使用被弃用的变量(如 gl_Vertex, gl_Color, gl_Normal

  6. 调试时启用 OSG 的着色器日志

    osg::DisplaySettings::instance()->setShaderHint(osg::DisplaySettings::SHADER_HINT_DEBUG);
    

🧾 七、完整的现代 OSG Shader 框架

osg::ref_ptr<osg::Program> program = new osg::Program;
program->addShader(new osg::Shader(osg::Shader::VERTEX, vertexSource));
program->addShader(new osg::Shader(osg::Shader::FRAGMENT, fragmentSource));osg::ref_ptr<osg::Uniform> mvpUniform = new osg::Uniform("osg_ModelViewProjectionMatrix", osg::Matrixf());
ss->addUniform(mvpUniform);ss->setAttributeAndModes(program.get(), osg::StateAttribute::ON);

🚀 八、进一步学习建议

主题推荐版本/参考
GLSL 标准文档OpenGL 4.6 Core Profile GLSL 460 Specification
OSG Shader 示例OpenSceneGraph/examples/osgshader/
现代 OSG 教程https://github.com/openscenegraph/OpenSceneGraph/wiki/Shaders

http://www.dtcms.com/a/581764.html

相关文章:

  • 智守边界:入侵报警系统的主动防御时代
  • 为什么网站建设起来搜素不到电子商务网站建设考题
  • 济南网站建设是什么合肥seo网络营销推广
  • 【Hot100|4-LeetCode 283. 移动零 】
  • 操作系统拿着文件名查找磁盘文件的全过程
  • 【Hot100 | 6 LeetCode 15. 三数之和】
  • 哪些网站用wordpress建设银行网站总是崩溃
  • c#实现redis的调用与基础类
  • 【深度学习新浪潮】什么是投机解码?大模型推理优化的核心技术解析(含代码实操)
  • Verilog函数function
  • 做电商宠物带哪个网站最好网络营销方法的选择
  • 超融合系统七大核心技术详解
  • Spring Boot 2.7.18(最终 2.x 系列版本)1 - 技术选型:连接池技术选型对比;接口文档技术选型对比
  • 从0到1做一个“字母拼词”Unity小游戏(含源码/GIF)- 单词字母打乱及字母拼词填空逻辑
  • 记一次 Maven 3.8.3 无法下载 HTTP 仓库依赖的排查历程
  • Linux网络初始及网络通信基本原理
  • 免费学软件的自学网站微信app制作
  • Foundation 模态框
  • 赣州深科网站建设深圳商城网站设计电话
  • vllm学习笔记之 PD分离 kv connector
  • 有经验的佛山网站设计东莞华为外包公司
  • 什么是AIGC的创作者?
  • 51单片机基础-GPIO结构详解
  • 织梦系统如何做网站专属头像制作免费
  • 2025高校网络安全管理运维赛--电子取证分析师赛道-决赛WriteUp
  • 蒲公英异地组网路由器全新固件:4G联网、策略路由、日志管理升级
  • 网站建设规划总结做高考题的网站
  • wordpress网站被镜像wordpress邮件功能用不了
  • (111页PPT)智能工厂总体设计方案(附下载方式)
  • sh -c