Kann einen Texturfehler nicht finden

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Kann einen Texturfehler nicht finden

    Hallo,
    es ist das erste Mal, dass ich mich mit Texturen beschäftige, jetzt will ich erstmal einfehlerfreies Produkt erhalten. Schaut euch doch bitte
    das Bild (w=348, h= 396) mit dem Fehler und die 'displayTexture' Methode an. Ich Hab' in Wolfgangs Buch gestöbert und nichts gefunden.

    Danke im Voraus für eure Stellungnahmen

    Uwe
  • Och mensch, schon wieder so ein lieblos zusammengekleisterter Anhang. Wenn Du nur eine Datei hast, kannst Du sie auch gleich in den Post packen.

    Für mich sieht es so aus, als ob du zwei Probleme.

    Das erste: sieht der Code so aus, als ob er ziemlich direkt aus dem Checkerboard-Beispiel vom Wolf kopiert wäre. Da wird die Textur im displayTexture gekachelt. Bei einem Schachbrettmuster ist das ok, aber bei deiner Textur eher nicht. Also TexCoords immer im Bereich 0-1.

    Das zweite: Es kann sein, dass du irgendwo in deiner Texturkopierorgie die Basisadresse verwuselst (wie oft willst du die Textur eigentlich noch kopieren? Vom NSArray in textureColorArray, von da in checkerImage und von da zu OpenGL ist nicht besonders elegant). Die Stelle scheint aber nicht in dem angehängten Code zu sein, sondern woanders. Dadurch kann sich die ganze Textur verschieben.

    Hier ein kleines Beispiel, das direkt ein Ljapunow-Diagramm in einer Textur aufbaut und darstellt (Zirkon City). Immer noch nicht schön, aber weniger unnützes hin- und herkopiere. Und es packt die Bitmap nicht in verschachtelte NSArrays, das ist keine besonders gute Idee.

    C-Quellcode

    1. #include <stdlib.h>
    2. #include <stdio.h>
    3. #ifdef GL_VERSION_1_1
    4. static GLuint texName;
    5. #endif
    6. #import "MyOpenGLView+VRTexture.h"
    7. #define checkImageWidth 348
    8. #define checkImageHeight 396
    9. static GLubyte checkImage[checkImageHeight][checkImageWidth][4];
    10. static double minA = 3.4;
    11. static double maxA = 4.0;
    12. static double minB = 2.5;
    13. static double maxB = 3.4;
    14. static int numIter = 500;
    15. static uint8_t ljapunowSequence[] = { 1,1,1,1,1,0,0,0,0,0 };
    16. static uint8_t blendColors[] = { 255,0,0, 255,255,0, 0,255,0, 0,255,255, 0,0,255, 255,0,255 };
    17. static double blendMin = -1.0;
    18. static double blendMax = 0.5;
    19. double ljapunowIteration(double x, double y) {
    20. double a = minA + (maxA - minA) * x;
    21. double b = minB + (maxB - minB) * y;
    22. double xn = 0.5;
    23. double sum = 0.0;
    24. for (int n = 0; n < numIter; n++) {
    25. double rn = ljapunowSequence[n % sizeof(ljapunowSequence)] ? b : a;
    26. xn = rn * xn * (1.0-xn);
    27. sum += log(fabs(rn * (1.0 - 2.0*xn)));
    28. }
    29. return sum / numIter;
    30. }
    31. void colorBlend(double val, GLubyte* outColor) {
    32. int numBlendColors = sizeof(blendColors) / 3;
    33. double blend = numBlendColors * (val-blendMin) / (blendMax - blendMin);
    34. if (blend < 0) blend = 0;
    35. if (blend > numBlendColors) blend = numBlendColors;
    36. int blendBase = (int)blend;
    37. if (blendBase < 0) blendBase = 0;
    38. if (blendBase >= numBlendColors) blendBase = numBlendColors - 1;
    39. double blendAlpha = blend - blendBase;
    40. if (blendAlpha < 0) blendAlpha = 0;
    41. if (blendAlpha > 1.0) blendAlpha = 1.0;
    42. double r = blendColors[3*blendBase ] * (1.0 - blendAlpha) + blendColors[3*blendBase+3] * blendAlpha;
    43. double g = blendColors[3*blendBase+1] * (1.0 - blendAlpha) + blendColors[3*blendBase+4] * blendAlpha;
    44. double b = blendColors[3*blendBase+2] * (1.0 - blendAlpha) + blendColors[3*blendBase+5] * blendAlpha;
    45. outColor[0] = (int)r;
    46. outColor[1] = (int)g;
    47. outColor[2] = (int)b;
    48. outColor[3] = 255;
    49. }
    50. void fillColorAt(int x, int y, GLubyte* outColor) {
    51. double normX = ((double)x / (double)checkImageWidth);
    52. double normY = ((double)y / (double)checkImageHeight);
    53. double val = ljapunowIteration(normY, normX);
    54. colorBlend(val, outColor);
    55. }
    56. void makeTex(void) {
    57. for (int ii = 0; ii < checkImageHeight; ii++) {
    58. for (int jj = 0; jj < checkImageWidth; jj++) {
    59. fillColorAt(jj, ii, &(checkImage[ii] [jj] [0]));
    60. }
    61. }
    62. }
    63. @implementation MyOpenGLView (VRTexture)
    64. -(void) initTexture {
    65. glClearColor (0.0, 0.0, 0.0, 0.0);
    66. glShadeModel(GL_FLAT);
    67. glEnable(GL_DEPTH_TEST);
    68. makeTex();
    69. glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    70. #ifdef GL_VERSION_1_1
    71. glGenTextures(1, &texName);
    72. glBindTexture(GL_TEXTURE_2D, texName);
    73. #endif
    74. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    75. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    76. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    77. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    78. #ifdef GL_VERSION_1_1
    79. glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth, checkImageHeight,
    80. 0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage);
    81. #else
    82. glTexImage2D(GL_TEXTURE_2D, 0, 4, checkImageWidth, checkImageHeight,
    83. 0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage);
    84. #endif
    85. }
    86. -(void)displayTexture {
    87. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    88. glEnable(GL_TEXTURE_2D);
    89. glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
    90. #ifdef GL_VERSION_1_1
    91. glBindTexture(GL_TEXTURE_2D, texName);
    92. #endif
    93. glBegin(GL_QUADS);
    94. glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, 0.0);
    95. glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, 0.0);
    96. glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, 0.0);
    97. glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, 0.0);
    98. glEnd();
    99. glFlush();
    100. glDisable(GL_TEXTURE_2D);
    101. }
    102. @end
    Alles anzeigen
    Multigrad - 360°-Produktfotografie für den Mac
  • Auf den ersten Blick stimmen die UVs nicht (Code hab ich nur kurz angeschaut), nimm einfach mal 0 bzw. 1, du willst ja nicht kacheln, von daher ist mein Beispiel aus dem Buch nichts das richtige.
    Es gibt unendlich viele Möglichkeiten das was du machen willst, umzusetzen, ich denke am einfachsten wird es sein, ein NSImage zu erzeugen (Achtung Größe beachten)
    und dort direkt rein zu malen. Dann nimmst du das Image und erzeugst dadraus ne Textur, wie gesagt die UVs gehen von 0,0 - 1,1

    In Zukunft solltest du mal das ganze Projekt anhängen, es ist mühselig erst mal ein Projekt zu erzeugen und dann das Gedöns zu kopieren...
  • Zuerst einmal danke für die Anteilnahme.
    Was die Dateianhänge betrifft, gerne würde ich das ganze Projekt anhängen, das ist aber grösser als 150 kB, ich müsste es filetieren und ihr müsstet es braten.

    Das file von Mattik ist prima, ich habe schon angefangen es in meinem Sinne zu editieren, das colorArray hab' ich in zwei aufgeteilt, weil der Rückgabewert der Iterationsfunktion positiv oder, na, wer weiss es ?, sein kann. Der positive Wert ist um so weniger chaotisch, je dichter er an 0.0 heranreicht.
    Bei 0.0 ist er indifferent, so wie eine Kugel auf einer Ebene.
    Dann muss ich eine erste,kurze, Schleife vorhalten, damit der Einfluss des Anfangswertes abklingt.
    In der Hauptschleife wird nicht der aktueller Funktionswert aufsummiert, sondern die erste Ableitung, die Geschwindigkeit. Je grösser die Differenz an Geschwindigkeit zwischen zwei benachbarten Punkten ist, um so grösser ist das Chaos. Siehe Auffahrunfall.

    Jetzt muss ich zum Dokter, die Abetis abholen.

    Uwe

    ps ich liebe Kalauer
  • Ich hab' den Textur-Teil neu geschrieben, es sind jetzt kein c code vorhanden. Leider wird drawRect nicht aufgerufen.
    Versuchsweise die Berechnung ausgeschlossen und Einsen in das image array geschrieben, müsste ein weisses Quadrat erscheinen, nix.
    Weiss nicht mehr weiter, hab das Projekt angehängt.

    Uwe
  • Setz' mal einen Breakpoint in drawRect oder NSLog in drawRect. Die wird aufgerufen.
    Oder füge folgende Zeile vor glClear ein:

    Quellcode

    1. glClearColor(arc4random_uniform(256)/256.0, arc4random_uniform(256)/256.0, arc4random_uniform(256)/256.0, 1.0);

    Dann siehst Du, dass brav neu gezeichnet wird - aber Dein Quad ist immer schwarz. Aber Du hast ja funktionierenden Samplecode für Texturierung.

    OpenGL kann gemein sein. Bau' Dir doch wenigstens zum Debuggen einen konventionellen 2D-ImageView rein, da hast Du wesentlich weniger Sollbruchstellen.
    Multigrad - 360°-Produktfotografie für den Mac