C

效果参考

本页解释了如何编写效果。

概述

效果规范允许编写自定义效果,这些效果应用于层。效果可以有多重遍行来计算最终结果。每个遍行中的着色器必须实现分别为片段着色器和顶点着色器的 void frag()void vert() 函数。遍行将按照在效果文件中指定的顺序执行。工作室着色器库也可以通过 #include 指令来访问以添加功能。

注意:与自定义材质不同,Qt 3D Studio 2.0 运行时对多遍行渲染有全面支持。

效果结构

<Effect>
    <MetaData>
        <Property name="FloatParam" type="Float" formalName="Float Param" description="" default="1.0"/>
        <Property name="TextureParam" type="Texture" filter="linear" clamp="clamp"/>
        <Property name="DepthTextureParam" type="Texture" filter="nearest" clamp="clamp"/>
    </MetaData>
    <Shaders>
        <Shared></Shared>
        <VertexShaderShared></VertexShaderShared>
        <FragmentShaderShared></FragmentShaderShared>
        <Shader name="PASS1">
            <VertexShader></VertexShader>
            <FragmentShader></FragmentShader>
        </Shader>
        <Shader name="PASS2">
            <VertexShader></VertexShader>
            <FragmentShader></FragmentShader>
        </Shader>
        <Shader name="MAIN">

            <VertexShader>
void vert()
{
}
            </VertexShader>
            <FragmentShader>
void frag()
{
}
            </FragmentShader>
        </Shader>
    </Shaders>
    <Passes>
        <Buffer name="buffer" type="fp16" format="rg" filter="nearest" wrap="clamp" size="1.0" lifetime="frame"/>
        <Buffer name="buffer2" type="fp16" format="rg" filter="nearest" wrap="clamp" size="1.0" lifetime="frame"/>
        <Buffer name="stencilBuffer" format='depth24stencil8' lifetime="frame" />

        <Pass shader="PASS1" input="[source]" output="buffer">
            <DepthInput param="DepthTextureParam"/>
            <DepthStencil buffer='stencilBuffer' flags='clear-stencil' stencil-fail='replace' depth-fail='replace' depth-pass='replace' stencil-function='always' reference='1'/>
        </Pass>

        <Pass shader="PASS2" input="buffer" output="buffer2">
            <BufferInput param="buffer" param="TextureParam" />
        </Pass>
        <Pass shader="MAIN" input="[source]" output="[dest]">
            <Blending source="SrcAlpha" dest="One"/>
            <SetParam name="FloatParam" value="0.0"/>
        </Pass>
    </Passes>
</Effect>

效果文件结构遵循自定义材质相同的模式,首先是带有参数的元数据,位于 <Metadata> 元素中,然后是位于 <Shaders> 元素中的效果着色器以及位于 <Passes> 元素中的渲染遍行。

参数

效果元数据参数与自定义材质相同,但也有一些效果特有的参数。具有 Texture 类型以及 <Buffer><BufferInput> 元素的参数允许在着色器中使用样本变量。

注意:Qt 3D Studio 2.0 运行时不支持其他类型的缓冲区(着色器存储缓冲区、间接绘制等)。通过 <Buffer> 元素指定的临时缓冲区映射为纹理。这可以通过单独遍行中的 <BufferInput> 绑定到着色器中的样本变量。

元素

<Shared>

此元素可用于插入所有着色器共享的代码块。它会被插入到效果中的所有着色器中。

<VertexShaderShared> 和 <FragmentShaderShared>

这些元素可以用于插入所有顶点和片段着色器共享的代码块。位于 <VertexShaderShared> 元素内的代码被插入到所有顶点着色器中,而位于 <FragmentShaderShared> 元素内的代码被插入到所有片段着色器中。

<Shader>, <VertexShader> 和 <FragmentShader>

<Shader> 元素指定了一个着色器,着色器名为 name 属性指定的名称。该名称在 <Pass> 元素中用于指定要执行哪个着色器。《VertexShader》和 <FragmentShader> 元素用于分别指定顶点着色器代码和片段着色器代码。顶点着色器必须实现 void vert() 函数,而片段着色器必须实现 void frag() 函数,除非为空。

着色器可以使用 varyinginout 指示符来定义自定义变量,以在着色器阶段之间传递参数。

<Passes>

<Passes> 元素用于指定效果的压力遍行。必须在每个 <Pass> 元素内指定每个遍行。《Passes》元素还可以包含 <Buffer> 元素来指定为效果指定不同类型的存储方式。

