summaryrefslogtreecommitdiff
path: root/indra/llrender
diff options
context:
space:
mode:
authorCosmic Linden <cosmic@lindenlab.com>2022-10-31 09:42:27 -0700
committerCosmic Linden <cosmic@lindenlab.com>2022-11-02 12:55:18 -0700
commit9e7b725c15ea0bfea5246eb81dd7a100b7ac5b6b (patch)
treebbc065c955992f45933c0f9d83d61761121d589f /indra/llrender
parentd042ad67ed4db72bf0265804e26610e565f15cf2 (diff)
SL-18485: Render GLTF materials with extension KHR_texture_transform with approprate texture transforms
Diffstat (limited to 'indra/llrender')
-rw-r--r--indra/llrender/llshadermgr.cpp10
-rw-r--r--indra/llrender/llshadermgr.h4
-rw-r--r--indra/llrender/llvertexbuffer.cpp92
-rw-r--r--indra/llrender/llvertexbuffer.h24
4 files changed, 123 insertions, 7 deletions
diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp
index 7f7829c18e..e8cf7ec758 100644
--- a/indra/llrender/llshadermgr.cpp
+++ b/indra/llrender/llshadermgr.cpp
@@ -1163,6 +1163,10 @@ void LLShaderMgr::initAttribsAndUniforms()
mReservedAttribs.push_back("weight4");
mReservedAttribs.push_back("clothing");
mReservedAttribs.push_back("texture_index");
+ mReservedAttribs.push_back("basecolor_texcoord"); // GLTF
+ mReservedAttribs.push_back("normal_texcoord"); // GLTF
+ mReservedAttribs.push_back("metallic_roughness_texcoord"); // GLTF
+ mReservedAttribs.push_back("emissive_texcoord"); // GLTF
//matrix state
mReservedUniforms.push_back("modelview_matrix");
@@ -1177,7 +1181,11 @@ void LLShaderMgr::initAttribsAndUniforms()
mReservedUniforms.push_back("texture_matrix3");
mReservedUniforms.push_back("object_plane_s");
mReservedUniforms.push_back("object_plane_t");
- llassert(mReservedUniforms.size() == LLShaderMgr::OBJECT_PLANE_T+1);
+ mReservedUniforms.push_back("texture_basecolor_matrix"); // GLTF
+ mReservedUniforms.push_back("texture_normal_matrix"); // GLTF
+ mReservedUniforms.push_back("texture_metallic_roughness_matrix"); // GLTF
+ mReservedUniforms.push_back("texture_emissive_matrix"); // GLTF
+ llassert(mReservedUniforms.size() == LLShaderMgr::TEXTURE_EMISSIVE_MATRIX+1);
mReservedUniforms.push_back("viewport");
diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h
index 6d2138f405..e1fb60eccf 100644
--- a/indra/llrender/llshadermgr.h
+++ b/indra/llrender/llshadermgr.h
@@ -51,6 +51,10 @@ public:
TEXTURE_MATRIX3, // "texture_matrix3"
OBJECT_PLANE_S, // "object_plane_s"
OBJECT_PLANE_T, // "object_plane_t"
+ TEXTURE_BASECOLOR_MATRIX, // "texture_basecolor_matrix" (GLTF)
+ TEXTURE_NORMAL_MATRIX, // "texture_normal_matrix" (GLTF)
+ TEXTURE_METALLIC_ROUGHNESS_MATRIX, // "texture_metallic_roughness_matrix" (GLTF)
+ TEXTURE_EMISSIVE_MATRIX, // "texture_emissive_matrix" (GLTF)
VIEWPORT, // "viewport"
LIGHT_POSITION, // "light_position"
LIGHT_DIRECTION, // "light_direction"
diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp
index f51000b9a6..b33708cae6 100644
--- a/indra/llrender/llvertexbuffer.cpp
+++ b/indra/llrender/llvertexbuffer.cpp
@@ -358,6 +358,10 @@ const S32 LLVertexBuffer::sTypeSize[LLVertexBuffer::TYPE_MAX] =
sizeof(LLVector4), // TYPE_WEIGHT4,
sizeof(LLVector4), // TYPE_CLOTHWEIGHT,
sizeof(LLVector4), // TYPE_TEXTURE_INDEX (actually exists as position.w), no extra data, but stride is 16 bytes
+ sizeof(LLVector2), // TYPE_BASECOLOR_TEXCOORD,
+ sizeof(LLVector2), // TYPE_NORMAL_TEXCOORD,
+ sizeof(LLVector2), // TYPE_METALLIC_ROUGHNESS_TEXCOORD,
+ sizeof(LLVector2), // TYPE_EMISSIVE_TEXCOORD,
};
static const std::string vb_type_name[] =
@@ -375,6 +379,10 @@ static const std::string vb_type_name[] =
"TYPE_WEIGHT4",
"TYPE_CLOTHWEIGHT",
"TYPE_TEXTURE_INDEX",
+ "TYPE_BASECOLOR_TEXCOORD",
+ "TYPE_NORMAL_TEXCOORD",
+ "TYPE_METALLIC_ROUGHNESS_TEXCOORD",
+ "TYPE_EMISSIVE_TEXCOORD",
"TYPE_MAX",
"TYPE_INDEX",
};
@@ -1270,6 +1278,10 @@ void LLVertexBuffer::setupVertexArray()
4, //TYPE_WEIGHT4,
4, //TYPE_CLOTHWEIGHT,
1, //TYPE_TEXTURE_INDEX
+ 2, // TYPE_BASECOLOR_TEXCOORD,
+ 2, // TYPE_NORMAL_TEXCOORD,
+ 2, // TYPE_METALLIC_ROUGHNESS_TEXCOORD,
+ 2, // TYPE_EMISSIVE_TEXCOORD,
};
static const U32 attrib_type[] =
@@ -1287,6 +1299,10 @@ void LLVertexBuffer::setupVertexArray()
GL_FLOAT, //TYPE_WEIGHT4,
GL_FLOAT, //TYPE_CLOTHWEIGHT,
GL_UNSIGNED_INT, //TYPE_TEXTURE_INDEX
+ GL_FLOAT, // TYPE_BASECOLOR_TEXCOORD,
+ GL_FLOAT, // TYPE_NORMAL_TEXCOORD,
+ GL_FLOAT, // TYPE_METALLIC_ROUGHNESS_TEXCOORD,
+ GL_FLOAT, // TYPE_EMISSIVE_TEXCOORD,
};
static const bool attrib_integer[] =
@@ -1304,6 +1320,10 @@ void LLVertexBuffer::setupVertexArray()
false, //TYPE_WEIGHT4,
false, //TYPE_CLOTHWEIGHT,
true, //TYPE_TEXTURE_INDEX
+ false, // TYPE_BASECOLOR_TEXCOORD,
+ false, // TYPE_NORMAL_TEXCOORD,
+ false, // TYPE_METALLIC_ROUGHNESS_TEXCOORD,
+ false, // TYPE_EMISSIVE_TEXCOORD,
};
static const U32 attrib_normalized[] =
@@ -1321,6 +1341,10 @@ void LLVertexBuffer::setupVertexArray()
GL_FALSE, //TYPE_WEIGHT4,
GL_FALSE, //TYPE_CLOTHWEIGHT,
GL_FALSE, //TYPE_TEXTURE_INDEX
+ GL_FALSE, // TYPE_BASECOLOR_TEXCOORD,
+ GL_FALSE, // TYPE_NORMAL_TEXCOORD,
+ GL_FALSE, // TYPE_METALLIC_ROUGHNESS_TEXCOORD,
+ GL_FALSE, // TYPE_EMISSIVE_TEXCOORD,
};
bindGLBuffer(true);
@@ -1961,6 +1985,26 @@ bool LLVertexBuffer::getClothWeightStrider(LLStrider<LLVector4>& strider, S32 in
return VertexBufferStrider<LLVector4,TYPE_CLOTHWEIGHT>::get(*this, strider, index, count, map_range);
}
+bool LLVertexBuffer::getBasecolorTexcoordStrider(LLStrider<LLVector2>& strider, S32 index, S32 count, bool map_range)
+{
+ return VertexBufferStrider<LLVector2,TYPE_BASECOLOR_TEXCOORD>::get(*this, strider, index, count, map_range);
+}
+
+bool LLVertexBuffer::getNormalTexcoordStrider(LLStrider<LLVector2>& strider, S32 index, S32 count, bool map_range)
+{
+ return VertexBufferStrider<LLVector2,TYPE_NORMAL_TEXCOORD>::get(*this, strider, index, count, map_range);
+}
+
+bool LLVertexBuffer::getMetallicRoughnessTexcoordStrider(LLStrider<LLVector2>& strider, S32 index, S32 count, bool map_range)
+{
+ return VertexBufferStrider<LLVector2,TYPE_METALLIC_ROUGHNESS_TEXCOORD>::get(*this, strider, index, count, map_range);
+}
+
+bool LLVertexBuffer::getEmissiveTexcoordStrider(LLStrider<LLVector2>& strider, S32 index, S32 count, bool map_range)
+{
+ return VertexBufferStrider<LLVector2,TYPE_EMISSIVE_TEXCOORD>::get(*this, strider, index, count, map_range);
+}
+
//----------------------------------------------------------------------------
bool LLVertexBuffer::bindGLArray()
@@ -2379,6 +2423,30 @@ void LLVertexBuffer::setupVertexBuffer(U32 data_mask)
void* ptr = (void*)(base + mOffsets[TYPE_VERTEX]);
glVertexAttribPointer(loc, 3,GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_VERTEX], ptr);
}
+ if (data_mask & MAP_BASECOLOR_TEXCOORD)
+ {
+ S32 loc = TYPE_BASECOLOR_TEXCOORD;
+ void* ptr = (void*)(base + mOffsets[TYPE_BASECOLOR_TEXCOORD]);
+ glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_BASECOLOR_TEXCOORD], ptr);
+ }
+ if (data_mask & MAP_NORMAL_TEXCOORD)
+ {
+ S32 loc = TYPE_NORMAL_TEXCOORD;
+ void* ptr = (void*)(base + mOffsets[TYPE_NORMAL_TEXCOORD]);
+ glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_NORMAL_TEXCOORD], ptr);
+ }
+ if (data_mask & MAP_METALLIC_ROUGHNESS_TEXCOORD)
+ {
+ S32 loc = TYPE_METALLIC_ROUGHNESS_TEXCOORD;
+ void* ptr = (void*)(base + mOffsets[TYPE_METALLIC_ROUGHNESS_TEXCOORD]);
+ glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_METALLIC_ROUGHNESS_TEXCOORD], ptr);
+ }
+ if (data_mask & MAP_EMISSIVE_TEXCOORD)
+ {
+ S32 loc = TYPE_EMISSIVE_TEXCOORD;
+ void* ptr = (void*)(base + mOffsets[TYPE_EMISSIVE_TEXCOORD]);
+ glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_EMISSIVE_TEXCOORD], ptr);
+ }
llglassertok();
}
@@ -2472,6 +2540,30 @@ void LLVertexBuffer::setupVertexBufferFast(U32 data_mask)
void* ptr = (void*)(base + mOffsets[TYPE_VERTEX]);
glVertexAttribPointer(loc, 3, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_VERTEX], ptr);
}
+ if (data_mask & MAP_BASECOLOR_TEXCOORD)
+ {
+ S32 loc = TYPE_BASECOLOR_TEXCOORD;
+ void* ptr = (void*)(base + mOffsets[TYPE_BASECOLOR_TEXCOORD]);
+ glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_BASECOLOR_TEXCOORD], ptr);
+ }
+ if (data_mask & MAP_NORMAL_TEXCOORD)
+ {
+ S32 loc = TYPE_NORMAL_TEXCOORD;
+ void* ptr = (void*)(base + mOffsets[TYPE_NORMAL_TEXCOORD]);
+ glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_NORMAL_TEXCOORD], ptr);
+ }
+ if (data_mask & MAP_METALLIC_ROUGHNESS_TEXCOORD)
+ {
+ S32 loc = TYPE_METALLIC_ROUGHNESS_TEXCOORD;
+ void* ptr = (void*)(base + mOffsets[TYPE_METALLIC_ROUGHNESS_TEXCOORD]);
+ glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_METALLIC_ROUGHNESS_TEXCOORD], ptr);
+ }
+ if (data_mask & MAP_EMISSIVE_TEXCOORD)
+ {
+ S32 loc = TYPE_EMISSIVE_TEXCOORD;
+ void* ptr = (void*)(base + mOffsets[TYPE_EMISSIVE_TEXCOORD]);
+ glVertexAttribPointer(loc, 2, GL_FLOAT, GL_FALSE, LLVertexBuffer::sTypeSize[TYPE_EMISSIVE_TEXCOORD], ptr);
+ }
}
LLVertexBuffer::MappedRegion::MappedRegion(S32 type, S32 index, S32 count)
diff --git a/indra/llrender/llvertexbuffer.h b/indra/llrender/llvertexbuffer.h
index 233d7785f8..b54e99ca27 100644
--- a/indra/llrender/llvertexbuffer.h
+++ b/indra/llrender/llvertexbuffer.h
@@ -160,11 +160,12 @@ public:
//WARNING -- when updating these enums you MUST
// 1 - update LLVertexBuffer::sTypeSize
- // 2 - add a strider accessor
- // 3 - modify LLVertexBuffer::setupVertexBuffer
- // 4 - modify LLVertexBuffer::setupClientArray
- // 5 - modify LLViewerShaderMgr::mReservedAttribs
- // 6 - update LLVertexBuffer::setupVertexArray
+ // 2 - update LLVertexBuffer::vb_type_name
+ // 3 - add a strider accessor
+ // 4 - modify LLVertexBuffer::setupVertexBuffer
+ // 5 - modify LLVertexBuffer::setupVertexBufferFast
+ // 6 - modify LLViewerShaderMgr::mReservedAttribs
+ // 7 - update LLVertexBuffer::setupVertexArray
// clang-format off
enum { // Shader attribute name, set in LLShaderMgr::initAttribsAndUniforms()
@@ -181,6 +182,10 @@ public:
TYPE_WEIGHT4, // "weight4"
TYPE_CLOTHWEIGHT, // "clothing"
TYPE_TEXTURE_INDEX, // "texture_index"
+ TYPE_BASECOLOR_TEXCOORD, // "basecolor_texcoord" (GLTF)
+ TYPE_NORMAL_TEXCOORD, // "normal_texcoord" (GLTF)
+ TYPE_METALLIC_ROUGHNESS_TEXCOORD, // "metallic_roughness_texcoord" (GLTF)
+ TYPE_EMISSIVE_TEXCOORD, // "emissive_texcoord" (GLTF)
TYPE_MAX, // TYPE_MAX is the size/boundary marker for attributes that go in the vertex buffer
TYPE_INDEX, // TYPE_INDEX is beyond _MAX because it lives in a separate (index) buffer
};
@@ -195,12 +200,15 @@ public:
MAP_TEXCOORD3 = (1<<TYPE_TEXCOORD3),
MAP_COLOR = (1<<TYPE_COLOR),
MAP_EMISSIVE = (1<<TYPE_EMISSIVE),
- // These use VertexAttribPointer and should possibly be made generic
MAP_TANGENT = (1<<TYPE_TANGENT),
MAP_WEIGHT = (1<<TYPE_WEIGHT),
MAP_WEIGHT4 = (1<<TYPE_WEIGHT4),
MAP_CLOTHWEIGHT = (1<<TYPE_CLOTHWEIGHT),
MAP_TEXTURE_INDEX = (1<<TYPE_TEXTURE_INDEX),
+ MAP_BASECOLOR_TEXCOORD = (1<<TYPE_BASECOLOR_TEXCOORD),
+ MAP_NORMAL_TEXCOORD = (1<<TYPE_NORMAL_TEXCOORD),
+ MAP_METALLIC_ROUGHNESS_TEXCOORD = (1<<TYPE_METALLIC_ROUGHNESS_TEXCOORD),
+ MAP_EMISSIVE_TEXCOORD = (1<<TYPE_EMISSIVE_TEXCOORD),
};
protected:
@@ -269,6 +277,10 @@ public:
bool getWeightStrider(LLStrider<F32>& strider, S32 index=0, S32 count = -1, bool map_range = false);
bool getWeight4Strider(LLStrider<LLVector4>& strider, S32 index=0, S32 count = -1, bool map_range = false);
bool getClothWeightStrider(LLStrider<LLVector4>& strider, S32 index=0, S32 count = -1, bool map_range = false);
+ bool getBasecolorTexcoordStrider(LLStrider<LLVector2>& strider, S32 index=0, S32 count = -1, bool map_range = false);
+ bool getNormalTexcoordStrider(LLStrider<LLVector2>& strider, S32 index=0, S32 count = -1, bool map_range = false);
+ bool getMetallicRoughnessTexcoordStrider(LLStrider<LLVector2>& strider, S32 index=0, S32 count = -1, bool map_range = false);
+ bool getEmissiveTexcoordStrider(LLStrider<LLVector2>& strider, S32 index=0, S32 count = -1, bool map_range = false);
bool useVBOs() const;