Move more computation into frag shader
This commit is contained in:
@@ -12,8 +12,7 @@ layout(binding = 2) uniform sampler2D depthTex;
|
|||||||
// however they are not a full block
|
// however they are not a full block
|
||||||
|
|
||||||
layout(location = 0) in vec2 uv;
|
layout(location = 0) in vec2 uv;
|
||||||
layout(location = 1) in flat vec2 baseUV;
|
layout(location = 1) in flat uvec4 interData;
|
||||||
layout(location = 2) in flat uvec4 interData;
|
|
||||||
|
|
||||||
#ifdef DEBUG_RENDER
|
#ifdef DEBUG_RENDER
|
||||||
layout(location = 7) in flat uint quadDebug;
|
layout(location = 7) in flat uint quadDebug;
|
||||||
@@ -24,26 +23,35 @@ vec4 uint2vec4RGBA(uint colour) {
|
|||||||
return vec4((uvec4(colour)>>uvec4(24,16,8,0))&uvec4(0xFF))/255.0;
|
return vec4((uvec4(colour)>>uvec4(24,16,8,0))&uvec4(0xFF))/255.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//conditionalTinting.yzwx
|
|
||||||
|
|
||||||
vec4 computeColour(vec4 colour) {
|
vec4 computeColour(vec4 colour) {
|
||||||
//Conditional tinting, TODO: FIXME: REPLACE WITH MASK OR SOMETHING, like encode data into the top bit of alpha
|
//Conditional tinting, TODO: FIXME: REPLACE WITH MASK OR SOMETHING, like encode data into the top bit of alpha
|
||||||
if ((interData.x&(1u<<2)) != 0 && abs(colour.r-colour.g) < 0.02f && abs(colour.g-colour.b) < 0.02f) {
|
if ((interData.x&(1u<<2)) != 0 && abs(colour.r-colour.g) < 0.02f && abs(colour.g-colour.b) < 0.02f) {
|
||||||
colour *= uint2vec4RGBA(interData.w).yzwx;
|
colour *= uint2vec4RGBA(interData.z).yzwx;
|
||||||
}
|
}
|
||||||
return (colour * uint2vec4RGBA(interData.y)) + uint2vec4RGBA(interData.z);
|
return (colour * uint2vec4RGBA(interData.y)) + (float(interData.w&0xFFu)/255);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool useMipmaps() {
|
bool useMipmaps() {
|
||||||
return ((interData.x>>1)&1u)==0u;
|
return ((interData.x>>1)&1u)==0u;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint getFace() {
|
||||||
|
return (interData.w>>8)&7u;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec2 getBaseUV() {
|
||||||
|
uint face = getFace();
|
||||||
|
uint modelId = interData.x>>16;
|
||||||
|
vec2 modelUV = vec2(modelId&0xFFu, (modelId>>8)&0xFFu)*(1.0/(256.0));
|
||||||
|
return modelUV + (vec2(face>>1, face&1u) * (1.0/(vec2(3.0, 2.0)*256.0)));
|
||||||
|
}
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
//Tile is the tile we are in
|
//Tile is the tile we are in
|
||||||
vec2 tile;
|
vec2 tile;
|
||||||
vec2 uv2 = modf(uv, tile)*(1.0/(vec2(3.0,2.0)*256.0));
|
vec2 uv2 = modf(uv, tile)*(1.0/(vec2(3.0,2.0)*256.0));
|
||||||
vec4 colour = vec4(1);
|
vec4 colour;
|
||||||
vec2 texPos = uv2 + baseUV;
|
vec2 texPos = uv2 + getBaseUV();
|
||||||
if (useMipmaps()) {
|
if (useMipmaps()) {
|
||||||
vec2 uvSmol = uv*(1.0/(vec2(3.0,2.0)*256.0));
|
vec2 uvSmol = uv*(1.0/(vec2(3.0,2.0)*256.0));
|
||||||
vec2 dx = dFdx(uvSmol);//vec2(lDx, dDx);
|
vec2 dx = dFdx(uvSmol);//vec2(lDx, dDx);
|
||||||
@@ -53,7 +61,7 @@ void main() {
|
|||||||
colour = texture(blockModelAtlas, texPos, -5.0);
|
colour = texture(blockModelAtlas, texPos, -5.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (any(notEqual(clamp(tile, vec2(0), vec2((interData.x>>16)&0xFFu, (interData.x>>24)&0xFFu)), tile))) {
|
if (any(notEqual(clamp(tile, vec2(0), vec2((interData.x>>8)&0xFu, (interData.x>>12)&0xFu)), tile))) {
|
||||||
discard;
|
discard;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,22 +15,22 @@
|
|||||||
//#define DEBUG_RENDER
|
//#define DEBUG_RENDER
|
||||||
|
|
||||||
layout(location = 0) out vec2 uv;
|
layout(location = 0) out vec2 uv;
|
||||||
layout(location = 1) out flat vec2 baseUV;
|
layout(location = 1) out flat uvec4 interData;
|
||||||
layout(location = 2) out flat uvec4 interData;
|
|
||||||
|
|
||||||
uint packVec4(vec4 vec) {
|
uint packVec4(vec4 vec) {
|
||||||
uvec4 vec_=uvec4(vec*255)<<uvec4(24,16,8,0);
|
uvec4 vec_=uvec4(vec*255)<<uvec4(24,16,8,0);
|
||||||
return vec_.x|vec_.y|vec_.z|vec_.w;
|
return vec_.x|vec_.y|vec_.z|vec_.w;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setSizeAndFlags(uint _flags, ivec2 quadSize) {
|
void setSizeAndFlags(uint modelId, uint _flags, ivec2 quadSize) {
|
||||||
interData.x = _flags | (uint(quadSize.x-1)<<16) | (uint(quadSize.y-1)<<24);
|
interData.x = (modelId<<16) | _flags | (uint(quadSize.x-1)<<8) | (uint(quadSize.y-1)<<12);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setTinting(vec4 _tinting, vec4 _addin, uint _conditionalTinting) {
|
void setTintingAndExtra(vec4 _tinting, uint _conditionalTinting, uint alphaAddin, uint face) {
|
||||||
|
uint packed = alphaAddin|(face<<8);
|
||||||
interData.y = packVec4(_tinting);
|
interData.y = packVec4(_tinting);
|
||||||
interData.z = packVec4(_addin);
|
interData.z = _conditionalTinting;
|
||||||
interData.w = _conditionalTinting;
|
interData.w = packed;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef DEBUG_RENDER
|
#ifdef DEBUG_RENDER
|
||||||
@@ -115,9 +115,6 @@ void main() {
|
|||||||
|
|
||||||
if (cornerIdx == 1) //Only if we are the provoking vertex
|
if (cornerIdx == 1) //Only if we are the provoking vertex
|
||||||
{
|
{
|
||||||
vec2 modelUV = vec2(modelId&0xFFu, (modelId>>8)&0xFFu)*(1.0/(256.0));
|
|
||||||
baseUV = modelUV + (vec2(face>>1, face&1u) * (1.0/(vec2(3.0, 2.0)*256.0)));
|
|
||||||
|
|
||||||
//Generate tinting and flag data
|
//Generate tinting and flag data
|
||||||
uint flags = faceHasAlphaCuttout(faceData);
|
uint flags = faceHasAlphaCuttout(faceData);
|
||||||
|
|
||||||
@@ -141,7 +138,7 @@ void main() {
|
|||||||
conditionalTinting = tintColour;
|
conditionalTinting = tintColour;
|
||||||
}
|
}
|
||||||
|
|
||||||
vec4 addin = vec4(0.0);
|
uint alphaAddin = 0;
|
||||||
if (!isTranslucent) {
|
if (!isTranslucent) {
|
||||||
tinting.w = 0.0;
|
tinting.w = 0.0;
|
||||||
//Encode the face, the lod level and
|
//Encode the face, the lod level and
|
||||||
@@ -149,7 +146,7 @@ void main() {
|
|||||||
encodedData |= face;
|
encodedData |= face;
|
||||||
encodedData |= (lodLevel<<3);
|
encodedData |= (lodLevel<<3);
|
||||||
encodedData |= uint(hasAO)<<6;
|
encodedData |= uint(hasAO)<<6;
|
||||||
addin.w = float(encodedData)/255.0;
|
alphaAddin = encodedData;
|
||||||
}
|
}
|
||||||
|
|
||||||
//Apply face tint
|
//Apply face tint
|
||||||
@@ -165,14 +162,10 @@ void main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
setSizeAndFlags(flags, quadSize);
|
setSizeAndFlags(modelId, flags, quadSize);
|
||||||
setTinting(tinting, addin, conditionalTinting);
|
setTinting(tinting, conditionalTinting, alphaAddin, face);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
vec4 faceSize = getFaceSize(faceData);
|
vec4 faceSize = getFaceSize(faceData);
|
||||||
|
|
||||||
vec2 cQuadSize = (faceSize.yw + quadSize - 1) * vec2((cornerIdx>>1)&1, cornerIdx&1);
|
vec2 cQuadSize = (faceSize.yw + quadSize - 1) * vec2((cornerIdx>>1)&1, cornerIdx&1);
|
||||||
|
|||||||
Reference in New Issue
Block a user