Frage

Ich habe eine Textur im RGBA-Format mit verschiedenen Alpha-Werten in den Speicher geladen.

Das Bild wird wie folgt geladen:

 GLuint texture = 0;
 glGenTextures(1, &texture);
 glBindTexture(GL_TEXTURE_2D, texture);
 self.texNum = texture;

 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR); 

 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, self.imageWidth, self.imageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, [self.imageData bytes]);

Ich möchte wissen, wie ich diese Textur zeichnen kann, sodass der Alphakanal im Bild nur als Einsen behandelt wird und die Textur wie ein RGB-Bild gezeichnet wird.

Betrachten Sie das Basisbild:

http://www.ldeo.columbia.edu/~jcoplan/alpha/base.png

Dieses Bild ist eine Progression von 0 bis 255 Alpha und hat durchgehend den RGB-Wert 255,0,0

Wenn ich es jedoch mit deaktivierter Überblendung zeichne, erhalte ich ein Bild, das wie folgt aussieht:www.ldeo.columbia.edu/~jcoplan/alpha/no_alpha.png

Wenn ich wirklich ein Bild möchte, das so aussieht:www.ldeo.columbia.edu/~jcoplan/alpha/correct.png

Ich würde mich sehr über einige Hinweise freuen, damit der Alphakanal vollständig ignoriert wird.Beachten Sie, dass ich das Bild zunächst nicht einfach als RGB laden kann, da ich den Alphakanal an anderen Stellen benötige.

Bearbeiten:Ich habe versucht, GL_COMBINE zu verwenden, um mein Problem wie folgt zu lösen:

glColorf(1,1,1,1);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PRIMARY_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); 
[self drawTexture];

Aber immer noch kein Glück, es zieht immer noch Schwarz zu Rot.

War es hilfreich?

Lösung

Ich habe eine Textur, die in den Speicher geladen ist, der vom RGBA-Format mit verschiedenen Alpha-Werten ist

gldiak (gl_blend)

Wenn ich es jedoch mit der Mischung, deaktiviert, deaktiviert, bekomme ich ein Bild, das aussieht: www.ldeo.columbia.edu/~jcoplan/alpha/no_alpha.png

Dies geschieht, weil in Ihrem Quellbild alle transparenten Pixel schwarz sind.Es ist ein Problem mit Ihrem Textur / Bild oder möglicherweise mit Loader-Funktion, aber es ist kein OpenGL-Problem.

Sie könnten wahrscheinlich versuchen, es mit GLTEXENV (GL_COMBINE ...) zu beheben (dh Mischen Sie Texturfarbe mit der zugrunde liegenden Farbe, die auf dem Alphakanal basiert), aber da ich noch nicht so etwas getan habe, bin ich nicht ganz sicher,und kann Ihnen keine genauen Operanden geben.Es war in Direct3D9 (unter Verwendung von d3dtop_modulatealpha_addcolor) möglich, so dass höchstwahrscheinlich eine Möglichkeit besteht, es in OpenGL zu tun.

Andere Tipps

Sie sollten das Mischen nicht deaktivieren, sondern den glblendfunc mit ordnungsgemäßemParameter:

generasacodicetagpre.

Oder Sie können OpenGL anweisen, nur die RGB-Kanäle Ihres Bildes hochzuladen

glPixelStorei(GL_UNPACK_ALIGNMENT, 4)

bevor Sie anrufen glTexImage2D mit Formateinstellung auf GL_RGB.Dadurch wird das vierte Byte jedes Pixels übersprungen, d. h.der Alphakanal.

Ich hatte ein ähnliches Problem, und fand heraus, dass es sich darum bemüht, dass die IOS-Image-Loading auf den RBG-Werten ein Voraufführer tat (wie in einigen der anderen Antworten und Kommentare hier diskutiert wurde).Ich würde gerne wissen, ob es eine Möglichkeit ist, die Vorvermutzung zu deaktivieren, aber in der Zwischenzeit bin ich inzwischen "nicht vormultipliziert" mit dem von Dieser Thread und Dieser Thread .

generasacodicetagpre.

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