can
can
论坛版主
论坛版主
  • UID18
  • 粉丝4
  • 关注0
  • 发帖数12
  • 社区居民
  • 忠实会员
阅读:409回复:0

NVisionXR如何写一个引用自己shader的Material脚本

楼主#
更多 发布于:2018-04-09 15:14
先写一个Material
在Material的pass节点里, 可以用vertex_program_ref 和 fragment_program_ref来分别引用 用户自定义的vertex shader 和 fragment shader.  这样使用该材质的物体就可以按照用户自定义的 shader进行渲染了
在vertex_program_ref或fragment_program_ref节点里,可以允许用户定义一些变量的名字,以匹配系统默认的变量的名字,如
param_named_auto  worldViewProj  worldviewproj_matrix
worldviewproj_matrix 是系统默认定义好的 uniform变量,它是一个mvp矩阵, 系统会自动将mvp矩阵值传递给该unform变量
worldViewProj 是用户在shader中使用的 mvp矩阵的uniform变量的名字.
param_named_auto 是告诉系统 ,将用户定义的worldViewProj 替换成 系统默认的 worldviewproj_matrix
如果用户定义的uniform变量名字系统没有定义,可以使用param_named这个属性,需要在vertex_program或者fragment_program中的default_params节点里定义,如,
param_named nvVideoTex int 0
即定义fragment shader文件里 uniform samplerExternalOES nvVideoTex这个纹理的变量的名字,并设置其值为0,即该shader使用的第一张纹理
以下是一个简单使用自定义的shader渲染视频的例子:
material  User/VideoTexture
{
      technique
     {
          pass
         {
              //Vertex Shader
            vertex_program_ref  User/VideoRenderVP
            {
                   param_named_auto worldViewProj  worldviewproj_matrix
             }
             //Fragment Shader
            fragment_program_ref User/VideoRenderFP
           {
                 default_params
                  {
                          param_named nvVideoTex int 0
                    }
             }
        }
     }
}
注: material的pass还可以给该材质设置诸多的属性,如透明材质, 其语句如下:
scene_blend alpha_blend


scene_blend几位场景融合的属性, alpha_blend为透明通道混合,为属性值

GpuProgram
系统会根据 用户写的vertex shader 或者 fragment shader ,生成一个GpuProgram, GpuProgram在脚本中 所代表的节点为 vertex_program 或者 fragment_program. 由于系统支持多套shader语言,如glsles所代表的vertex_program 和 cg所代表的vertex_program就不一样,但是它们的上层接口对于系统而言都是一致,都由UnifiedGpuProgram来表示.
上述material中 vertex_program_ref 或者 fragment_program_ref 即代表的是UnifiedGpuProgram
以vertex_program_ref为例, 其名字User/VideoRenderVP,其对应的节点需要在material定义的前面定义,如下:
vertex_program User/VideoRenderVP unified
{
          delegate User/VideoRenderVP/GLSLES
 }
 unified代表它是一个UnifiedGpuProgram
 delegate属性定义的是一个更加具体的vertex_program,这里代理的是glsles shader.,
 该代理的shader节点如下, 需要定义在User/VideoRenderVP前面:
 vertex_program User/VideoRenderVP/GLSLES glsles
 {
          source VideoRenderVP.glsles
          profiles glsles
  }
 glsles 代表该GpuProgram所使用的shader 为glsles类型
 source代表了该GpuProgram所使用的用户自定义的vertex shader文件.
VideoRenderVP.glsles的内容如下:
#version 100
precision mediump int;
precision mediump float;
uniform mat4 worldViewProj;
varying vec4 oUv0;
attribute vec4 uv0;
attribute vec4 position;
void main()
{
   // Calculate output position
   gl_Position = worldViewProj*position;
   // Pass the main uvs straight through unchanged
   oUv0 = uv0;
}
同理可以定义fragment shader
fragment_program User/VideoRenderFP unified
{
          delegate User/VideoRenderFP/GLSLES
 }
fragment_program User/VideoRenderFP/GLSLES glsles
{
         source VideoRenderFP.glsles
         profiles glsles
}
VideoRenderFP.glsles的内容如下:
#version 100
#extension GL_OES_EGL_image_external:require
precision mediump int;
precision mediump float;
uniform samplerExternalOES nvVideoTex;
varying vec4 oUv0;
void main()
{
   vec4 color = vec4(texture2D(nvVideoTex, oUV0.xy).rgb, 1.0);
   gl_FragColor = color;
}
注意: material 和 program节点需要定义在user/materials/scripts/文件夹的.material文件里.
.glsles文件需要放在user/materials/programs文件夹的.program文件里.




 
 

    

欢迎分享

游客

返回顶部