C

.shader 格式

Qt 3D Studio 支持用于渲染元素的自定义材质。材质是任意单遍 GLSL 着色器,封装在一种文件格式中,为艺术家提供在 Studio 中调整材质参数的友好界面。

概述

以下展示了 .shader 文件的通用结构。注意,这里显示的一些属性和元素是可选的(并且此示例未包含所有可能的属性)

<Material formalName="..." version="1.0">
  <MetaData author="...">
    <Property name="..." />
    <Property name="..." />
  </MetaData>
  <Shaders type="GLSL">
    <Shader>
      <VertexShader>
        <Source>...</Source>
      </VertexShader>
      <FragmentShader>
        <Source>...</Source>
      </FragmentShader>
    </Shader>
  </Shaders>
</Material>

着色器的实际代码位于 <Source> 元素内。

模式

合法的 .shader 文件由以下正式模式描述。RelaxNG Compact 模式是该 XML Schema 定义模式生成的基础。

RelaxNG Compact(《.rnc》)

grammar \{
  start = MaterialElement                       # Everything is wrapped in a <Material> element

  MaterialElement = element Material \{
    attribute version     \{"1.0"\,              }# This file describes version 1.0 only
    attribute formalName  \{text\?,              }# The formalName attribute is optional;      default: filename (minus extension)
    attribute description \{text\?,              }# Optional long description of the material
    MetaDataElement?,                           # <MetaData> is optional,
    ShadersElement                              # but <Shaders> is required
  \}

  MetaDataElement = element MetaData\{
    attribute author      \{text\?,              }# Various descriptive attributes (optional)
    attribute created     \{text\?,}
    attribute modified    \{text\?,}
    PropertyElement*                            # Zero or more <Property> elements
  \}

  PropertyElement = element Property \{          # All <Property> attributes are optional except for name
    attribute name        \{xsd:ID\,             }# The internal, script name of the property (must be a unique identifier)
    attribute description \{text\?,              }# Tooltip to display in Inspector palette
    attribute formalName  \{text\?,              }# The name to display in Inspector palette;  default: the property `name`
    attribute type        \{PropertyType\?,      }# The type of the property (defined below);  default: Float
    attribute min         \{xsd:float\?,         }# UI min value for numeric types;            default: none
    attribute max         \{xsd:float\?,         }# UI max value for numeric types;            default: none
    attribute default     \{text\?,              }# Default value for the property;            default: 0/""
    attribute usage       \{UsageType\?,         }# Only for textures;                         default: diffuse
    attribute filter      \{FilterType\?,        }# Only for textures;                         default: linear
    attribute clamp       \{ClampType\?          }# Only for textures;                         default: wrap
  \}

  ShadersElement = element Shaders \{
    attribute type        \{"GLSL" | "HLSL"\?,   }# Optional shader type; only GLSL supported. default: GLSL
    attribute version     \{text\?,              }# Code version
    element Shared        \{text\?,              }# Arbitrary definition code to run for all shaders (optional)
    ShaderElement+                              # There must be at least one <Shader> in the .shader file
  \}

  ShaderElement = element Shader \{
    attribute name        \{xsd:NCName\?,        }# An identifier-like name
    ((VSEl | FSEl) | (VSEl & FSEl))             # Either or both of <VertexShader> and <FragmentShader>, in either order
  \}
  VSEl = element VertexShader   \{ShaderContent\}
  FSEl = element FragmentShader \{ShaderContent\}

  ShaderContent = element Source  \{ text \      }# Shaders currently require a single <Source> element

  UsageType     = "diffuse" | "specular" | "bump" | "environment"
  FilterType    = "nearest" | "linear"
  ClampType     = "clamp" | "wrap"
  PropertyType  = "Boolean" | "Color" | "Float" | "Float2" | "Font"
                  | "FontSize" | "Image" | "Import" | "Long" | "Mesh"
                  | "MultiLineString" | "Rotation" | "String" | "Vector"
                  | "Texture" | "Texture3D" | "TextureCube"
\}

