优化片段着色器的性能

问题描述

朋友

我需要帮助优化以下片段着色器:它看起来很长,但实际上没有。它将初始化一个包含256个元素的长数组。

片段:

#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,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);
}

我的问题是,您对改进此着色器有什么建议吗?也许我可以对变体plasmaColormap做些什么。我真的不知道在哪里看或可以在这里进行优化。

解决方法

您至少可以做的就是将plasmaColors[256]放入这样的常量数组中。

const vec3 plasmaColormap[256] = vec3[256](
    vec3(0.050383,0.029803,0.527975),vec3(0.063536,0.028426,0.533124),... all the rest of the values
);

并在computePlasmaColormap函数中更改引用。

第二种方法是按照注释中的建议将颜色图放入纹理或均匀的缓冲区中。

希望这可以澄清一些问题。