Frage

Ich bin die Anzeige eine Textur, die ich ohne aus zu beeinflussen, die Bilddaten manipulieren will. Ich mag die Texelwerte klemmen können, so dass alles, was unter dem unteren Wert 0 wird, etwas über dem oberen Wert 0 wird, und alles, was zwischen linear abgebildet von 0 auf 1

Ursprünglich auf mein Bild zeige ich glDrawPixels wurde mit. Und das Problem zu lösen oben ich eine Farbkarte mit glPixelMap schaffen würde. Das funktionierte wunderbar. Jedoch aus Performance-Gründen habe ich mit Texturen begonnen mein Bild anzuzeigen. Der glPixelMap Ansatz scheint nicht mehr zu funktionieren. Nun kann dieser Ansatz funktionieren, aber ich war nicht in der Lage zu bekommen, daran zu arbeiten.

Ich habe dann versucht glPixelTransfer mit Skalen und Vorspannung setzen. Dies schien eine Art von Wirkung zu haben (nicht unbedingt der gewünschten) auf den ersten Durchlauf, aber wenn die oberen und unteren Randbedingungen geändert wurden, wurde keine Wirkung sichtbar.

Ich wurde dann gesagt, dass Fragment-Shader funktionieren würde. Aber nach einem Aufruf glGetString (GL_EXTENSIONS), fand ich, dass GL_ARB_fragment_shader nicht unterstützt wurde. Plus, ein Aufruf an glCreateShaderObjectARB eine Nullreferenceexception führen.

So, jetzt bin ich ratlos. Was soll ich machen? Bitte um Hilfe.


Was auch immer funktionieren kann ich bin bereit, zu versuchen. Der Hersteller ist Intel und der Renderer ist Intel 945G. Ich bin leider an eine Grafikkarte beschränkt, die auf dem Motherboard integriert ist, und hat nur 1,4 gl.

Vielen Dank für Ihre Antwort so weit.

War es hilfreich?

Lösung

Wenn Sie eine ziemlich alte Grafikkarte haben, ist es überraschend, dass Sie nicht fragment Shader-Unterstützung haben. Ich würde vorschlagen, dass Sie versuchen, doppelte Kontrolle mit dieser .

Auch Sie sind sicher, dass Sie etwas über dem Maximalwert wollen 0 sein? Vielleicht bedeutete Sie 1? Wenn Sie 1 bedeuten und nicht 0, dann ist ziemlich langatmige Weise zu tun, was Sie fragen.

Die kondensierte Antwort ist, dass Sie mehrere Rendering-Pässe verwenden. Zuerst Sie das Bild mit normaler Intensität machen. Dann sind Sie subtraktiven Mischung verwenden (aufblicken glBlendEquation) Ihr Minimalwert zu subtrahieren. Dann nutzen Sie additive Mischung alles von 1 / (Max-Min) multiplizieren, bis (die mehrere Durchgänge benötigen).

Wenn Sie das wirklich tun möchten, nutzen Sie bitte die GL_VENDOR und GL_RENDERER für Ihre Grafikkarte Post zurück.

Edit: Hmm. Intel 945G nicht ARB_fragment_shader haben, aber es hat ARB_fragment_program haben, die auch den Trick tun wird.

Ihr fragment Code soll wie folgt aussehen (aber es ist schon eine Weile her, dass ich jede schrieb so ist es wahrscheinlich abgehört)

!!ARBfp1.0
ATTRIB tex = fragment.texcoord[0]
PARAM cbias = program.local[0]
PARAM cscale = program.local[1]
OUTPUT cout = result.color

TEMP tmp
TXP tmp, tex, texture[0], 2D
SUB tmp, tmp, cbias
MUL cout, tmp, cscale

END 

Sie laden diese in OpenGL wie folgt:

GLuint prog;
glEnable(GL_FRAGMENT_PROGRAM_ARB);
glGenProgramsARB(1, &prog);
glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, prog);
glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(src), src);
glDisable(GL_FRAGMENT_PROGRAM_ARB);

Dann vor dem Rendern der Geometrie, die Sie tun dies:

glEnable(GL_FRAGMENT_PROGRAM_ARB);
glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, prog);
colour4f cbias = cmin;
colour4f cscale = 1.0f / (cmax-cmin);
glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 0, cbias.r, cbias.g, cbias.b, cbias.a);
glProgramLocalParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 1, cscale.r, cscale.g, cscale.b, cscale.a);

//Draw your textured geometry

glDisable(GL_FRAGMENT_PROGRAM_ARB);

Andere Tipps

Auch sehen, ob die GL_ARB_fragment_program Erweiterung unterstützt wird. Diese Verlängerung unterstützt die Fragment-Programme ASM-Stil. Das soll in OpenGL 1.4 unterstützt werden.

Es ist wirklich bedauerlich, dass Sie solch eine alte Version von OpenGL verwenden. Können Sie mit Ihrer Karte aktualisieren?

Für eine modernere OGL 2.x, das ist genau die Art von Programm, das GLSL für ist. Große Dokumentation finden Sie hier:

OpenGL Dokumentation

OpenGL Shading Langauge

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