Skip to content

Commit fbe2710

Browse files
committed
Add and enable default textures for other samplers
1 parent 2a9ff39 commit fbe2710

File tree

6 files changed

+165
-8
lines changed

6 files changed

+165
-8
lines changed

drivers/gles3/storage/material_storage.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -960,6 +960,9 @@ void MaterialData::update_textures(const HashMap<StringName, Variant> &p_paramet
960960
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_BLACK: {
961961
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_CUBEMAP_BLACK);
962962
} break;
963+
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_TRANSPARENT: {
964+
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_CUBEMAP_TRANSPARENT);
965+
} break;
963966
default: {
964967
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_CUBEMAP_WHITE);
965968
} break;
@@ -979,6 +982,9 @@ void MaterialData::update_textures(const HashMap<StringName, Variant> &p_paramet
979982
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_BLACK: {
980983
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_3D_BLACK);
981984
} break;
985+
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_TRANSPARENT: {
986+
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_3D_TRANSPARENT);
987+
} break;
982988
default: {
983989
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_3D_WHITE);
984990
} break;
@@ -988,7 +994,17 @@ void MaterialData::update_textures(const HashMap<StringName, Variant> &p_paramet
988994
case ShaderLanguage::TYPE_ISAMPLER2DARRAY:
989995
case ShaderLanguage::TYPE_USAMPLER2DARRAY:
990996
case ShaderLanguage::TYPE_SAMPLER2DARRAY: {
991-
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_2D_ARRAY_WHITE);
997+
switch (p_texture_uniforms[i].hint) {
998+
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_BLACK: {
999+
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_2D_ARRAY_BLACK);
1000+
} break;
1001+
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_TRANSPARENT: {
1002+
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_2D_ARRAY_TRANSPARENT);
1003+
} break;
1004+
default: {
1005+
gl_texture = texture_storage->texture_gl_get_default(DEFAULT_GL_TEXTURE_2D_ARRAY_WHITE);
1006+
} break;
1007+
}
9921008
} break;
9931009