注意:在 Qt 3D Studio 2.0 运行时,缓冲区总是映射到纹理。

《缓冲区》

此元素可以用于创建用于效果内部的效果缓冲区。不同的传递可以读取和写入这些缓冲区,以实现效果的不同阶段。可以使用《`元素将缓冲区绑定到着色器变量,以便在着色器中读取。

元素属性如下

属性描述
名称字符串用于指定缓冲区的唯一名称。
类型
  • ubyte - 8位无符号整数
  • ushort - 16位无符号整数
  • fp16 - 16位浮点数
  • fp32 - 32位浮点数
用于指定缓冲区的类型。
格式
  • source - 从源获取格式
  • depth24stencil8 - 深度24位模板8位
  • alpha - 透明度
  • lum - 亮度
  • lum_alpha - 亮度透明度
  • rg - 2分量RGB
  • rgb - 3分量RGB
  • rgba - 4分量RGBA
用于指定缓冲区的格式。
过滤器
  • nearest - 最邻近数值
  • linear - 线性插值
用于指定输入过滤模式。
包装
  • clamp - 拉伸至边缘
  • repeat - 重复值
用于指定纹理坐标的包装模式。
大小float用于指定缓冲区相对于帧缓冲区的大小。1.0对应相同大小。0.5对应缓冲区宽度和高度是原来的一半。
寿命
  • scene - 缓冲区在场景开始时分配
  • frame - 缓冲区在帧开始时分配
用于指定缓冲区的分配和删除方式。具有frame寿命的缓冲区可以被其他效果重用。

`

此元素指定效果中的一个渲染传递。传递的执行顺序与效果文件中指定的顺序一致。

元素属性如下

属性描述
着色器字符串在此传递中执行的着色器名称。必须与<Shaders>`元素中的着色器名称匹配。
输入字符串一个`<Buffer>`元素的名称或[source]。
输出字符串一个`<Buffer>`元素的名称或[dest]。
格式
  • alpha - 透明度
  • lum - 亮度
  • lum_alpha - 亮度透明度
  • rg - 2分量RGB
  • rgb - 3分量RGB
  • rgba - 4分量RGBA
如果输出是[dest],则指定输出格式。

`

此元素将一个缓冲区(纹理)绑定到着色器采样变量。

元素属性如下

属性描述
字符串一个`<Buffer>`元素的名称或[source]。
参数字符串着色器变量的名称。

`

此元素将帧缓冲区深度作为纹理绑定到着色器采样变量。

元素属性如下

属性描述
参数字符串着色器变量的名称。

`

此元素可以用于设置与渲染传递特定的着色器参数。参数必须与``元素中指定的参数匹配。

元素属性如下

属性描述
名称字符串属性名称。
浮点数或整数指定属性的值。

`

此元素可以用于更改渲染传递的混合模式。

元素属性如下

属性描述
目的
  • SrcAlpha
  • OneMinusSrcAlpha
  • One
指定目的混合模式。
  • SrcAlpha
  • OneMinusSrcAlpha
  • One
指定源混合模式。

《RenderState}

此元素可以用于启用或禁用传递的渲染状态。

元素属性如下

属性描述
名称
  • 模板
  • 裁剪面
渲染状态的名称
布尔值指定是否启用或禁用渲染状态。

《DepthStencil}

此元素可以用来指定深度-模板缓冲区,并更改绘制的深度-模板测试。

元素属性如下

属性描述
缓冲区字符串用作深度-模板缓冲区的缓冲区名称。
标志
  • clear-stencil - 清空模板缓冲区
  • clear-depth - 清空深度缓冲区
指定元素的标志。这些可以通过逻辑或 '|' 组合。
模板失效模板操作值之一指定模板失效操作。
深度失效模板操作值之一指定深度失效操作。
深度通过模板操作值之一指定深度通过操作。
模板函数布尔操作值之一指定模板函数。
参考整数指定模板参考值。
掩码整数指定模板掩码值。

模板操作值包括

  • 保留
  • 替换
  • 增加
  • 增加环绕
  • 减少
  • 减少环绕
  • 反转

布尔操作值包括

  • 永不
  • 小于
  • 小于或等于
  • 等于
  • 不等于
  • 大于
  • 大于或等于
  • 永是

<剔除>

此元素可以用来选择由 CullFace 剔除哪些面。

元素属性如下

属性描述
模式
  • Back - 后面面。
  • Front - 前面面。
  • All - 所有面。
指定 CullFace 模式。

在某些 Qt 许可证下可用。
了解详细信息。