forked from Mirrorlandia_minetest/minetest
Add option to use texture alpha channel
This commit is contained in:
parent
36747794ab
commit
770305e28d
1
client/shaders/test_shader_3/base.txt
Normal file
1
client/shaders/test_shader_3/base.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
trans_alphach
|
23
client/shaders/test_shader_3/opengl_fragment.glsl
Normal file
23
client/shaders/test_shader_3/opengl_fragment.glsl
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
|
||||||
|
uniform sampler2D myTexture;
|
||||||
|
uniform float fogDistance;
|
||||||
|
|
||||||
|
varying vec3 vPosition;
|
||||||
|
|
||||||
|
void main (void)
|
||||||
|
{
|
||||||
|
vec4 col = texture2D(myTexture, vec2(gl_TexCoord[0]));
|
||||||
|
col *= gl_Color;
|
||||||
|
col = col * col; // SRGB -> Linear
|
||||||
|
col *= 1.8;
|
||||||
|
col.r = 1.0 - exp(1.0 - col.r) / exp(1.0);
|
||||||
|
col.g = 1.0 - exp(1.0 - col.g) / exp(1.0);
|
||||||
|
col.b = 1.0 - exp(1.0 - col.b) / exp(1.0);
|
||||||
|
col = sqrt(col); // Linear -> SRGB
|
||||||
|
float a = col.a;
|
||||||
|
if(fogDistance != 0.0){
|
||||||
|
float d = max(0.0, min(vPosition.z / fogDistance * 1.5 - 0.6, 1.0));
|
||||||
|
a = mix(a, 0.0, d);
|
||||||
|
}
|
||||||
|
gl_FragColor = vec4(col.r, col.g, col.b, a);
|
||||||
|
}
|
51
client/shaders/test_shader_3/opengl_vertex.glsl
Normal file
51
client/shaders/test_shader_3/opengl_vertex.glsl
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
|
||||||
|
uniform mat4 mWorldViewProj;
|
||||||
|
uniform mat4 mInvWorld;
|
||||||
|
uniform mat4 mTransWorld;
|
||||||
|
uniform float dayNightRatio;
|
||||||
|
|
||||||
|
varying vec3 vPosition;
|
||||||
|
|
||||||
|
void main(void)
|
||||||
|
{
|
||||||
|
gl_Position = mWorldViewProj * gl_Vertex;
|
||||||
|
|
||||||
|
vPosition = (mWorldViewProj * gl_Vertex).xyz;
|
||||||
|
|
||||||
|
vec4 color;
|
||||||
|
//color = vec4(1.0, 1.0, 1.0, 1.0);
|
||||||
|
|
||||||
|
float day = gl_Color.r;
|
||||||
|
float night = gl_Color.g;
|
||||||
|
float light_source = gl_Color.b;
|
||||||
|
|
||||||
|
/*color.r = mix(night, day, dayNightRatio);
|
||||||
|
color.g = color.r;
|
||||||
|
color.b = color.r;*/
|
||||||
|
|
||||||
|
float rg = mix(night, day, dayNightRatio);
|
||||||
|
rg += light_source * 1.0; // Make light sources brighter
|
||||||
|
float b = rg;
|
||||||
|
|
||||||
|
// Moonlight is blue
|
||||||
|
b += (day - night) / 13.0;
|
||||||
|
rg -= (day - night) / 13.0;
|
||||||
|
|
||||||
|
// Emphase blue a bit in darker places
|
||||||
|
// See C++ implementation in mapblock_mesh.cpp finalColorBlend()
|
||||||
|
b += max(0.0, (1.0 - abs(b - 0.13)/0.17) * 0.025);
|
||||||
|
|
||||||
|
// Artificial light is yellow-ish
|
||||||
|
// See C++ implementation in mapblock_mesh.cpp finalColorBlend()
|
||||||
|
rg += max(0.0, (1.0 - abs(rg - 0.85)/0.15) * 0.065);
|
||||||
|
|
||||||
|
color.r = rg;
|
||||||
|
color.g = rg;
|
||||||
|
color.b = b;
|
||||||
|
|
||||||
|
color.a = gl_Color.a;
|
||||||
|
|
||||||
|
gl_FrontColor = gl_BackColor = color;
|
||||||
|
|
||||||
|
gl_TexCoord[0] = gl_MultiTexCoord0;
|
||||||
|
}
|
@ -1649,6 +1649,7 @@ Node definition (register_node)
|
|||||||
^ Special textures of node; used rarely (old field name: special_materials)
|
^ Special textures of node; used rarely (old field name: special_materials)
|
||||||
^ List can be shortened to needed length
|
^ List can be shortened to needed length
|
||||||
alpha = 255,
|
alpha = 255,
|
||||||
|
use_texture_alpha = false, -- Use texture's alpha channel
|
||||||
post_effect_color = {a=0, r=0, g=0, b=0}, -- If player is inside node
|
post_effect_color = {a=0, r=0, g=0, b=0}, -- If player is inside node
|
||||||
paramtype = "none", -- See "Nodes"
|
paramtype = "none", -- See "Nodes"
|
||||||
paramtype2 = "none", -- See "Nodes"
|
paramtype2 = "none", -- See "Nodes"
|
||||||
|
@ -1099,6 +1099,8 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data):
|
|||||||
getShader("test_shader_1").material;
|
getShader("test_shader_1").material;
|
||||||
video::E_MATERIAL_TYPE shadermat2 = m_gamedef->getShaderSource()->
|
video::E_MATERIAL_TYPE shadermat2 = m_gamedef->getShaderSource()->
|
||||||
getShader("test_shader_2").material;
|
getShader("test_shader_2").material;
|
||||||
|
video::E_MATERIAL_TYPE shadermat3 = m_gamedef->getShaderSource()->
|
||||||
|
getShader("test_shader_3").material;
|
||||||
for(u32 i = 0; i < collector.prebuffers.size(); i++)
|
for(u32 i = 0; i < collector.prebuffers.size(); i++)
|
||||||
{
|
{
|
||||||
PreMeshBuffer &p = collector.prebuffers[i];
|
PreMeshBuffer &p = collector.prebuffers[i];
|
||||||
@ -1174,7 +1176,7 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data):
|
|||||||
= video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
|
= video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
|
||||||
material.setTexture(0, p.tile.texture.atlas);
|
material.setTexture(0, p.tile.texture.atlas);
|
||||||
if(enable_shaders)
|
if(enable_shaders)
|
||||||
p.tile.applyMaterialOptionsWithShaders(material, shadermat1, shadermat2);
|
p.tile.applyMaterialOptionsWithShaders(material, shadermat1, shadermat2, shadermat3);
|
||||||
else
|
else
|
||||||
p.tile.applyMaterialOptions(material);
|
p.tile.applyMaterialOptions(material);
|
||||||
|
|
||||||
|
@ -658,15 +658,11 @@ public:
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
u8 material_type = 0;
|
u8 material_type;
|
||||||
if(is_liquid){
|
if (is_liquid)
|
||||||
if(f->alpha == 255)
|
material_type = (f->alpha == 255) ? TILE_MATERIAL_LIQUID_OPAQUE : TILE_MATERIAL_LIQUID_TRANSPARENT;
|
||||||
material_type = TILE_MATERIAL_LIQUID_OPAQUE;
|
else
|
||||||
else
|
material_type = (f->alpha == 255) ? TILE_MATERIAL_BASIC : TILE_MATERIAL_ALPHA;
|
||||||
material_type = TILE_MATERIAL_LIQUID_TRANSPARENT;
|
|
||||||
} else{
|
|
||||||
material_type = TILE_MATERIAL_BASIC;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tiles (fill in f->tiles[])
|
// Tiles (fill in f->tiles[])
|
||||||
for(u16 j=0; j<6; j++){
|
for(u16 j=0; j<6; j++){
|
||||||
|
@ -225,6 +225,11 @@ ContentFeatures read_content_features(lua_State *L, int index)
|
|||||||
lua_pop(L, 1);
|
lua_pop(L, 1);
|
||||||
|
|
||||||
f.alpha = getintfield_default(L, index, "alpha", 255);
|
f.alpha = getintfield_default(L, index, "alpha", 255);
|
||||||
|
|
||||||
|
bool usealpha = getboolfield_default(L, index,
|
||||||
|
"use_texture_alpha", false);
|
||||||
|
if (usealpha)
|
||||||
|
f.alpha = 0;
|
||||||
|
|
||||||
/* Other stuff */
|
/* Other stuff */
|
||||||
|
|
||||||
|
10
src/tile.h
10
src/tile.h
@ -162,6 +162,7 @@ IWritableTextureSource* createTextureSource(IrrlichtDevice *device);
|
|||||||
|
|
||||||
enum MaterialType{
|
enum MaterialType{
|
||||||
TILE_MATERIAL_BASIC,
|
TILE_MATERIAL_BASIC,
|
||||||
|
TILE_MATERIAL_ALPHA,
|
||||||
TILE_MATERIAL_LIQUID_TRANSPARENT,
|
TILE_MATERIAL_LIQUID_TRANSPARENT,
|
||||||
TILE_MATERIAL_LIQUID_OPAQUE,
|
TILE_MATERIAL_LIQUID_OPAQUE,
|
||||||
};
|
};
|
||||||
@ -222,6 +223,9 @@ struct TileSpec
|
|||||||
case TILE_MATERIAL_BASIC:
|
case TILE_MATERIAL_BASIC:
|
||||||
material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
|
material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF;
|
||||||
break;
|
break;
|
||||||
|
case TILE_MATERIAL_ALPHA:
|
||||||
|
material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
|
||||||
|
break;
|
||||||
case TILE_MATERIAL_LIQUID_TRANSPARENT:
|
case TILE_MATERIAL_LIQUID_TRANSPARENT:
|
||||||
material.MaterialType = video::EMT_TRANSPARENT_VERTEX_ALPHA;
|
material.MaterialType = video::EMT_TRANSPARENT_VERTEX_ALPHA;
|
||||||
break;
|
break;
|
||||||
@ -233,12 +237,16 @@ struct TileSpec
|
|||||||
}
|
}
|
||||||
void applyMaterialOptionsWithShaders(video::SMaterial &material,
|
void applyMaterialOptionsWithShaders(video::SMaterial &material,
|
||||||
const video::E_MATERIAL_TYPE &basic,
|
const video::E_MATERIAL_TYPE &basic,
|
||||||
const video::E_MATERIAL_TYPE &liquid) const
|
const video::E_MATERIAL_TYPE &liquid,
|
||||||
|
const video::E_MATERIAL_TYPE &alpha) const
|
||||||
{
|
{
|
||||||
switch(material_type){
|
switch(material_type){
|
||||||
case TILE_MATERIAL_BASIC:
|
case TILE_MATERIAL_BASIC:
|
||||||
material.MaterialType = basic;
|
material.MaterialType = basic;
|
||||||
break;
|
break;
|
||||||
|
case TILE_MATERIAL_ALPHA:
|
||||||
|
material.MaterialType = alpha;
|
||||||
|
break;
|
||||||
case TILE_MATERIAL_LIQUID_TRANSPARENT:
|
case TILE_MATERIAL_LIQUID_TRANSPARENT:
|
||||||
material.MaterialType = liquid;
|
material.MaterialType = liquid;
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user