Friends,
I need help optimizing the following fragment shader: It looks long, but actually not. It initializes a long array that contains 256 elements.
Fragment:
#version 410
//#extension GL_ARB_shading_language_420pack : enable
layout (location = 0) in vec3 colorOut;
uniform int colorBands;
uniform int computeDiff;
uniform float diffScaling;
uniform sampler2D textureD;
//layout (location = 0) out vec4 colorOut;
out vec4 fColor;
vec3 computePlasmaColormap(float value, vec3 p[256]) {
return p[int(255 * clamp(value, 0, 1))];
}
float computeColorDistance() {
vec2 texSize;
texSize = textureSize(textureD, 0);
vec3 texColor = texture(textureD, gl_FragCoord.xy / texSize).xyz;
return texColor == vec3(0) ? 0 : length(colorOut - texColor);
}
void main() {
vec3 plasmaColormap[256];
plasmaColormap[0]=vec3(0.050383, 0.029803, 0.527975);
plasmaColormap[1]=vec3(0.063536, 0.028426, 0.533124);
plasmaColormap[2]=vec3(0.075353, 0.027206, 0.538007);
plasmaColormap[3]=vec3(0.086222, 0.026125, 0.542658);
plasmaColormap[4]=vec3(0.096379, 0.025165, 0.547103);
plasmaColormap[5]=vec3(0.10598, 0.024309, 0.551368);
plasmaColormap[6]=vec3(0.115124, 0.023556, 0.555468);
plasmaColormap[7]=vec3(0.123903, 0.022878, 0.559423);
plasmaColormap[8]=vec3(0.132381, 0.022258, 0.56325);
plasmaColormap[9]=vec3(0.140603, 0.021687, 0.566959);
plasmaColormap[10]=vec3(0.148607, 0.021154, 0.570562);
plasmaColormap[11]=vec3(0.156421, 0.020651, 0.574065);
plasmaColormap[12]=vec3(0.16407, 0.020171, 0.577478);
plasmaColormap[13]=vec3(0.171574, 0.019706, 0.580806);
plasmaColormap[14]=vec3(0.17895, 0.019252, 0.584054);
plasmaColormap[15]=vec3(0.186213, 0.018803, 0.587228);
plasmaColormap[16]=vec3(0.193374, 0.018354, 0.59033);
plasmaColormap[17]=vec3(0.200445, 0.017902, 0.593364);
plasmaColormap[18]=vec3(0.207435, 0.017442, 0.596333);
plasmaColormap[19]=vec3(0.21435, 0.016973, 0.599239);
plasmaColormap[20]=vec3(0.221197, 0.016497, 0.602083);
plasmaColormap[21]=vec3(0.227983, 0.016007, 0.604867);
plasmaColormap[22]=vec3(0.234715, 0.015502, 0.607592);
plasmaColormap[23]=vec3(0.241396, 0.014979, 0.610259);
plasmaColormap[24]=vec3(0.248032, 0.014439, 0.612868);
plasmaColormap[25]=vec3(0.254627, 0.013882, 0.615419);
plasmaColormap[26]=vec3(0.261183, 0.013308, 0.617911);
plasmaColormap[27]=vec3(0.267703, 0.012716, 0.620346);
plasmaColormap[28]=vec3(0.274191, 0.012109, 0.622722);
plasmaColormap[29]=vec3(0.280648, 0.011488, 0.625038);
plasmaColormap[30]=vec3(0.287076, 0.010855, 0.627295);
plasmaColormap[31]=vec3(0.293478, 0.010213, 0.62949);
plasmaColormap[32]=vec3(0.299855, 0.009561, 0.631624);
plasmaColormap[33]=vec3(0.30621, 0.008902, 0.633694);
plasmaColormap[34]=vec3(0.312543, 0.008239, 0.6357);
plasmaColormap[35]=vec3(0.318856, 0.007576, 0.63764);
plasmaColormap[36]=vec3(0.32515, 0.006915, 0.639512);
plasmaColormap[37]=vec3(0.331426, 0.006261, 0.641316);
plasmaColormap[38]=vec3(0.337683, 0.005618, 0.643049);
plasmaColormap[39]=vec3(0.343925, 0.004991, 0.64471);
plasmaColormap[40]=vec3(0.35015, 0.004382, 0.646298);
plasmaColormap[41]=vec3(0.356359, 0.003798, 0.64781);
plasmaColormap[42]=vec3(0.362553, 0.003243, 0.649245);
plasmaColormap[43]=vec3(0.368733, 0.002724, 0.650601);
plasmaColormap[44]=vec3(0.374897, 0.002245, 0.651876);
plasmaColormap[45]=vec3(0.381047, 0.001814, 0.653068);
plasmaColormap[46]=vec3(0.387183, 0.001434, 0.654177);
plasmaColormap[47]=vec3(0.393304, 0.001114, 0.655199);
plasmaColormap[48]=vec3(0.399411, 0.000859, 0.656133);
plasmaColormap[49]=vec3(0.405503, 0.000678, 0.656977);
plasmaColormap[50]=vec3(0.41158, 0.000577, 0.65773);
plasmaColormap[51]=vec3(0.417642, 0.000564, 0.65839);
plasmaColormap[52]=vec3(0.423689, 0.000646, 0.658956);
plasmaColormap[53]=vec3(0.429719, 0.000831, 0.659425);
plasmaColormap[54]=vec3(0.435734, 0.001127, 0.659797);
plasmaColormap[55]=vec3(0.441732, 0.00154, 0.660069);
plasmaColormap[56]=vec3(0.447714, 0.00208, 0.66024);
plasmaColormap[57]=vec3(0.453677, 0.002755, 0.66031);
plasmaColormap[58]=vec3(0.459623, 0.003574, 0.660277);
plasmaColormap[59]=vec3(0.46555, 0.004545, 0.660139);
plasmaColormap[60]=vec3(0.471457, 0.005678, 0.659897);
plasmaColormap[61]=vec3(0.477344, 0.00698, 0.659549);
plasmaColormap[62]=vec3(0.48321, 0.00846, 0.659095);
plasmaColormap[63]=vec3(0.489055, 0.010127, 0.658534);
plasmaColormap[64]=vec3(0.494877, 0.01199, 0.657865);
plasmaColormap[65]=vec3(0.500678, 0.014055, 0.657088);
plasmaColormap[66]=vec3(0.506454, 0.016333, 0.656202);
plasmaColormap[67]=vec3(0.512206, 0.018833, 0.655209);
plasmaColormap[68]=vec3(0.517933, 0.021563, 0.654109);
plasmaColormap[69]=vec3(0.523633, 0.024532, 0.652901);
plasmaColormap[70]=vec3(0.529306, 0.027747, 0.651586);
plasmaColormap[71]=vec3(0.534952, 0.031217, 0.650165);
plasmaColormap[72]=vec3(0.54057, 0.03495, 0.64864);
plasmaColormap[73]=vec3(0.546157, 0.038954, 0.64701);
plasmaColormap[74]=vec3(0.551715, 0.043136, 0.645277);
plasmaColormap[75]=vec3(0.557243, 0.047331, 0.643443);
plasmaColormap[76]=vec3(0.562738, 0.051545, 0.641509);
plasmaColormap[77]=vec3(0.568201, 0.055778, 0.639477);
plasmaColormap[78]=vec3(0.573632, 0.060028, 0.637349);
plasmaColormap[79]=vec3(0.579029, 0.064296, 0.635126);
plasmaColormap[80]=vec3(0.584391, 0.068579, 0.632812);
plasmaColormap[81]=vec3(0.589719, 0.072878, 0.630408);
plasmaColormap[82]=vec3(0.595011, 0.07719, 0.627917);
plasmaColormap[83]=vec3(0.600266, 0.081516, 0.625342);
plasmaColormap[84]=vec3(0.605485, 0.085854, 0.622686);
plasmaColormap[85]=vec3(0.610667, 0.090204, 0.619951);
plasmaColormap[86]=vec3(0.615812, 0.094564, 0.61714);
plasmaColormap[87]=vec3(0.620919, 0.098934, 0.614257);
plasmaColormap[88]=vec3(0.625987, 0.103312, 0.611305);
plasmaColormap[89]=vec3(0.631017, 0.107699, 0.608287);
plasmaColormap[90]=vec3(0.636008, 0.112092, 0.605205);
plasmaColormap[91]=vec3(0.640959, 0.116492, 0.602065);
plasmaColormap[92]=vec3(0.645872, 0.120898, 0.598867);
plasmaColormap[93]=vec3(0.650746, 0.125309, 0.595617);
plasmaColormap[94]=vec3(0.65558, 0.129725, 0.592317);
plasmaColormap[95]=vec3(0.660374, 0.134144, 0.588971);
plasmaColormap[96]=vec3(0.665129, 0.138566, 0.585582);
plasmaColormap[97]=vec3(0.669845, 0.142992, 0.582154);
plasmaColormap[98]=vec3(0.674522, 0.147419, 0.578688);
plasmaColormap[99]=vec3(0.67916, 0.151848, 0.575189);
plasmaColormap[100]=vec3(0.683758, 0.156278, 0.57166);
plasmaColormap[101]=vec3(0.688318, 0.160709, 0.568103);
plasmaColormap[102]=vec3(0.69284, 0.165141, 0.564522);
plasmaColormap[103]=vec3(0.697324, 0.169573, 0.560919);
plasmaColormap[104]=vec3(0.701769, 0.174005, 0.557296);
plasmaColormap[105]=vec3(0.706178, 0.178437, 0.553657);
plasmaColormap[106]=vec3(0.710549, 0.182868, 0.550004);
plasmaColormap[107]=vec3(0.714883, 0.187299, 0.546338);
plasmaColormap[108]=vec3(0.719181, 0.191729, 0.542663);
plasmaColormap[109]=vec3(0.723444, 0.196158, 0.538981);
plasmaColormap[110]=vec3(0.72767, 0.200586, 0.535293);
plasmaColormap[111]=vec3(0.731862, 0.205013, 0.531601);
plasmaColormap[112]=vec3(0.736019, 0.209439, 0.527908);
plasmaColormap[113]=vec3(0.740143, 0.213864, 0.524216);
plasmaColormap[114]=vec3(0.744232, 0.218288, 0.520524);
plasmaColormap[115]=vec3(0.748289, 0.222711, 0.516834);
plasmaColormap[116]=vec3(0.752312, 0.227133, 0.513149);
plasmaColormap[117]=vec3(0.756304, 0.231555, 0.509468);
plasmaColormap[118]=vec3(0.760264, 0.235976, 0.505794);
plasmaColormap[119]=vec3(0.764193, 0.240396, 0.502126);
plasmaColormap[120]=vec3(0.76809, 0.244817, 0.498465);
plasmaColormap[121]=vec3(0.771958, 0.249237, 0.494813);
plasmaColormap[122]=vec3(0.775796, 0.253658, 0.491171);
plasmaColormap[123]=vec3(0.779604, 0.258078, 0.487539);
plasmaColormap[124]=vec3(0.783383, 0.2625, 0.483918);
plasmaColormap[125]=vec3(0.787133, 0.266922, 0.480307);
plasmaColormap[126]=vec3(0.790855, 0.271345, 0.476706);
plasmaColormap[127]=vec3(0.794549, 0.27577, 0.473117);
plasmaColormap[128]=vec3(0.798216, 0.280197, 0.469538);
plasmaColormap[129]=vec3(0.801855, 0.284626, 0.465971);
plasmaColormap[130]=vec3(0.805467, 0.289057, 0.462415);
plasmaColormap[131]=vec3(0.809052, 0.293491, 0.45887);
plasmaColormap[132]=vec3(0.812612, 0.297928, 0.455338);
plasmaColormap[133]=vec3(0.816144, 0.302368, 0.451816);
plasmaColormap[134]=vec3(0.819651, 0.306812, 0.448306);
plasmaColormap[135]=vec3(0.823132, 0.311261, 0.444806);
plasmaColormap[136]=vec3(0.826588, 0.315714, 0.441316);
plasmaColormap[137]=vec3(0.830018, 0.320172, 0.437836);
plasmaColormap[138]=vec3(0.833422, 0.324635, 0.434366);
plasmaColormap[139]=vec3(0.836801, 0.329105, 0.430905);
plasmaColormap[140]=vec3(0.840155, 0.33358, 0.427455);
plasmaColormap[141]=vec3(0.843484, 0.338062, 0.424013);
plasmaColormap[142]=vec3(0.846788, 0.342551, 0.420579);
plasmaColormap[143]=vec3(0.850066, 0.347048, 0.417153);
plasmaColormap[144]=vec3(0.853319, 0.351553, 0.413734);
plasmaColormap[145]=vec3(0.856547, 0.356066, 0.410322);
plasmaColormap[146]=vec3(0.85975, 0.360588, 0.406917);
plasmaColormap[147]=vec3(0.862927, 0.365119, 0.403519);
plasmaColormap[148]=vec3(0.866078, 0.36966, 0.400126);
plasmaColormap[149]=vec3(0.869203, 0.374212, 0.396738);
plasmaColormap[150]=vec3(0.872303, 0.378774, 0.393355);
plasmaColormap[151]=vec3(0.875376, 0.383347, 0.389976);
plasmaColormap[152]=vec3(0.878423, 0.387932, 0.3866);
plasmaColormap[153]=vec3(0.881443, 0.392529, 0.383229);
plasmaColormap[154]=vec3(0.884436, 0.397139, 0.37986);
plasmaColormap[155]=vec3(0.887402, 0.401762, 0.376494);
plasmaColormap[156]=vec3(0.89034, 0.406398, 0.37313);
plasmaColormap[157]=vec3(0.89325, 0.411048, 0.369768);
plasmaColormap[158]=vec3(0.896131, 0.415712, 0.366407);
plasmaColormap[159]=vec3(0.898984, 0.420392, 0.363047);
plasmaColormap[160]=vec3(0.901807, 0.425087, 0.359688);
plasmaColormap[161]=vec3(0.904601, 0.429797, 0.356329);
plasmaColormap[162]=vec3(0.907365, 0.434524, 0.35297);
plasmaColormap[163]=vec3(0.910098, 0.439268, 0.34961);
plasmaColormap[164]=vec3(0.9128, 0.444029, 0.346251);
plasmaColormap[165]=vec3(0.915471, 0.448807, 0.34289);
plasmaColormap[166]=vec3(0.918109, 0.453603, 0.339529);
plasmaColormap[167]=vec3(0.920714, 0.458417, 0.336166);
plasmaColormap[168]=vec3(0.923287, 0.463251, 0.332801);
plasmaColormap[169]=vec3(0.925825, 0.468103, 0.329435);
plasmaColormap[170]=vec3(0.928329, 0.472975, 0.326067);
plasmaColormap[171]=vec3(0.930798, 0.477867, 0.322697);
plasmaColormap[172]=vec3(0.933232, 0.48278, 0.319325);
plasmaColormap[173]=vec3(0.93563, 0.487712, 0.315952);
plasmaColormap[174]=vec3(0.93799, 0.492667, 0.312575);
plasmaColormap[175]=vec3(0.940313, 0.497642, 0.309197);
plasmaColormap[176]=vec3(0.942598, 0.502639, 0.305816);
plasmaColormap[177]=vec3(0.944844, 0.507658, 0.302433);
plasmaColormap[178]=vec3(0.947051, 0.512699, 0.299049);
plasmaColormap[179]=vec3(0.949217, 0.517763, 0.295662);
plasmaColormap[180]=vec3(0.951344, 0.52285, 0.292275);
plasmaColormap[181]=vec3(0.953428, 0.52796, 0.288883);
plasmaColormap[182]=vec3(0.95547, 0.533093, 0.28549);
plasmaColormap[183]=vec3(0.957469, 0.53825, 0.282096);
plasmaColormap[184]=vec3(0.959424, 0.543431, 0.278701);
plasmaColormap[185]=vec3(0.961336, 0.548636, 0.275305);
plasmaColormap[186]=vec3(0.963203, 0.553865, 0.271909);
plasmaColormap[187]=vec3(0.965024, 0.559118, 0.268513);
plasmaColormap[188]=vec3(0.966798, 0.564396, 0.265118);
plasmaColormap[189]=vec3(0.968526, 0.5697, 0.261721);
plasmaColormap[190]=vec3(0.970205, 0.575028, 0.258325);
plasmaColormap[191]=vec3(0.971835, 0.580382, 0.254931);
plasmaColormap[192]=vec3(0.973416, 0.585761, 0.25154);
plasmaColormap[193]=vec3(0.974947, 0.591165, 0.248151);
plasmaColormap[194]=vec3(0.976428, 0.596595, 0.244767);
plasmaColormap[195]=vec3(0.977856, 0.602051, 0.241387);
plasmaColormap[196]=vec3(0.979233, 0.607532, 0.238013);
plasmaColormap[197]=vec3(0.980556, 0.613039, 0.234646);
plasmaColormap[198]=vec3(0.981826, 0.618572, 0.231287);
plasmaColormap[199]=vec3(0.983041, 0.624131, 0.227937);
plasmaColormap[200]=vec3(0.984199, 0.629718, 0.224595);
plasmaColormap[201]=vec3(0.985301, 0.63533, 0.221265);
plasmaColormap[202]=vec3(0.986345, 0.640969, 0.217948);
plasmaColormap[203]=vec3(0.987332, 0.646633, 0.214648);
plasmaColormap[204]=vec3(0.98826, 0.652325, 0.211364);
plasmaColormap[205]=vec3(0.989128, 0.658043, 0.2081);
plasmaColormap[206]=vec3(0.989935, 0.663787, 0.204859);
plasmaColormap[207]=vec3(0.990681, 0.669558, 0.201642);
plasmaColormap[208]=vec3(0.991365, 0.675355, 0.198453);
plasmaColormap[209]=vec3(0.991985, 0.681179, 0.195295);
plasmaColormap[210]=vec3(0.992541, 0.68703, 0.19217);
plasmaColormap[211]=vec3(0.993032, 0.692907, 0.189084);
plasmaColormap[212]=vec3(0.993456, 0.69881, 0.186041);
plasmaColormap[213]=vec3(0.993814, 0.704741, 0.183043);
plasmaColormap[214]=vec3(0.994103, 0.710698, 0.180097);
plasmaColormap[215]=vec3(0.994324, 0.716681, 0.177208);
plasmaColormap[216]=vec3(0.994474, 0.722691, 0.174381);
plasmaColormap[217]=vec3(0.994553, 0.728728, 0.171622);
plasmaColormap[218]=vec3(0.994561, 0.734791, 0.168938);
plasmaColormap[219]=vec3(0.994495, 0.74088, 0.166335);
plasmaColormap[220]=vec3(0.994355, 0.746995, 0.163821);
plasmaColormap[221]=vec3(0.994141, 0.753137, 0.161404);
plasmaColormap[222]=vec3(0.993851, 0.759304, 0.159092);
plasmaColormap[223]=vec3(0.993482, 0.765499, 0.156891);
plasmaColormap[224]=vec3(0.993033, 0.77172, 0.154808);
plasmaColormap[225]=vec3(0.992505, 0.777967, 0.152855);
plasmaColormap[226]=vec3(0.991897, 0.784239, 0.151042);
plasmaColormap[227]=vec3(0.991209, 0.790537, 0.149377);
plasmaColormap[228]=vec3(0.990439, 0.796859, 0.14787);
plasmaColormap[229]=vec3(0.989587, 0.803205, 0.146529);
plasmaColormap[230]=vec3(0.988648, 0.809579, 0.145357);
plasmaColormap[231]=vec3(0.987621, 0.815978, 0.144363);
plasmaColormap[232]=vec3(0.986509, 0.822401, 0.143557);
plasmaColormap[233]=vec3(0.985314, 0.828846, 0.142945);
plasmaColormap[234]=vec3(0.984031, 0.835315, 0.142528);
plasmaColormap[235]=vec3(0.982653, 0.841812, 0.142303);
plasmaColormap[236]=vec3(0.98119, 0.848329, 0.142279);
plasmaColormap[237]=vec3(0.979644, 0.854866, 0.142453);
plasmaColormap[238]=vec3(0.977995, 0.861432, 0.142808);
plasmaColormap[239]=vec3(0.976265, 0.868016, 0.143351);
plasmaColormap[240]=vec3(0.974443, 0.874622, 0.144061);
plasmaColormap[241]=vec3(0.97253, 0.88125, 0.144923);
plasmaColormap[242]=vec3(0.970533, 0.887896, 0.145919);
plasmaColormap[243]=vec3(0.968443, 0.894564, 0.147014);
plasmaColormap[244]=vec3(0.966271, 0.901249, 0.14818);
plasmaColormap[245]=vec3(0.964021, 0.90795, 0.14937);
plasmaColormap[246]=vec3(0.961681, 0.914672, 0.15052);
plasmaColormap[247]=vec3(0.959276, 0.921407, 0.151566);
plasmaColormap[248]=vec3(0.956808, 0.928152, 0.152409);
plasmaColormap[249]=vec3(0.954287, 0.934908, 0.152921);
plasmaColormap[250]=vec3(0.951726, 0.941671, 0.152925);
plasmaColormap[251]=vec3(0.949151, 0.948435, 0.152178);
plasmaColormap[252]=vec3(0.946602, 0.95519, 0.150328);
plasmaColormap[253]=vec3(0.944152, 0.961916, 0.146861);
plasmaColormap[254]=vec3(0.941896, 0.96859, 0.140956);
plasmaColormap[255]=vec3(0.940015, 0.975158, 0.131326);
if (computeDiff == 0) // Compute color
fColor = colorBands == 0 ? vec4(colorOut, 1) : vec4(floor(.5 + colorBands * colorOut) / colorBands, 1);
else if (computeDiff == 1) // Compute colormapped distance
fColor = vec4(computePlasmaColormap(diffScaling * computeColorDistance(), plasmaColormap), 1);
else if (computeDiff == 2) { // Compute distance
float distance = computeColorDistance();
float r = floor(distance * 255);
float g = floor((distance - r / 255) * pow(255, 2));
float b = floor((distance - r / 255 - g / pow(255, 2)) * pow(255, 3));
fColor = vec4(r / 255, g / 255, b / 255, 1);
}
// colorOut = vec4(0.7, 0.2, 0.3, 1);
}
My question is, do you have any suggestions to improve this shader? Maybe I can do something on the variant plasmaColormap
. I don't really know where to look or what can be optimized here.