Frage

Aktualisieren:Dies scheint nur bei einigen Computern ein Problem zu sein.Der normale, intuitive Code scheint auf meinem Heimcomputer gut zu funktionieren, aber auf dem Computer am Arbeitsplatz gibt es Probleme.

Heimcomputer:(keine Probleme)

  • Windows XP Professional SP3
  • AMD Athlon 64 X2 3800+ Dual Core 2,0 GHz
  • NVIDIA GeForce 7800 GT
  • 2 GB RAM

Arbeitscomputer:(Diese Frage gilt für diesen Computer)

  • Windows XP Professional SP3
  • Intel Pentium 4 2,8 GHz (Dual Core, glaube ich)
  • Intel 82945G Express-Chipsatzfamilie
  • 1 GB RAM

Ursprünglicher Beitrag:

Ich versuche, mithilfe von Psychtoolbox in Matlab mit dem folgenden Code eine sehr einfache Textur auf einen Teil des Bildschirms anzuwenden:

win = Screen('OpenWindow', 0, 127); % open window and obtain window pointer
tex = Screen('MakeTexture', win, [255 0;0 255]); % get texture pointer
% draw texture. Args: command, window pointer, texture pointer, source
% (i.e. the entire 2x2 matrix), destination (a 100x100 square), rotation
% (none) and filtering (nearest neighbour)
Screen('DrawTexture', win, tex, [0 0 2 2], [100 100 200 200], 0, 0);
Screen('Flip', win); % flip the buffer so the texture is drawn
KbWait; % wait for keystroke
Screen('Close', win); % close screen

Jetzt würde ich Folgendes erwarten (vier gleich große Quadrate):

Expected result

Aber stattdessen bekomme ich Folgendes (rechte und untere Seite sind abgeschnitten und das obere linke Quadrat ist zu groß):

Actual result

Offensichtlich ist das Zielrechteck viel größer als das Quellrechteck, daher muss die Textur vergrößert werden.Ich würde erwarten, dass dies symmetrisch wie im ersten Bild geschieht, und das ist es auch, was ich brauche.Warum passiert das nicht und was kann ich dagegen tun?

Ich habe auch versucht, [128 0 1152 1024] als Zielrechteck zu verwenden (da es das Quadrat in der Mitte meines Bildschirms ist).In diesem Fall sind alle Seiten 1024, was bedeutet, dass jedes beteiligte Rechteck eine Zweierpotenz hat.Das hilft nicht.Das Vergrößern des Schachbretts führt zu einer ähnlichen Situation, in der die rechte und die unterste Seite nicht korrekt angezeigt werden.

Wie gesagt, ich verwende Psychtoolbox, aber ich weiß, dass es unter der Haube OpenGL verwendet.Ich weiß auch nicht viel über OpenGL, aber vielleicht kann jemand, der es weiß, helfen, ohne Matlab zu kennen.Ich weiß nicht.

Vielen Dank für Ihre Zeit!

War es hilfreich?

Lösung

Ohne viel über die Psychtoolbox zu wissen, aber nachdem ich mich in Matlab viel mit Grafiken und Benutzeroberflächen befasst hatte, wäre das erste, was ich versuchen würde, mit der vierten Eingabe zu fummeln Bildschirm (die "Quell" -Ingabe). Versuchen Sie, jede Ecke durch halbe Pixel- und Ganzpixelwerte zu verschieben. Zum Beispiel wäre das erste, was ich versuchen würde:

Screen('DrawTexture', win, tex, [0 0 2.5 2.5], [100 100 200 200], 0, 0);

Und wenn das nichts zu tun schien, würde ich als nächstes versuchen:

Screen('DrawTexture', win, tex, [0 0 3 3], [100 100 200 200], 0, 0);

Meine Argumentation für diesen Rat: Ich habe manchmal bemerkt, dass Bilder oder GUI-Steuerelemente in meinen Figuren von einem Pixel ausgeschaltet zu sein scheinen, von dem ich nur spekulieren kann, dass es sich um einen runden Ausfallfehler handelt, wenn ich sie skalieren oder positioniert.

Das ist der beste Rat, den ich geben kann. Ich hoffe es hilft!

Andere Tipps

Obwohl ich nicht viel weiß (lesen Sie:egal) Matlab, ich weiß, dass Texturen in OpenGL sehr wählerisch sind.Als ich das letzte Mal überprüft habe, erfordert OpenGL, dass Texturdateien quadratisch sind und eine Zweierpotenz haben (d. h.128 x 128, 256 x 256, 512 x 512).

Wenn dies nicht der Fall ist, soll OpenGL die Datei dort mit den entsprechenden weißen Pixeln auffüllen, wo sie benötigt werden, um diese Bedingung zu erfüllen. Allerdings kann es je nach dem System, auf dem Sie es ausführen, ein Kinderspiel sein.

Ich schlage vor, sicherzustellen, dass Ihre Schachbrettstruktur diesen Anforderungen entspricht.

Außerdem kann ich anhand Ihres veröffentlichten Codes nicht ganz sicher sein, aber OpenGL erwartet, dass Sie die Ecken Ihrer Textur den Ecken des Objekts zuordnen, das Sie texturieren möchten.

Noch ein Tipp: Versuchen Sie es vielleicht mit einem linearen Filter anstelle des nächsten Nachbarn.Es ist rechenintensiver, führt aber zu einem besseren Bild.Das wird am Ende wahrscheinlich keine Rolle spielen.

Obwohl diese Hilfe nicht Matlab-spezifisch ist, hoffe ich, dass sie nützlich ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top