9941010
default: {

drivers/gles3/storage/texture_storage.cpp

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,12 @@ TextureStorage::TextureStorage() {
106106
texture_2d_initialize(default_gl_textures[DEFAULT_GL_TEXTURE_BLACK], image);
107107

108108
Vector<Ref<Image>> images;
109-
for (int i = 0; i < 6; i++) {
109+
images.push_back(image);
110+
111+
default_gl_textures[DEFAULT_GL_TEXTURE_2D_ARRAY_BLACK] = texture_allocate();
112+
texture_2d_layered_initialize(default_gl_textures[DEFAULT_GL_TEXTURE_2D_ARRAY_BLACK], images, RS::TEXTURE_LAYERED_2D_ARRAY);
113+
114+
for (int i = 0; i < 5; i++) {
110115
images.push_back(image);
111116
}
112117
default_gl_textures[DEFAULT_GL_TEXTURE_CUBEMAP_BLACK] = texture_allocate();
@@ -132,6 +137,31 @@ TextureStorage::TextureStorage() {
132137

133138
default_gl_textures[DEFAULT_GL_TEXTURE_TRANSPARENT] = texture_allocate();
134139
texture_2d_initialize(default_gl_textures[DEFAULT_GL_TEXTURE_TRANSPARENT], image);
140+
141+
Vector<Ref<Image>> images;
142+
images.push_back(image);
143+
144+
default_gl_textures[DEFAULT_GL_TEXTURE_2D_ARRAY_TRANSPARENT] = texture_allocate();
145+
texture_2d_layered_initialize(default_gl_textures[DEFAULT_GL_TEXTURE_2D_ARRAY_TRANSPARENT], images, RS::TEXTURE_LAYERED_2D_ARRAY);
146+
147+
for (int i = 0; i < 5; i++) {
148+
images.push_back(image);
149+
}
150+
151+
default_gl_textures[DEFAULT_GL_TEXTURE_CUBEMAP_TRANSPARENT] = texture_allocate();
152+
texture_2d_layered_initialize(default_gl_textures[DEFAULT_GL_TEXTURE_CUBEMAP_TRANSPARENT], images, RS::TEXTURE_LAYERED_CUBEMAP);
153+
}
154+
155+
{
156+
Ref<Image> image = Image::create_empty(4, 4, false, Image::FORMAT_RGBA8);
157+
image->fill(Color(0, 0, 0, 0));
158+
159+
Vector<Ref<Image>> images;
160+
for (int i = 0; i < 4; i++) {
161+
images.push_back(image);
162+
}
163+
default_gl_textures[DEFAULT_GL_TEXTURE_3D_TRANSPARENT] = texture_allocate();
164+
texture_3d_initialize(default_gl_textures[DEFAULT_GL_TEXTURE_3D_TRANSPARENT], image->get_format(), 4, 4, 4, false, images);
135165
}
136166

137167
{

drivers/gles3/storage/texture_storage.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,13 @@ enum DefaultGLTexture {
122122
DEFAULT_GL_TEXTURE_CUBEMAP_BLACK,
123123
//DEFAULT_GL_TEXTURE_CUBEMAP_ARRAY_BLACK, // Cubemap Arrays not supported in GL 3.3 or GL ES 3.0
124124
DEFAULT_GL_TEXTURE_CUBEMAP_WHITE,
125+
DEFAULT_GL_TEXTURE_CUBEMAP_TRANSPARENT,
125126
DEFAULT_GL_TEXTURE_3D_WHITE,
126127
DEFAULT_GL_TEXTURE_3D_BLACK,
128+
DEFAULT_GL_TEXTURE_3D_TRANSPARENT,
127129
DEFAULT_GL_TEXTURE_2D_ARRAY_WHITE,
130+
DEFAULT_GL_TEXTURE_2D_ARRAY_BLACK,
131+
DEFAULT_GL_TEXTURE_2D_ARRAY_TRANSPARENT,
128132
DEFAULT_GL_TEXTURE_2D_UINT,
129133
DEFAULT_GL_TEXTURE_EXT,
130134
DEFAULT_GL_TEXTURE_MAX

servers/rendering/renderer_rd/storage_rd/material_storage.cpp

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -994,25 +994,58 @@ void MaterialStorage::MaterialData::update_textures(const HashMap<StringName, Va
994994
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_BLACK: {
995995
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_CUBEMAP_BLACK);
996996
} break;
997+
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_TRANSPARENT: {
998+
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_CUBEMAP_TRANSPARENT);
999+
} break;
9971000
default: {
9981001
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_CUBEMAP_WHITE);
9991002
} break;
10001003
}
10011004
} break;
10021005
case ShaderLanguage::TYPE_SAMPLERCUBEARRAY: {
1003-
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_CUBEMAP_ARRAY_BLACK);
1006+
switch (p_texture_uniforms[i].hint) {
1007+
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_WHITE: {
1008+
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_CUBEMAP_ARRAY_WHITE);
1009+
} break;
1010+
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_TRANSPARENT: {
1011+
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_CUBEMAP_ARRAY_TRANSPARENT);
1012+
} break;
1013+
default: { // previously this only had the black texture available. Keeping black as the default to minimize breaking anything.
1014+
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_CUBEMAP_ARRAY_BLACK);
1015+
} break;
1016+
}
10041017
} break;
10051018

10061019
case ShaderLanguage::TYPE_ISAMPLER3D:
10071020
case ShaderLanguage::TYPE_USAMPLER3D:
10081021
case ShaderLanguage::TYPE_SAMPLER3D: {
1009-
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_3D_WHITE);
1022+
switch (p_texture_uniforms[i].hint) {
1023+
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_BLACK: {
1024+
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_3D_BLACK);
1025+
} break;
1026+
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_TRANSPARENT: {
1027+
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_3D_TRANSPARENT);
1028+
} break;
1029+
default: {
1030+
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_3D_WHITE);
1031+
} break;
1032+
}
10101033
} break;
10111034

