現在、約15k行のLinux(313.0 nvドライバーを使用したNVIDIA 360Mカード)でOpenGL 3.1(GLSLバージョン330を使用)アプリケーションを作成しています。私の問題は、私の頂点シェーダーの 1 つで、実際には何もしないはずのコードに最小限の変更を加えるだけで、大幅なパフォーマンスの低下が発生する可能性があることです。
例えば:
// With this solution my program runs with 3-5 fps
for(int i = 0; i < 4; ++i) {
vout.shadowCoord[i] = uShadowCP[i] * w_pos;
}
// But with this it runs with 30+ fps
vout.shadowCoord[0] = uShadowCP[0] * w_pos;
vout.shadowCoord[1] = uShadowCP[1] * w_pos;
vout.shadowCoord[2] = uShadowCP[2] * w_pos;
vout.shadowCoord[3] = uShadowCP[3] * w_pos;
// This works with 30+ fps too
vec4 shadowCoords[4];
for(int i = 0; i < 4; ++i) {
shadowCoords[i] = uShadowCP[i] * w_pos;
}
for(int i = 0; i < 4; ++i) {
vout.shadowCoord[i] = shadowCoords[i];
}
またはこれを考慮してください:
uniform int uNumUsedShadowMaps = 4; // edit: I called this "random_uniform" in the original question
// 8 fps
for(int i = 0; i < min(uNumUsedShadowMaps, 4); ++i) {
vout.shadowCoord[i] = vec4(1.0);
}
// 30+ fps
for(int i = 0; i < 4; ++i) {
if(i < uNumUsedShadowMaps) {
vout.shadowCoord[i] = vec4(1.0);
} else {
vout.shadowCoord[i] = vec4(0.0);
}
}
この問題が発生したシェーダー コード全体を参照してください: http://pastebin.com/LK5CNJPD
何がこれらを引き起こす可能性があるかについて、どんなアイデアも高く評価されるように.