XML Schema Definition(《.xsd》)

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="Material">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" ref="MetaData"/>
        <xs:element ref="Shaders"/>
      </xs:sequence>
      <xs:attribute name="version" use="required">
        <xs:simpleType>
          <xs:restriction base="xs:token">
            <xs:enumeration value="1.0"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="formalName"/>
      <xs:attribute name="description"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="MetaData">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" maxOccurs="unbounded" ref="Property"/>
      </xs:sequence>
      <xs:attribute name="author"/>
      <xs:attribute name="created"/>
      <xs:attribute name="modified"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="Property">
    <xs:complexType>
      <xs:attribute name="name" use="required" type="xs:ID"/>
      <xs:attribute name="description"/>
      <xs:attribute name="formalName"/>
      <xs:attribute name="type" type="PropertyType"/>
      <xs:attribute name="min" type="xs:float"/>
      <xs:attribute name="max" type="xs:float"/>
      <xs:attribute name="default"/>
      <xs:attribute name="usage" type="UsageType"/>
      <xs:attribute name="filter" type="FilterType"/>
      <xs:attribute name="clamp" type="ClampType"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="Shaders">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" ref="Shared"/>
        <xs:element maxOccurs="unbounded" ref="Shader"/>
      </xs:sequence>
      <xs:attribute name="type">
        <xs:simpleType>
          <xs:restriction base="xs:token">
            <xs:enumeration value="GLSL"/>
            <xs:enumeration value="HLSL"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="version"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="Shared" type="xs:string"/>
  <xs:element name="Shader">
    <xs:complexType>
      <xs:choice>
        <xs:choice>
          <xs:element ref="VertexShader"/>
          <xs:element ref="FragmentShader"/>
        </xs:choice>
        <xs:choice minOccurs="0" maxOccurs="unbounded">
          <xs:element ref="VertexShader"/>
          <xs:element ref="FragmentShader"/>
        </xs:choice>
      </xs:choice>
      <xs:attribute name="name" type="xs:NCName"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="VertexShader" type="ShaderContent"/>
  <xs:element name="FragmentShader" type="ShaderContent"/>
  <xs:complexType name="ShaderContent">
    <xs:sequence>
      <xs:element ref="Source"/>
    </xs:sequence>
  </xs:complexType>
  <xs:element name="Source" type="xs:string"/>
  <xs:simpleType name="UsageType">
    <xs:restriction base="xs:token">
      <xs:enumeration value="diffuse"/>
      <xs:enumeration value="specular"/>
      <xs:enumeration value="bump"/>
      <xs:enumeration value="environment"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="FilterType">
    <xs:restriction base="xs:token">
      <xs:enumeration value="nearest"/>
      <xs:enumeration value="linear"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="ClampType">
    <xs:restriction base="xs:token">
      <xs:enumeration value="clamp"/>
      <xs:enumeration value="wrap"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="PropertyType">
    <xs:restriction base="xs:token">
      <xs:enumeration value="Boolean"/>
      <xs:enumeration value="Color"/>
      <xs:enumeration value="Float"/>
      <xs:enumeration value="Float2"/>
      <xs:enumeration value="Font"/>
      <xs:enumeration value="FontSize"/>
      <xs:enumeration value="Image"/>
      <xs:enumeration value="Import"/>
      <xs:enumeration value="Long"/>
      <xs:enumeration value="Mesh"/>
      <xs:enumeration value="MultiLineString"/>
      <xs:enumeration value="Rotation"/>
      <xs:enumeration value="String"/>
      <xs:enumeration value="Vector"/>
      <xs:enumeration value="Texture"/>
      <xs:enumeration value="Texture3D"/>
      <xs:enumeration value="TextureCube"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>

在特定的 Qt 许可证下可用。
了解更多。