10121035
case ShaderLanguage::TYPE_ISAMPLER2DARRAY:
10131036
case ShaderLanguage::TYPE_USAMPLER2DARRAY:
10141037
case ShaderLanguage::TYPE_SAMPLER2DARRAY: {
1015-
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_WHITE);
1038+
switch (p_texture_uniforms[i].hint) {
1039+
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_BLACK: {
1040+
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_BLACK);
1041+
} break;
1042+
case ShaderLanguage::ShaderNode::Uniform::HINT_DEFAULT_TRANSPARENT: {
1043+
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_TRANSPARENT);
1044+
} break;
1045+
default: {
1046+
rd_texture = texture_storage->texture_rd_get_default(TextureStorage::DEFAULT_RD_TEXTURE_2D_ARRAY_WHITE);
1047+
} break;
1048+
}
10161049
} break;
10171050

10181051
default: {

servers/rendering/renderer_rd/storage_rd/texture_storage.cpp

Lines changed: 73 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ TextureStorage::TextureStorage() {
211211
pv.set(i * 4 + 0, 0);
212212
pv.set(i * 4 + 1, 0);
213213
pv.set(i * 4 + 2, 0);
214-
pv.set(i * 4 + 3, 0);
214+
pv.set(i * 4 + 3, 255);
215215
}
216216

217217
{
@@ -251,6 +251,34 @@ TextureStorage::TextureStorage() {
251251
}
252252
}
253253

254+
{ //create default transparent cubemap array
255+
256+
RD::TextureFormat tformat;
257+
tformat.format = RD::DATA_FORMAT_R8G8B8A8_UNORM;
258+
tformat.width = 4;
259+
tformat.height = 4;
260+
tformat.array_layers = 6;
261+
tformat.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_CAN_UPDATE_BIT;
262+
tformat.texture_type = RD::TEXTURE_TYPE_CUBE_ARRAY;
263+
264+
Vector<uint8_t> pv;
265+
pv.resize(16 * 4);
266+
for (int i = 0; i < 16; i++) {
267+
pv.set(i * 4 + 0, 0);
268+
pv.set(i * 4 + 1, 0);
269+
pv.set(i * 4 + 2, 0);
270+
pv.set(i * 4 + 3, 0);
271+
}
272+
273+
{
274+
Vector<Vector<uint8_t>> vpv;
275+
for (int i = 0; i < 6; i++) {
276+
vpv.push_back(pv);
277+
}
278+
default_rd_textures[DEFAULT_RD_TEXTURE_CUBEMAP_ARRAY_TRANSPARENT] = RD::get_singleton()->texture_create(tformat, RD::TextureView(), vpv);
279+
}
280+
}
281+
254282
{ //create default black cubemap
255283

256284
RD::TextureFormat tformat;
@@ -267,7 +295,7 @@ TextureStorage::TextureStorage() {
267295
pv.set(i * 4 + 0, 0);
268296
pv.set(i * 4 + 1, 0);
269297
pv.set(i * 4 + 2, 0);
270-
pv.set(i * 4 + 3, 0);
298+
pv.set(i * 4 + 3, 255);
271299
}
272300

273301
{
@@ -307,6 +335,34 @@ TextureStorage::TextureStorage() {
307335
}
308336
}
309337

338+
{ //create default transparent cubemap
339+
340+
RD::TextureFormat tformat;
341+
tformat.format = RD::DATA_FORMAT_R8G8B8A8_UNORM;
342+
tformat.width = 4;
343+
tformat.height = 4;
344+
tformat.array_layers = 6;
345+
tformat.usage_bits = RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_CAN_UPDATE_BIT;
346+
tformat.texture_type = RD::TEXTURE_TYPE_CUBE;
347+
348+
Vector<uint8_t> pv;
349+
pv.resize(16 * 4);
350+
for (int i = 0; i < 16; i++) {
351+
pv.set(i * 4 + 0, 0);
352+
pv.set(i * 4 + 1, 0);
353+
pv.set(i * 4 + 2, 0);
354+
pv.set(i * 4 + 3, 0);
355+
}
356+
357+
{
358+
Vector<Vector<uint8_t>> vpv;
359+
for (int i = 0; i < 6; i++) {
360+
vpv.push_back(pv);
361+
}
362+
default_rd_textures[DEFAULT_RD_TEXTURE_CUBEMAP_TRANSPARENT] = RD::get_singleton()->texture_create(tformat, RD::TextureView(), vpv);
363+
}
364+
}
365+
310366
{ //create default 3D
311367

312368
RD::TextureFormat tformat;
@@ -320,17 +376,31 @@ TextureStorage::TextureStorage() {
320376
Vector<uint8_t> pv;
321377
pv.resize(64 * 4);
322378
for (int i = 0; i < 64; i++) {
379+
// opaque black
323380
pv.set(i * 4 + 0, 0);
324381
pv.set(i * 4 + 1, 0);
325382
pv.set(i * 4 + 2, 0);
326-
pv.set(i * 4 + 3, 0);
383+
pv.set(i * 4 + 3, 255);
327384
}
328385

329386
{
330387
Vector<Vector<uint8_t>> vpv;
331388
vpv.push_back(pv);
332389
default_rd_textures[DEFAULT_RD_TEXTURE_3D_BLACK] = RD::get_singleton()->texture_create(tformat, RD::TextureView(), vpv);
333390
}
391+
for (int i = 0; i < 64; i++) {
392+
// transparent black
393+
pv.set(i * 4 + 0, 0);
394+
pv.set(i * 4 + 1, 0);
395+
pv.set(i * 4 + 2, 0);
396+
pv.set(i * 4 + 3, 0);
397+
}
398+
399+
{
400+
Vector<Vector<uint8_t>> vpv;
401+
vpv.push_back(pv);
402+
default_rd_textures[DEFAULT_RD_TEXTURE_3D_TRANSPARENT] = RD::get_singleton()->texture_create(tformat, RD::TextureView(), vpv);
403+
}
334404
for (int i = 0; i < 64; i++) {
335405
pv.set(i * 4 + 0, 255);
336406
pv.set(i * 4 + 1, 255);

servers/rendering/renderer_rd/storage_rd/texture_storage.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,14 @@ class TextureStorage : public RendererTextureStorage {
5757
DEFAULT_RD_TEXTURE_CUBEMAP_ARRAY_BLACK,
5858
DEFAULT_RD_TEXTURE_CUBEMAP_WHITE,
5959
DEFAULT_RD_TEXTURE_CUBEMAP_ARRAY_WHITE,
60+
DEFAULT_RD_TEXTURE_CUBEMAP_TRANSPARENT,
61+
DEFAULT_RD_TEXTURE_CUBEMAP_ARRAY_TRANSPARENT,
6062
DEFAULT_RD_TEXTURE_3D_WHITE,
6163
DEFAULT_RD_TEXTURE_3D_BLACK,
64+
DEFAULT_RD_TEXTURE_3D_TRANSPARENT,
6265
DEFAULT_RD_TEXTURE_2D_ARRAY_WHITE,
6366
DEFAULT_RD_TEXTURE_2D_ARRAY_BLACK,
67+
DEFAULT_RD_TEXTURE_2D_ARRAY_TRANSPARENT,
6468
DEFAULT_RD_TEXTURE_2D_ARRAY_NORMAL,
6569
DEFAULT_RD_TEXTURE_2D_ARRAY_DEPTH,
6670
DEFAULT_RD_TEXTURE_2D_UINT,

0 commit comments

Comments
 (0)