Ich habe einen Satz von X-, Y- und Z-Werten in einem regelmäßigen Raster, aus dem ich mit C++ eine farbgefüllte Konturdarstellung erstellen muss. Ich habe gegoogelt auf diese für Tage und der Konsens scheint zu sein, dass dies mit einer 1D-Textur-Map in OpenGL erreichbar ist. Ich habe jedoch kein einziges Beispiel dafür gefunden, wie man das tatsächlich macht, und auch das Lesen der OpenGL-Dokumentation bringt mich nicht weiter. Meine Verwirrung läuft auf eine Kernfrage hinaus:
Meine Daten enthalten nicht für jedes Pixel einen X- und Y-Wert. Es handelt sich um ein regelmäßig angeordnetes Raster mit Daten im Abstand von 4 Einheiten auf der X- und Y-Achse und einem positiven ganzzahligen Z-Wert.
Zum Beispiel: (0, 0, 1), (4, 0, 1), (8, 0, 2), (0, 4, 2), (0, 8, 4), (4, 4, 3), usw.
Da die Konturen auf dem Z-Wert basieren würden und es Lücken zwischen den Datenpunkten gibt, stellt sich die Frage, wie durch die Anwendung einer 1D-Textur die Konturierung dieser Daten erreicht werden kann (d. h. wie wird durch die Anwendung einer 1D-Textur zwischen den Rasterpunkten interpoliert)?
Am ehesten habe ich ein Beispiel dafür in der Online-Version des Redbook (http://fly.cc.fer.hr/~unreal/theredbook/chapter09.html) im Beispiel der Teekanne gefunden, aber ich gehe davon aus, dass das Teekannenmodell Daten für jedes Pixel hat und daher keine Interpolation zwischen Datenpunkten erforderlich ist.
Wenn jemand Licht auf meine Frage oder besser noch auf ein konkretes Beispiel für die Arbeit mit einem 1D-Textur-Map auf diese Weise würde ich für immer dankbar sein, wie ich 2 Tage auf dieses Projekt mit wenig zu zeigen, für sie verbrannt habe.
EDITAR:
Der folgende Code wird von mir verwendet, und obwohl er die Punkte an der richtigen Stelle anzeigt, findet keine Interpolation oder Konturierung statt - die Punkte werden einfach als Punkte angezeigt.
//Create a 1D image - for this example it's just a red line
int stripeImageWidth = 32;
GLubyte stripeImage[3*stripeImageWidth];
for (int j = 0; j < stripeImageWidth; j++) {
stripeImage[3*j] = j < 2 ? 0 : 255;
stripeImage[3*j+1] = 255;
stripeImage[3*j+2] = 255;
}
glDisable(GL_TEXTURE_2D);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage1D(GL_TEXTURE_1D, 0, 3, stripeImageWidth, 0, GL_RGB, GL_UNSIGNED_BYTE, stripeImage);
glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glTexGeni( GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR );
float s[4] = { 0,1,0,0 };
glTexGenfv( GL_S, GL_OBJECT_PLANE, s );
glEnable( GL_TEXTURE_GEN_S );
glEnable( GL_TEXTURE_1D );
glBegin(GL_POINTS);
//_coords contains X,Y,Z data - Z is the value that I'm trying to contour
for (int x = 0; x < _coords.size(); ++x)
{
glTexCoord1f(static_cast<ValueCoord*>(_coords[x])->GetValue());
glVertex3f(_coords[x]->GetX(), _coords[x]->GetY(), zIndex);
}
glEnd();