Osg中着色器基本应用

7 篇文章 0 订阅
6 篇文章 0 订阅

参考资料:https://www.cnblogs.com/brainworld/p/7445290.html

https://blog.csdn.net/panda1234lee/article/details/51970893

 

1.首先,我们需要打开osg的渲染状态节点osg::StateSet中对应的着色器模式。

osg::ref_ptr<osg::Program> program = new osg::Program;

mStateSet->setAttributeAndModes(program.get(),osg::StateAttribute::ON);

 

2.根据需要创建对应的osg着色器osg::Shader,并添加到osg::Program中。

osg::ref_ptr<osg::Shader> vertShader = new osg::Shader(osg::Shader::VERTEX, vertSource); //顶点着色器

osg::ref_ptr<osg::Shader> fragShader = new osg::Shader(osg::Shader::FRAGMENT, fragSource);//片元着色器

program->addShader(vertShader.get());

program->addShader(fragShader.get());

 

3.在对应的着色器中需要以字符的形式传入着色器源码char*  vertSource,char*  fragSource。

下面为实现Blinn-Phong光照模型例子。

//顶点着色器

static const char* vertSource = {

 //"uniform vec3 LightPosition;\n"

 "uniform vec3 EyePosition; \n"

 

 //varying vec2 Texcoord;

 "varying vec3 ViewDirection; \n"

 //"varying vec3 LightDirection; \n"

 "varying vec3 Normal; \n"

 

 "void main(void)\n"

 "{\n"

 "      gl_Position = ftransform(); \n"

          //Texcoord = gl_MultiTexCoord0.xy;

 

 "      vec4 OPosition = gl_ModelViewMatrix * gl_Vertex; \n"

 

 "      ViewDirection = EyePosition - OPosition.xyz; \n"

 //"   LightDirection = LightPosition - OPosition.xyz; \n"

 "      Normal = gl_NormalMatrix * gl_Normal; \n"

 

 "}\n"

};

 

//片元着色器

static const char* fragSource = {

"uniform vec4 LA;\n"

"uniform vec4 LD;\n"

"uniform vec4 LS;\n"

 

"uniform vec4 MA;\n"

"uniform vec4 MD;\n"

"uniform vec4 MS;\n"

"uniform float MfSpecularPower;\n"

 

"uniform vec3 LightDirection;\n"

 

//uniform sampler2D baseMap;

//varying vec2 Texcoord;

"varying vec3 ViewDirection;\n"

//"varying vec3 LightDirection;\n"

"varying vec3 Normal;\n"

 

"void main(void)\n"

"{\n"

"        vec3  LightDir = normalize(LightDirection);\n"

"        vec3  NormalDir = normalize(Normal);\n"

"        vec3  ViewDir = normalize(ViewDirection);\n"

"        vec3  HalfDir = normalize(LightDir + ViewDir);\n"

 

//vec3  ReDir = normalize(((2.0 * NormalDir) * fNDotL) - LightDir);

//vec4  fvBaseColor = texture2D(baseMap, Texcoord);

 

//

"        vec4  TotalAmbient = LA * MA;\n"

//

"        float fNDotL = dot(NormalDir, LightDir);\n"

"        vec4  TotalDiffuse = LD * MD * fNDotL;\n"

//

"        float fNDotH = max(0.0, dot(NormalDir, HalfDir));\n"

"        vec4 TotalSpecular = LS * MS * (pow(fNDotH, MfSpecularPower));\n"

//

"        gl_FragColor = (TotalAmbient + TotalDiffuse + TotalSpecular);\n"

 

"}\n"

};

 

4.在着色器源码中定义了许多传入参数,通过osg中osg::Uniform节点构造对应参数值并将其加入到osg::StateSet中。

//               //光照参数

//               osg::ref_ptr<osg::Uniform> LA = new osg::Uniform("LA", osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f));

//               osg::ref_ptr<osg::Uniform> LD = new osg::Uniform("LD", osg::Vec4(0.6f, 0.6f, 0.6f, 1.0f));

//               osg::ref_ptr<osg::Uniform> LS = new osg::Uniform("LS", osg::Vec4(0.6f, 0.6f, 0.6f, 1.0f));

//              

//               //材质参数。

//               osg::ref_ptr<osg::Uniform> MA = new osg::Uniform("MA", mOsgcolor);

//               osg::ref_ptr<osg::Uniform> MD = new osg::Uniform("MD", mOsgcolor);

//               osg::ref_ptr<osg::Uniform> MS = new osg::Uniform("MS", osg::Vec4(0.8f, 0.8f, 0.8f, 1.0f));

//               osg::ref_ptr<osg::Uniform> MfSpecularPower = new osg::Uniform("MfSpecularPower", 90.0f);

//               mStateSet->addUniform(LA.get());

//               mStateSet->addUniform(LD.get());

//               mStateSet->addUniform(LS.get());

//               mStateSet->addUniform(MA.get());

//               mStateSet->addUniform(MD.get());

//               mStateSet->addUniform(MS.get());

//               mStateSet->addUniform(MfSpecularPower.get());

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值