urpils
2013-08-29, 08:10:50
Hallo liebe Gemeinde,
eins vorweg: ich bin kein Programmierer, ich habe etwas vollkommen anderes studiert und ich will auch keine abgefahrenen Hightechspiele programmieren - mich interessiert einfach nur die Thematik und ich will etwas rumspielen.
Ich habe günstig ein gebrauchtes Exemplar von dem Buch Interactive Computer Graphics (http://www.amazon.com/Interactive-Computer-Graphics-Top-Down-Shader-Based/dp/0132545233) bekommen und möchte nun versuchen zu verstehen, wie 3D-Computergrafik funktioniert und ein bisschen damit rumspielen um mein Verständnis zu festigen.
In dem Buch komme ich auch sehr gut mit - toll erklärt - ich verstehen die Beispiele - habe Kapitel 1&2 durch und wollte mich langsam an die Codebeispiele und Übungen machen.
Ich bekomme aber aufs verrecken die Codebeispiele von hier (http://www.cs.unm.edu/~angel/BOOK/INTERACTIVE_COMPUTER_GRAPHICS/SIXTH_EDITION/) unter OSX mit XCode nicht zum laufen.
Wie gesagt - ich bin kein Programmierer - ich habe nie größere Projekte gemacht und benutze eigentlich auch Xcode nicht. Ich habe 1-2 C(++) Bücher vor Jahren gelesen (also Grundlegendes, wie Schleifen, Strukturen, Objekte, Zeiger,...) und verstehe die wichtigen Elemente der Quelldateien (wenn dann aber ständig "&" oder "*" und Überladungen durch die Gegend fliegen steige ich dennoch aus.
Wie dem auch sei - wenn ich die Quelltexte in Xcode einfüge, bekomme ich sie nicht zum Laufen - egal wie viel ich rumfummele.
Habe mich hier (http://www.cs.unm.edu/~angel/BOOK/INTERACTIVE_COMPUTER_GRAPHICS/SIXTH_EDITION/CODE/CHAPTER02/MAC_VERSIONS/) an Example1.cpp probiert:
//
// main.cpp
// OpenGL-Uebungen-1
//
// Created by Jan Engert on 27.08.13.
// Copyright (c) 2013 Jan Engert. All rights reserved.
//
/*
#include <iostream>
#include <GLUT/glut.h>
#include <OpenGL/OpenGL.h>
int main(int argc, const char * argv[])
{
// insert code here...
std::cout << "Hello, World!\n";
return 0;
}
*/
// Two-Dimensional Sierpinski Gasket
// Generated using randomly selected vertices and bisection
#include "Angel.h"
const int NumPoints = 5000;
//----------------------------------------------------------------------------
void
init( void )
{
vec2 points[NumPoints];
// Specifiy the vertices for a triangle
vec2 vertices[3] = {
vec2( -1.0, -1.0 ), vec2( 0.0, 1.0 ), vec2( 1.0, -1.0 )
};
// Select an arbitrary initial point inside of the triangle
points[0] = vec2( 0.25, 0.50 );
// compute and store N-1 new points
for ( int i = 1; i < NumPoints; ++i ) {
int j = rand() % 3; // pick a vertex at random
// Compute the point halfway between the selected vertex
// and the previous point
points[i] = ( points[i - 1] + vertices[j] ) / 2.0;
}
// Create a vertex array object
GLuint vao[1];
glGenVertexArraysAPPLE( 1, vao );
glBindVertexArrayAPPLE( vao[0] );
// Create and initialize a buffer object
GLuint buffer;
glGenBuffers( 1, &buffer );
glBindBuffer( GL_ARRAY_BUFFER, buffer );
glBufferData( GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW );
// Load shaders and use the resulting shader program
GLuint program = InitShader( "vshader21.glsl", "fshader21.glsl" );
glUseProgram( program );
// Initialize the vertex position attribute from the vertex shader
GLuint loc = glGetAttribLocation( program, "vPosition" );
glEnableVertexAttribArray( loc );
glVertexAttribPointer( loc, 2, GL_FLOAT, GL_FALSE, 0,
BUFFER_OFFSET(0) );
glClearColor( 1.0, 1.0, 1.0, 1.0 ); // white background
}
//----------------------------------------------------------------------------
void
display( void )
{
glClear( GL_COLOR_BUFFER_BIT ); // clear the window
glDrawArrays( GL_POINTS, 0, NumPoints ); // draw the points
glFlush();
}
//----------------------------------------------------------------------------
void
keyboard( unsigned char key, int x, int y )
{
switch ( key ) {
case 033:
exit( EXIT_SUCCESS );
break;
}
}
//----------------------------------------------------------------------------
int
main( int argc, char **argv )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_RGBA );
glutInitWindowSize( 512, 512 );
glutCreateWindow( "Sierpinski Gasket" );
init();
glutDisplayFunc( display );
glutKeyboardFunc( keyboard );
glutMainLoop();
return 0;
}
habe die Angel.h zum Projekt in Xcode hinzugefügt, darüberhinaus die von der Angel.h benötigten mat.h und vec.h.
Wenn ich compilieren möchte bekomme ich den Fehler:
Non-const lvalue reference to type 'Angel::mat2' cannot bind to temporary of type 'Angel::mat2' (Zeile 132 der mat.h)
das gleiche noch für mat3 und mat 4 in der mat.h
(die mat.h gibt es hier (http://www.cs.unm.edu/~angel/BOOK/INTERACTIVE_COMPUTER_GRAPHICS/SIXTH_EDITION/CODE/include/))
der beanstandete Teil ist wohl dieser hier:
mat2& operator /= ( const GLfloat s ) {
#ifdef DEBUG
if ( std::fabs(s) < DivideByZeroTolerance ) {
std::cerr << "[" << __FILE__ << ":" << __LINE__ << "] "
<< "Division by zero" << std::endl;
return mat2();
}
#endif // DEBUG
und wie oben beschrieben - bei DIESEN Dingern steige ich aus - ich hab keine Ahnung wozu dieser Bereich da ist und was er macht.
hat irgendjemand die Muße mir hierbei zu helfen - das wäre wirklich toll.
edit: achso - ich hatte diese Fehlermeldung bei Stack-overflow schon gefunden - jedoch hilft die dort angebotene Lösung auch nichts, weil ich weiterhin eine Warnung erhalte und das compilieren dann mit der Fehlermeldung:
Undefined symbols for architecture x86_64:
"Angel::InitShader(char const*, char const*)", referenced from:
init() in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
dennoch abbricht :/
eins vorweg: ich bin kein Programmierer, ich habe etwas vollkommen anderes studiert und ich will auch keine abgefahrenen Hightechspiele programmieren - mich interessiert einfach nur die Thematik und ich will etwas rumspielen.
Ich habe günstig ein gebrauchtes Exemplar von dem Buch Interactive Computer Graphics (http://www.amazon.com/Interactive-Computer-Graphics-Top-Down-Shader-Based/dp/0132545233) bekommen und möchte nun versuchen zu verstehen, wie 3D-Computergrafik funktioniert und ein bisschen damit rumspielen um mein Verständnis zu festigen.
In dem Buch komme ich auch sehr gut mit - toll erklärt - ich verstehen die Beispiele - habe Kapitel 1&2 durch und wollte mich langsam an die Codebeispiele und Übungen machen.
Ich bekomme aber aufs verrecken die Codebeispiele von hier (http://www.cs.unm.edu/~angel/BOOK/INTERACTIVE_COMPUTER_GRAPHICS/SIXTH_EDITION/) unter OSX mit XCode nicht zum laufen.
Wie gesagt - ich bin kein Programmierer - ich habe nie größere Projekte gemacht und benutze eigentlich auch Xcode nicht. Ich habe 1-2 C(++) Bücher vor Jahren gelesen (also Grundlegendes, wie Schleifen, Strukturen, Objekte, Zeiger,...) und verstehe die wichtigen Elemente der Quelldateien (wenn dann aber ständig "&" oder "*" und Überladungen durch die Gegend fliegen steige ich dennoch aus.
Wie dem auch sei - wenn ich die Quelltexte in Xcode einfüge, bekomme ich sie nicht zum Laufen - egal wie viel ich rumfummele.
Habe mich hier (http://www.cs.unm.edu/~angel/BOOK/INTERACTIVE_COMPUTER_GRAPHICS/SIXTH_EDITION/CODE/CHAPTER02/MAC_VERSIONS/) an Example1.cpp probiert:
//
// main.cpp
// OpenGL-Uebungen-1
//
// Created by Jan Engert on 27.08.13.
// Copyright (c) 2013 Jan Engert. All rights reserved.
//
/*
#include <iostream>
#include <GLUT/glut.h>
#include <OpenGL/OpenGL.h>
int main(int argc, const char * argv[])
{
// insert code here...
std::cout << "Hello, World!\n";
return 0;
}
*/
// Two-Dimensional Sierpinski Gasket
// Generated using randomly selected vertices and bisection
#include "Angel.h"
const int NumPoints = 5000;
//----------------------------------------------------------------------------
void
init( void )
{
vec2 points[NumPoints];
// Specifiy the vertices for a triangle
vec2 vertices[3] = {
vec2( -1.0, -1.0 ), vec2( 0.0, 1.0 ), vec2( 1.0, -1.0 )
};
// Select an arbitrary initial point inside of the triangle
points[0] = vec2( 0.25, 0.50 );
// compute and store N-1 new points
for ( int i = 1; i < NumPoints; ++i ) {
int j = rand() % 3; // pick a vertex at random
// Compute the point halfway between the selected vertex
// and the previous point
points[i] = ( points[i - 1] + vertices[j] ) / 2.0;
}
// Create a vertex array object
GLuint vao[1];
glGenVertexArraysAPPLE( 1, vao );
glBindVertexArrayAPPLE( vao[0] );
// Create and initialize a buffer object
GLuint buffer;
glGenBuffers( 1, &buffer );
glBindBuffer( GL_ARRAY_BUFFER, buffer );
glBufferData( GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW );
// Load shaders and use the resulting shader program
GLuint program = InitShader( "vshader21.glsl", "fshader21.glsl" );
glUseProgram( program );
// Initialize the vertex position attribute from the vertex shader
GLuint loc = glGetAttribLocation( program, "vPosition" );
glEnableVertexAttribArray( loc );
glVertexAttribPointer( loc, 2, GL_FLOAT, GL_FALSE, 0,
BUFFER_OFFSET(0) );
glClearColor( 1.0, 1.0, 1.0, 1.0 ); // white background
}
//----------------------------------------------------------------------------
void
display( void )
{
glClear( GL_COLOR_BUFFER_BIT ); // clear the window
glDrawArrays( GL_POINTS, 0, NumPoints ); // draw the points
glFlush();
}
//----------------------------------------------------------------------------
void
keyboard( unsigned char key, int x, int y )
{
switch ( key ) {
case 033:
exit( EXIT_SUCCESS );
break;
}
}
//----------------------------------------------------------------------------
int
main( int argc, char **argv )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_RGBA );
glutInitWindowSize( 512, 512 );
glutCreateWindow( "Sierpinski Gasket" );
init();
glutDisplayFunc( display );
glutKeyboardFunc( keyboard );
glutMainLoop();
return 0;
}
habe die Angel.h zum Projekt in Xcode hinzugefügt, darüberhinaus die von der Angel.h benötigten mat.h und vec.h.
Wenn ich compilieren möchte bekomme ich den Fehler:
Non-const lvalue reference to type 'Angel::mat2' cannot bind to temporary of type 'Angel::mat2' (Zeile 132 der mat.h)
das gleiche noch für mat3 und mat 4 in der mat.h
(die mat.h gibt es hier (http://www.cs.unm.edu/~angel/BOOK/INTERACTIVE_COMPUTER_GRAPHICS/SIXTH_EDITION/CODE/include/))
der beanstandete Teil ist wohl dieser hier:
mat2& operator /= ( const GLfloat s ) {
#ifdef DEBUG
if ( std::fabs(s) < DivideByZeroTolerance ) {
std::cerr << "[" << __FILE__ << ":" << __LINE__ << "] "
<< "Division by zero" << std::endl;
return mat2();
}
#endif // DEBUG
und wie oben beschrieben - bei DIESEN Dingern steige ich aus - ich hab keine Ahnung wozu dieser Bereich da ist und was er macht.
hat irgendjemand die Muße mir hierbei zu helfen - das wäre wirklich toll.
edit: achso - ich hatte diese Fehlermeldung bei Stack-overflow schon gefunden - jedoch hilft die dort angebotene Lösung auch nichts, weil ich weiterhin eine Warnung erhalte und das compilieren dann mit der Fehlermeldung:
Undefined symbols for architecture x86_64:
"Angel::InitShader(char const*, char const*)", referenced from:
init() in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
dennoch abbricht :/