Errata
Leider hat sich im CFXTextureManager (und allen Beispielen welche Texturen nutzen) ein kleiner Speicherfehler eingeschlichen. In der MethodeNSBitmapImageRep *LoadImage(NSString *path, int shouldFlipVertical)wird das Objekt
bitmapimagerepnicht wieder gelöscht, hier fehlt ein
autoreleaseRichtig muss die Methode so aussehen:
NSBitmapImageRep *LoadImage(NSString *path, int shouldFlipVertical)
{
NSBitmapImageRep *bitmapimagerep;
NSImage *image;
image = [[[NSImage alloc] initWithContentsOfFile: path] autorelease];
bitmapimagerep = [[NSBitmapImageRep alloc] initWithData:[image TIFFRepresentation]];
if (shouldFlipVertical)
{
int bytesPerRow, lowRow, highRow;
unsigned char *pixelData, *swapRow;
bytesPerRow = [bitmapimagerep bytesPerRow];
pixelData = [bitmapimagerep bitmapData];
swapRow = (unsigned char *)malloc(bytesPerRow);
for (lowRow = 0, highRow = [bitmapimagerep pixelsHigh]-1; lowRow < highRow; lowRow++, highRow--)
{
memcpy(swapRow, &pixelData[lowRow*bytesPerRow], bytesPerRow);
memcpy(&pixelData[lowRow*bytesPerRow], &pixelData[highRow*bytesPerRow], bytesPerRow);
memcpy(&pixelData[highRow*bytesPerRow], swapRow, bytesPerRow);
}
free(swapRow);
}
return [bitmapimagerep autorelease];
}
Vielen Dank an Heiko Kautzor für den Hinweis.
Zu Kapitel 12 fehlte das Beispiel Shader_02.zip.
Im Beispiel Vertex Light 02 ist im Vertex-Shader ein kleiner Fehler.
Hier wurde vergessen den Wert für "Specular" zu initialisieren.
Richtig muss es so aussehen
.
.
.
// Ambient Wert berechnen
ambient = gl_FrontMaterial.ambient * gl_LightSource[0].ambient;
ambient+= gl_LightModel.ambient * gl_FrontMaterial.ambient;
specular = vec4(0.0, 0.0, 0.0, 0.0);
// Wenn der Winkel zwischen Licht und Normale groesser Null, dann Glanzanteil berechnen
if (NdotL > 0.0)
{
NdotHV = max(dot(normal, normalize(gl_LightSource[0].halfVector.xyz)),0.0);
specular = gl_FrontMaterial.specular * gl_LightSource[0].specular * pow(NdotHV,gl_FrontMaterial.shininess);
}
// finale Farbe
gl_FrontColor = NdotL * diffuse + ambient + specular;
// Vertices trannsformieren
gl_Position = ftransform();
Vielen Dank an Romeo Giezendanner.
