    

 ## On this page

  

 

 # Test014

 Last update: 16.07.2025 

Scaled and textured spheres

This example demonstrates the displacement and scaling pipeline.

A grid of spheres is created using proxy geometry consisting of a single quad. Quads are instanced via scaling and translation before being rendered using a billboard sphere shader.   
&lt;script src="./ansys251/nexus/viewer-loader.js"&gt;&lt;/script&gt;

/\*

 \* Copyright 2018-2021 ANSYS, Inc. Unauthorized use, distribution, or duplication is prohibited.

 \* 

 \* Restricted Rights Legend

 \*

 \* Use, duplication, or disclosure of this

 \* software and its documentation by the

 \* Government is subject to restrictions as

 \* set forth in subdivision \[(b)(3)(ii)\] of

 \* the Rights in Technical Data and Computer

 \* Software clause at 52.227-7013.

 \*/

\#include &lt;vector&gt;

\#include &lt;cstdlib&gt;

 

\#include "GLTFWriter.h"

\#include "test.h"

 

using namespace ANSYS::AVZ;

 

// Size/textured points

TESTFUNC(ScaledPoints)

{

 <a id="_a0" name="_a0"></a>[GLTFWriter::GLTF](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_g_l_t_f.xhtml) *gltf = GLTFWriter::GLTF::Create("MyApp", "1.0", functionName.c_str(), type);

 if (!gltf)

 throw std::runtime_error("Can't create GLTF");

 

 // TEXTURE

 std::vector&lt;unsigned char&gt; colors;

 colors.push_back(0); colors.push_back(0); colors.push_back(255); // blue

 colors.push_back(0); colors.push_back(255); colors.push_back(255); // cyan

 colors.push_back(0); colors.push_back(255); colors.push_back(0); // green

 colors.push_back(255); colors.push_back(255); colors.push_back(0); // yellow

 colors.push_back(255); colors.push_back(0); colors.push_back(0); // red

 <a id="_a1" name="_a1"></a>[GLTFWriter::Texture](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_texture.xhtml) *rainbowGradientTexture = GLTFWriter::Texture::Create(gltf, GLTFWriter::Texture::TF_RGB, 

 (unsigned int)colors.size() / 3, &amp;colors[0], false);

 

 // Use a quad proxy geometry for the spheres

 const std::vector&lt;float&gt; proxy_verts = { -1.f,1.f,0.f, 1.f,1.f,0.f, 1.f,-1.f,0.f, -1.f,-1.f,0.f };

 const std::vector&lt;unsigned short&gt; proxy_conn = { 0,3,2, 0,2,1 };

 

 // Build the various arrays

 const float tex_coord_min = 0.f;

 const float tex_coord_max = 10.f;

 std::vector&lt;float&gt; vertices;

 std::vector&lt;unsigned short&gt; triangles;

 std::vector&lt;float&gt; tex_coords;

 std::vector&lt;float&gt; point_disp_scale;

 

 // Test the scaled/textured/positioned spheres path

 // Uses the DisplacementScale attribute (dx,dy,dz,s) to scale 2D proxy

 // geometry, translate it by dx,dy,dz and render it with a sphere shader, 

 // colored and textured the same as other gltf geometry. The proxy geometry

 // should be 2D and centered about 0,0,0 with unity size \[-1,1\]. It will be

 // drawn using a billboard technique so the geometry should be in the x,y plane.

 for(size\_t j = 0; j &lt; 10; j++) {

 float y = (j * 0.1f) - 0.5f;

 for(size\_t i = 0; i &lt; 10; i++) {

 float x = (i * 0.1f) - 0.5f;

 float z = 0.f;

 float scale = j * 0.005;

 // make a copy of the quad and place it into the vertex/triangle arrays

 auto vertex_index = vertices.size() / 3;

 for(const auto idx : proxy_conn) triangles.push_back(idx + vertex_index);

 vertices.insert(vertices.end(), proxy_verts.begin(), proxy_verts.end());

 // Point location and size (applied to each proxy quad)

 for(size\_t vert = 0; vert &lt; proxy_verts.size() / 3; vert++) {

 point_disp_scale.push_back(x);

 point_disp_scale.push_back(y);

 point_disp_scale.push_back(z);

 point_disp_scale.push_back(scale);

 // texture mapping

 tex_coords.push_back(i);

 }

 }

 }

 

 // SCENE

 <a id="_a2" name="_a2"></a>[GLTFWriter::Scene](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_scene.xhtml) *scene = GLTFWriter::Scene::Create(gltf, "TestScene", "m", 1.0, 

 GLTFWriter::Scene::BT_SOLID, 0.5, 0.5, 0.5);

 if (!scene) {

 GLTFWriter::GLTF::Destroy(gltf);

 throw std::runtime_error("Can't create scene");

 }

 

 // LIGHTS

 {

 // LIGHT NODE

 <a id="_a3" name="_a3"></a>[GLTFWriter::Node](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_node.xhtml) *lightNode = GLTFWriter::Node::CreateLight(gltf);

 if (!lightNode || !scene-&gt;<a id="a4" name="a4"></a>[SetLight](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_scene.xhtml#ac92acb916999693ccaaefe8a81962c67)(lightNode)) {

 GLTFWriter::GLTF::Destroy(gltf);

 throw std::runtime_error("Can't create light");

 }

 

 // LIGHTS

 <a id="_a5" name="_a5"></a>[GLTFWriter::Light](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_light.xhtml) *light1 = GLTFWriter::Light::CreateAmbient(gltf);

 lightNode-&gt;<a id="a6" name="a6"></a>[AppendLight](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_node.xhtml#a576db36280a02127b5eb662f0566543b)(light1);

 

 [GLTFWriter::Light](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_light.xhtml) *light2 = GLTFWriter::Light::CreateDirectional(gltf, 1, 1, 1, -1, -1, -3);

 lightNode-&gt;[AppendLight](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_node.xhtml#a576db36280a02127b5eb662f0566543b)(light2);

 }

 

 // CAMERA

 {

 // CAMERA

 <a id="_a7" name="_a7"></a>[GLTFWriter::Camera](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_camera.xhtml) *camera = GLTFWriter::Camera::CreateOrthographic(gltf);

 // CAMERA NODE

 std::vector&lt;double&gt; mat(16);

 mat[0] = 1;

 mat[1] = 0;

 mat[2] = 0;

 mat[3] = 0;

 mat[4] = 0;

 mat[5] = 1;

 mat[6] = 0;

 mat[7] = 0;

 mat[8] = 0;

 mat[9] = 0;

 mat[10] = 1;

 mat[11] = 0;

 mat[12] = 0;

 mat[13] = 0;

 mat[14] = 0;

 mat[15] = 1;

 [GLTFWriter::Node](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_node.xhtml) *cameraNode = GLTFWriter::Node::CreateCamera(gltf, camera, "TestCamera", &amp;mat[0]);

 scene-&gt;<a id="a8" name="a8"></a>[SetCamera](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_scene.xhtml#ae84fba7ea3c00159c2eae7adbfbfa61d)(cameraNode);

 }

 

 // PROXY IMAGE

 {

 // Using a PNG file from disk here, but could use in-memory PNG representation as well.

 <a id="_a9" name="_a9"></a>[GLTFWriter::Image](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_image.xhtml)* proxy_image = GLTFWriter::Image::Create(gltf, "earth.png", false, true);

 if (proxy_image) {

 [GLTFWriter::Node](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_node.xhtml)* proxy_image_node = GLTFWriter::Node::CreateProxyImage(gltf, proxy_image, "scene\_proxy");

 if (proxy_image_node) {

 scene-&gt;<a id="a10" name="a10"></a>[SetProxyImage](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_scene.xhtml#a4f02c1b6ff4c656ad44b583a76e95e42)(proxy_image_node);

 }

 }

 }

 

 // NODE

 {

 [GLTFWriter::Node](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_node.xhtml) *node = GLTFWriter::Node::CreateMesh(gltf, "3D Points");

 if (!node || !scene-&gt;<a id="a11" name="a11"></a>[AppendMesh](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_scene.xhtml#a76e34d4c05fe34dde0fcc4913ad63981)(node)) {

 GLTFWriter::GLTF::Destroy(gltf);

 throw std::runtime_error("Can't create mesh node");

 }

 

 // MESH

 <a id="_a12" name="_a12"></a>[GLTFWriter::Mesh](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_mesh.xhtml) *mesh = GLTFWriter::Mesh::Create(gltf);

 if (!mesh || !node-&gt;<a id="a13" name="a13"></a>[AppendMesh](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_node.xhtml#a68c9eec5fe03405e52b3558a62f8faec)(mesh)) {

 GLTFWriter::GLTF::Destroy(gltf);

 throw std::runtime_error("Can't create mesh");

 }

 

 // TECHNIQUE

 <a id="_a14" name="_a14"></a>[GLTFWriter::Technique](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_technique.xhtml) *technique = GLTFWriter::Technique::Create(gltf);

 if (!technique ||

 // TECHNIQUE STATES

 !technique-&gt;<a id="a15" name="a15"></a>[AppendState](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_technique.xhtml#a8b2b0766157324d5a2093a3fca36379f)(GLTFWriter::State::Create(gltf, GLTFWriter::State::ST_BLENDENABLE, 1)) ||

 !technique-&gt;[AppendState](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_technique.xhtml#a8b2b0766157324d5a2093a3fca36379f)(GLTFWriter::State::Create(gltf, GLTFWriter::State::ST_DEPTHTESTENABLE, 1))) {

 GLTFWriter::GLTF::Destroy(gltf);

 throw std::runtime_error("Can't create technique");

 }

 

 // MATERIAL

 <a id="_a16" name="_a16"></a>[GLTFWriter::Material](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_material.xhtml) *material = GLTFWriter::Material::Create(gltf, technique);

 if (!material ||

 // MATERIAL UNIFORM VALUES

 !material-&gt;<a id="a17" name="a17"></a>[AppendValue](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_material.xhtml#a2f8a41e41af7d9b8cd498506f6510dd7)(GLTFWriter::Value::Create(gltf, "texture0", rainbowGradientTexture-&gt;GetID()))) {

 GLTFWriter::GLTF::Destroy(gltf);

 throw std::runtime_error("Can't create material");

 }

 

 size\_t numVertices = vertices.size() / 3;

 

 // POSITION ATTRIBUTE

 <a id="_a18" name="_a18"></a>[GLTFWriter::Attribute](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_attribute.xhtml) *vertex = GLTFWriter::Attribute::CreatePosition(gltf, numVertices, vertices.data());

 

 // TEXCOORD ATTRIBUTE

 [GLTFWriter::Attribute](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_attribute.xhtml) *texCoord = GLTFWriter::Attribute::CreateTextureCoord(gltf, 0, numVertices, tex_coords.data());

 if (!texCoord || !texCoord-&gt;<a id="a19" name="a19"></a>[SetMinMax](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_attribute.xhtml#ac7d2ab8c33ae471917966f920524fad1)(GLTFWriter::Attribute::AT_FLOAT, &amp;tex_coord_min, &amp;tex_coord_max)) {

 GLTFWriter::GLTF::Destroy(gltf);

 throw std::runtime_error("Can't create textureCoord");

 }

 

 // DISPLACEMENTSCALE ATTRIBUTE

 // Specifies the displacement and scaling for each vertex in the proxy geometry

 // It also triggers "billboard" orientation.

 [GLTFWriter::Attribute](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_attribute.xhtml) *displacement_scale = GLTFWriter::Attribute::CreateDisplacementScale(gltf, numVertices, point_disp_scale.data());

 

 // INDEX ATTRIBUTE

 <a id="_a20" name="_a20"></a>[GLTFWriter::Index](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_index.xhtml)* index = GLTFWriter::Index::Create(gltf, triangles.size(), triangles.data());

 

 // PRIMITIVE

 <a id="_a21" name="_a21"></a>[GLTFWriter::Primitive](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_primitive.xhtml) *primitive = GLTFWriter::Primitive::Create(gltf, GLTFWriter::Primitive::PT_TRIANGLES, material, index);

 if (!primitive ||

 !mesh-&gt;<a id="a22" name="a22"></a>[AppendPrimitive](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_mesh.xhtml#afb99ec25e2eebb4390c17f8770e4c23b)(primitive) ||

 !primitive-&gt;<a id="a23" name="a23"></a>[AppendAttribute](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_primitive.xhtml#ac4144b4cc35eec9c11b07cc7352d209e)(vertex) ||

 !primitive-&gt;[AppendAttribute](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_primitive.xhtml#ac4144b4cc35eec9c11b07cc7352d209e)(texCoord) ||

 !primitive-&gt;[AppendAttribute](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_primitive.xhtml#ac4144b4cc35eec9c11b07cc7352d209e)(displacement_scale)) {

 GLTFWriter::GLTF::Destroy(gltf);

 throw std::runtime_error("Can't create primitive");

 }

 }

 

 if (!gltf-&gt;<a id="a24" name="a24"></a>[Write](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_g_l_t_f.xhtml#a0bf3a4ec615dc8810776dd82a65eba91)()) {

 GLTFWriter::GLTF::Destroy(gltf);

 throw std::runtime_error("Error creating file");

 }

 

 [GLTFWriter::GLTF::GLTFError](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_g_l_t_f.xhtml#a5b8141dc8536bc10d1a72996ad6f98b4) error = gltf-&gt;<a id="a25" name="a25"></a>[GetError](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_g_l_t_f.xhtml#a63295f8f31619517e94cf27d3a8b9ea8)();

 

 GLTFWriter::GLTF::Destroy(gltf);

 

 if (error != GLTFWriter::GLTF::GLTF_ERROR_NONE)

 throw std::runtime_error("Error creating file");

}

[ANSYS::AVZ::GLTFWriter::Attribute](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_attribute.xhtml)

Attributes define the per element index values for elements defined by Index.

**Definition:** [GLTFAttribute.h:32](_g_l_t_f_attribute_8h_source.xhtml#l00031)



[ANSYS::AVZ::GLTFWriter::Attribute::SetMinMax](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_attribute.xhtml#ac7d2ab8c33ae471917966f920524fad1)

virtual bool SetMinMax(AttributeType type, const int *mn, const int *mx)=0



[ANSYS::AVZ::GLTFWriter::Camera](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_camera.xhtml)

Cameras define an orthographic or perspective projection of the scene.

**Definition:** [GLTFCamera.h:28](_g_l_t_f_camera_8h_source.xhtml#l00027)



[ANSYS::AVZ::GLTFWriter::GLTF](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_g_l_t_f.xhtml)

This is the main class of the GLTFWriter.

**Definition:** [GLTFGLTF.h:32](_g_l_t_f_g_l_t_f_8h_source.xhtml#l00031)



[ANSYS::AVZ::GLTFWriter::GLTF::Write](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_g_l_t_f.xhtml#a0bf3a4ec615dc8810776dd82a65eba91)

virtual bool Write(bool formatJSON=false)=0



[ANSYS::AVZ::GLTFWriter::GLTF::GLTFError](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_g_l_t_f.xhtml#a5b8141dc8536bc10d1a72996ad6f98b4)

GLTFError

**Definition:** [GLTFGLTF.h:35](_g_l_t_f_g_l_t_f_8h_source.xhtml#l00035)



[ANSYS::AVZ::GLTFWriter::GLTF::GetError](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_g_l_t_f.xhtml#a63295f8f31619517e94cf27d3a8b9ea8)

virtual GLTFError GetError()=0



[ANSYS::AVZ::GLTFWriter::Image](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_image.xhtml)

Images define texture data.

**Definition:** [GLTFImage.h:27](_g_l_t_f_image_8h_source.xhtml#l00026)



[ANSYS::AVZ::GLTFWriter::Index](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_index.xhtml)

Indexes define elements within primitives.

**Definition:** [GLTFIndex.h:29](_g_l_t_f_index_8h_source.xhtml#l00028)



[ANSYS::AVZ::GLTFWriter::Light](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_light.xhtml)

Lights define the light objects that can be added to a light node.

**Definition:** [GLTFLight.h:31](_g_l_t_f_light_8h_source.xhtml#l00030)



[ANSYS::AVZ::GLTFWriter::Material](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_material.xhtml)

Materials describe how primitives are rendered.

**Definition:** [GLTFMaterial.h:30](_g_l_t_f_material_8h_source.xhtml#l00029)



[ANSYS::AVZ::GLTFWriter::Material::AppendValue](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_material.xhtml#a2f8a41e41af7d9b8cd498506f6510dd7)

virtual bool AppendValue(Value *value)=0



[ANSYS::AVZ::GLTFWriter::Mesh](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_mesh.xhtml)

Meshes define the renderable objects that can be added to a node.

**Definition:** [GLTFMesh.h:104](_g_l_t_f_mesh_8h_source.xhtml#l00103)



[ANSYS::AVZ::GLTFWriter::Mesh::AppendPrimitive](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_mesh.xhtml#afb99ec25e2eebb4390c17f8770e4c23b)

virtual bool AppendPrimitive(Primitive *primitive)=0



[ANSYS::AVZ::GLTFWriter::Node](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_node.xhtml)

Nodes are the GLTFWriter class that contain the data that is defined in the GLTF file.

**Definition:** [GLTFNode.h:31](_g_l_t_f_node_8h_source.xhtml#l00030)



[ANSYS::AVZ::GLTFWriter::Node::AppendLight](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_node.xhtml#a576db36280a02127b5eb662f0566543b)

virtual bool AppendLight(Light *light)=0



[ANSYS::AVZ::GLTFWriter::Node::AppendMesh](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_node.xhtml#a68c9eec5fe03405e52b3558a62f8faec)

virtual bool AppendMesh(Mesh *mesh)=0



[ANSYS::AVZ::GLTFWriter::Primitive](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_primitive.xhtml)

Primitives are the renderable parts of meshes.

**Definition:** [GLTFMesh.h:30](_g_l_t_f_mesh_8h_source.xhtml#l00029)



[ANSYS::AVZ::GLTFWriter::Primitive::AppendAttribute](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_primitive.xhtml#ac4144b4cc35eec9c11b07cc7352d209e)

virtual bool AppendAttribute(Attribute *attribute)=0



[ANSYS::AVZ::GLTFWriter::Scene](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_scene.xhtml)

Scenes are the GLTFWriter class that create the view of the data that is defined in the GLTF file.

**Definition:** [GLTFScene.h:29](_g_l_t_f_scene_8h_source.xhtml#l00028)



[ANSYS::AVZ::GLTFWriter::Scene::SetProxyImage](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_scene.xhtml#a4f02c1b6ff4c656ad44b583a76e95e42)

virtual bool SetProxyImage(Node *image)=0



[ANSYS::AVZ::GLTFWriter::Scene::AppendMesh](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_scene.xhtml#a76e34d4c05fe34dde0fcc4913ad63981)

virtual bool AppendMesh(Node *mesh)=0



[ANSYS::AVZ::GLTFWriter::Scene::SetLight](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_scene.xhtml#ac92acb916999693ccaaefe8a81962c67)

virtual bool SetLight(Node *light)=0



[ANSYS::AVZ::GLTFWriter::Scene::SetCamera](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_scene.xhtml#ae84fba7ea3c00159c2eae7adbfbfa61d)

virtual bool SetCamera(Node *camera)=0



[ANSYS::AVZ::GLTFWriter::Technique](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_technique.xhtml)

Techniques performs the rendering of primitives.

**Definition:** [GLTFTechnique.h:240](_g_l_t_f_technique_8h_source.xhtml#l00239)



[ANSYS::AVZ::GLTFWriter::Technique::AppendState](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_technique.xhtml#a8b2b0766157324d5a2093a3fca36379f)

virtual bool AppendState(State *state)=0



[ANSYS::AVZ::GLTFWriter::Texture](class_a_n_s_y_s_1_1_a_v_z_1_1_g_l_t_f_writer_1_1_texture.xhtml)

Textures are images that can be used to color a primitive.

**Definition:** [GLTFTexture.h:28](_g_l_t_f_texture_8h_source.xhtml#l00027)