opengl programm stürtzt ab



  • Hallo,

    ich lerne gerade Opengl, leider stürzt mein erstes Programm ab ohne Fehlermeldung. Auch beim Debugging zeigt er mir nichts an 😞

    jan@linux:~/Documents/C++/opengl$ gdb exec
    GNU gdb (GDB) 7.5-ubuntu
    Copyright (C) 2012 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
    and "show warranty" for details.
    This GDB was configured as "x86_64-linux-gnu".
    For bug reporting instructions, please see:
    <http://www.gnu.org/software/gdb/bugs/>...
    Reading symbols from /home/jan/Documents/C++/opengl/exec...done.
    (gdb) run
    Starting program: /home/jan/Documents/C++/opengl/exec 
    [Thread debugging using libthread_db enabled]
    Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
    
    Program received signal SIGSEGV, Segmentation fault.
    0x0000000000000000 in ?? ()
    

    Hier der Code:

    #define GLEW_NO_GLU
    #define GLFW_NO_GLU
    
    #include <GL/glew.h>
    #include <GL/glfw.h>
    #include <iostream>
    
    int main()
    {
    
    	if( glfwInit() == GL_FALSE )
    	{
    		std::cout << "error glfwInit()" << std::endl;
    		return 1;
    	}
    	glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3);
    	glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 3);
    	glfwOpenWindowHint(GLFW_OPENGL_COMPAT_PROFILE, GLFW_OPENGL_CORE_PROFILE);
    	glfwOpenWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE );
    
    	if( glfwOpenWindow( 800, 600, 0, 0, 0, 8, 8, 8, GLFW_WINDOW ) == GL_FALSE )
    	{
    		std::cout << "error glfwOpenWindow" << std::endl;		
    		return 1;
    	}
    	glfwSetWindowTitle("Hallo Welt");
    
    	const GLchar* vertexshadersrc="#version 330\n"
    							"in vec4 position;\n"
    							"void main() {\n"
    							"gl_Position=position;\n"
    							"}";
    
    	const GLchar* fragmentshadersrc="#version 330\n"
    							  "out vec4 color;\n"
    							  "void main() {\n"
    							  "color=vec4(1.0f, 0.0f, 0.0f, 1.0f);\n"
    							  "}\n";
    
    	GLuint vertexshader=glCreateShader( GL_VERTEX_SHADER );
    	glShaderSource( vertexshader, 1, &vertexshadersrc, 0) ;
    	glCompileShader(vertexshader);
    
    	GLint compile_ok = 0;
    	GLint errlength = 0;
    	GLchar* errmsg;
    	glGetShaderiv( vertexshader, GL_COMPILE_STATUS, & compile_ok);
    	if( compile_ok == GL_FALSE )
    	{
    		glGetShaderiv( vertexshader, GL_INFO_LOG_LENGTH, &errlength);
    		errmsg=new GLchar[errlength];
    		glGetShaderInfoLog( vertexshader, errlength, &errlength, errmsg);
    		std::cerr << errmsg << std::endl;
    		return 1;
    	}
    
    	GLint fragmentshader=glCreateShader( GL_FRAGMENT_SHADER);
    	glShaderSource( fragmentshader, 1, &fragmentshadersrc, 0);
    	glCompileShader(fragmentshader);
    	glGetShaderiv( fragmentshader, GL_COMPILE_STATUS,& compile_ok);
    	if( compile_ok==GL_FALSE)
    	{
    		glGetShaderiv( vertexshader, GL_INFO_LOG_LENGTH, &errlength);
    		glGetShaderInfoLog( fragmentshader, errlength, &errlength, errmsg);
    		std::cerr << errmsg << std::endl;
    		return 1;
    	}
    
    	GLuint programm=glCreateProgram();
    	glAttachShader( programm, vertexshader);
    	glAttachShader( programm, fragmentshader);
    	glLinkProgram( programm );
    	glDeleteShader( vertexshader );
    	glDeleteShader( fragmentshader );
    
    	GLfloat vertex[]=
    	{
    		-0.7f, -0.5f, 0.0f,
    		 0.7f, 0.5f, 0.0f,
    		 0.0f, 0.5f, 0.0f
    	};
    
    	GLuint vertexbuffer;
    	glGenBuffers(1, &vertexbuffer);
    	glBindBuffer( GL_ARRAY_BUFFER, vertexbuffer );
    	glBufferData( GL_ARRAY_BUFFER, sizeof( vertex ), vertex, GL_STATIC_DRAW );
    
    	GLuint position=glGetAttribLocation( programm, "position" );
    	glVertexAttribPointer( position, 3, GL_FLOAT, GL_FALSE, sizeof( GLfloat)*3,(void*)0);
    	glUseProgram(programm);
    	glEnableVertexAttribArray(position);
    
    	while( glfwGetWindowParam( GLFW_OPENED ) )
    	{
    		glClear(GL_COLOR_BUFFER_BIT);
    		glDrawArrays(GL_TRIANGLES, 0, 3);		
    		glfwSwapBuffers();
    	}
    }
    


  • Auf den ersten Blick: Die Größe für das Info Log des Fragment Shader stimmt nicht (du nimmst die vom Vertex Shader)...



  • Mein Programm bleibt in Zeile 41 hängen:

    GLuint vertexshader=glCreateShader( GL_VERTEX_SHADER );
    

    Kann mir aber nicht erklären warum 😡



  • Wenn diese Zeile das Problem ist, dann kann das Problem nur sein, dass glCreateShader() auf 0x0 zeigt.

    Ich habe nie mit glfw gearbeitet und weiß deshalb nicht, was glfwInit() macht. Wenn du nur mit glew arbeiten würdest, dann brauchst du auf jeden fall "glewInit();". Das würde ich hier auch probieren.



  • Definiere: "bleibt in Zeile 41 hängen".



  • Nach dem glfwInit muss du noch glewInit machen damit die opengl Funktionen wirklich geladen werden. Siehe http://glew.sourceforge.net/basic.html

    Wenn die glew.h inkludiert ist läd glfw keine GL Funktionen, sodass glCreateShader einfach ein Funktionspointer ist, der NULL ist. Genau wie jede andere gl* Funktion.


Anmelden zum Antworten