Ich bin ein Raytracing-Programm mit VS2015-Community implementieren. Das Programm füllt einen Farbpuffer in Bildschirmgröße (width * height
mit dem Elementtyp Eigen::Vector3f
) und speichert den Inhalt des Puffers in einer ppm-Datei.Unterschiedliches Ergebnis, wenn Release x64-Konfiguration in VS2015
Die Grundschleife (Anmerkung am Ende der äußeren Schleife des Ausgangsabschnittes):
using Vec3f = Eigen::Vector3f;
Vec3f * buffer = new Vec3f[w * h];
// for each pixel
for (int y = 0; y < h; y++) for (int x = 0; x < w; x++)
{
int const i = (h - y - 1) * w + x;
buffer[i] = Vec3f::Zero();
// 2x2 subpixel
for (int sy = 0; sy < 2; sy++) for (int sx = 0; sx < 2; sx++)
{
Vec3f r = Vec3f::Zero();
// sampling
for (int s = 0; s < samps; s++)
{
// do some computation and accumulation to r
// r = ...
}
buffer[i] = buffer[i] + r;
}
buffer[i] = buffer[i] * 0.25f;
// debug with an output section
//if (x % 16 == 0 && y % 16 == 0)
// std::cout << buffer[i] << std::endl;
}
I richtiges Ergebnis mit Konfigurationen zu erreichen:
- Debug, x86 oder x64;
- Freigabe, x86;
- Freigabe (Optimierung = \ Od), x64.
Allerdings ist der Puffer alle Null-Vektoren mit Mitteilung (Optimierung = \ O1 oder \ O2 oder \ Ox), x64, und das, was ich habe ist ein schwarzes Bild.
Also mit Freigabe (Optimierung = \ O1 oder \ O2 oder \ Ox), x64, habe ich den Ausgabeabschnitt auskommentiert, um die Werte im Puffer zu überprüfen. Das Seltsame ist, jedes Pixel, das ich überprüft habe, hat einen korrekten Wert, die nicht überprüften Pixel bleiben Null. Zum Beispiel, wenn ich alle 16 Pixel wie der obere Code zu überprüfen, werde ich ein Bild wie diese erhalten (256 * 256 schwarz tessellated alle 16 Pixel):
ich einige Materialien wie Surviving the Release Version gegoogelt und gelesen, aber immer noch keine Ahnung. Könnte jemand Erfahrungen mit diesen Problemen machen?
Update: Der obige Code ist nicht so detailliert, voller Code ist here, hängt von Eigen 3.2.6 ab.
Können Sie Ihr Beispiel ein bisschen mehr ausprägen? Nämlich deine Berechnungen für "r". Ohne in der Lage zu sein, Ihre Ausgabe zu reproduzieren, sind alle Antworten, die Sie erhalten, ein Rätselraten. Und obwohl Sie sagen, dass Sie keine Lösung für dieses Problem suchen, sondern eher allgemeine "Erfahrungen", werden Fragen dieser Art oft als unwichtig (zu weit gefasst) betrachtet. Wenn jedoch ein bestimmtes Problem angezeigt wird, erhalten Sie möglicherweise Antworten mit einer allgemeineren Einsicht. –
@AviGinsburg Die Berechnungen für 'r' sind zu kompliziert, deshalb füge ich den Link des vollständigen Codes am Ende der Frage an. – stanleyerror
* "Zu kompliziert" * ist eine Ausrede, das ist nicht sehr hilfreich. Reduzieren Sie die Berechnung, bis Sie die minimale Version haben, die noch das Verhalten aufweist. Wenn das Entfernen des Codes das Ergebnis ändert, wissen Sie, wo Sie weiter nachforschen müssen. Auf jeden Fall sollten Fragen zur SO eigenständig sein. – IInspectable