• 对osg节点添加glsl特效(片断着色器FragmentShader)


    读取一个模型到节点node,然后想对node施加一些特效,这时可以只使用片段着色器
    其中:
    gl_Color表示固定管线计算出来的颜色,包含光照效果
    gl_TexCoord[0]表示纹理坐标
    uniform sampler2D tex;//tex可以随便命名,如果只有一张纹理
    void main()
    {
         //模型顶点颜色
         vec4 c0=gl_Color;
         //如果有纹理的话,获取纹理颜色
         vec4 c1 = texture2D(tex,gl_TexCoord[0].st);
    
         //混合一下
         vec4 c=(c0+c1)/2;
    
         //黑白特效
         float grey = 0.3*c.r+0.59*c.g+0.11*c.b;
         c.r=grey*grey;
         c.g=grey*grey;
         c.b=grey*grey;
         gl_FragColor=c;
    }
    
    
    
    顶点着色器:
    void main()
    {
        gl_TexCoord[0]=gl_MultiTextCoord0;//纹理坐标
        gl_FrontColor = gl_Color;//直接获取顶点颜色,没有进行光照计算
        gl_Position = ftransform();//等价于gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * gl_Vertex;
    }
    
    片元着色器:
    void main()
    { 
         gl_FragColor = gl_Color;
    }
    注意两个gl_Color属性并不相同。
    OpenGL程序使用glColor函数后,将颜色值以attribute gl_Color的形式传给了Vertex Shader, 
    Vertext Shader接受到后开始计算gl_FontColor和gl_BackColor,而在Fragment Shader
    则会接受到一个由FontColor和BackColor插值计算出来的varying gl_Color
    (注意:该gl_Color与Vertex Shader当中的不同),因而可以基于gl_Color开始计算gl_FragColor
    attribute vec4 gl_Color;
    varying vec4 gl_FrontColor; // writable on the vertex shader
    varying vec4 gl_BackColor; // writable on the vertex shader
    varying vec4 gl_Color; // readable on the fragment shader
  • 相关阅读:
    vs2019编译错误:Exception Processing Message 0xc0000005 Parameters...
    error LNK2001
    Debug Assertion Failed
    对路径“………………”的访问被拒绝
    c语言打开文件为什么总是以二进制方式打开
    关于typedef的用法总结
    xml学习第一天
    关于VS2017编译成功系统找不到指定文件.exe的问题
    引入的外部js文件在html文件在浏览器中乱码显示
    结对作业(四则运算)
  • 原文地址:https://www.cnblogs.com/coolbear/p/10614611.html
Copyright © 2020-2023  润新知