Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB = NULL; PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB = NULL; PFNGLSHADERSOURCEARBPROC glShaderSourceARB = NULL; PFNGLCOMPILESHADERARBPROC glCompileShaderARB = NULL; PFNGLATTACHOBJECTARBPROC glAttachObjectARB = NULL; PFNGLDELETEOBJECTARBPROC glDeleteObjectARB = NULL; PFNGLLINKPROGRAMARBPROC glLinkProgramARB = NULL; PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB = NULL; PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB = NULL; PFNGLGETINFOLOGARBPROC glGetInfoLogARB = NULL; PFNGLDETACHOBJECTARBPROC glDetachObjectARB = NULL; GLhandleARB ProgramObject, VertexShaderObject, FragmentShaderObject; glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)wglGetProcAddress("glCreateProgramObjectARB"); glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)wglGetProcAddress("glCreateShaderObjectARB"); glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)wglGetProcAddress("glShaderSourceARB"); glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)wglGetProcAddress("glCompileShaderARB"); glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)wglGetProcAddress("glAttachObjectARB"); glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)wglGetProcAddress("glDeleteObjectARB"); glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)wglGetProcAddress("glLinkProgramARB"); glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)wglGetProcAddress("glUseProgramObjectARB"); glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)wglGetProcAddress("glGetObjectParameterivARB"); glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)wglGetProcAddress("glGetInfoLogARB"); glDetachObjectARB = (PFNGLDETACHOBJECTARBPROC)wglGetProcAddress("glDetachObjectARB"); ProgramObject = glCreateProgramObjectARB(); VertexShaderObject = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB); FragmentShaderObject = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB); /* "opengl.vert" laden und char* ShaderTextVert[...] füllen */ /* "opengl.frag" laden und char* ShaderTextFrag[...] füllen */ glShaderSourceARB(VertexShaderObject, lines1, ShaderTextVert, NULL); glShaderSourceARB(FragmentShaderObject, lines2, ShaderTextFrag, NULL); glCompileShaderARB(VertexShaderObject); glCompileShaderARB(FragmentShaderObject); glAttachObjectARB(ProgramObject, VertexShaderObject); glAttachObjectARB(ProgramObject, FragmentShaderObject); glDeleteObjectARB(VertexShaderObject); glDeleteObjectARB(FragmentShaderObject); glLinkProgramARB(ProgramObject); |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
void LoadSource( const char* file, GLhandleARB handle ) { if ( !file ) return; FILE* fp = fopen( file, "rb" ); if ( !fp ) return; fseek( fp, 0, SEEK_END ); long len = ftell( fp ); fseek( fp, 0, SEEK_SET ); int compiled = 0; char* buffer = new char[ len+1 ]; memset( buffer, 0, len+1 ); fread( buffer, len, 1, fp ); // Shader Sourcecode laden glShaderSourceARB( handle, 1, ( const GLcharARB** )&buffer, NULL ); // Shader compilieren glCompileShaderARB( handle ); // Prüfen ob Fehler beim Compilieren auftraten glGetObjectParameterivARB( handle, GL_OBJECT_COMPILE_STATUS_ARB, &compiled ); if ( !compiled ) printf( "compile error...\n" ); delete [] buffer; fclose( fp ); } // ... snip ... // Vertex Shader laden g_pVertexShader = glCreateShaderObjectARB( GL_VERTEX_SHADER_ARB ); LoadSource( "shader.vert", g_pVertexShader ); // Fragment Shader laden g_pFragmentShader = glCreateShaderObjectARB( GL_FRAGMENT_SHADER_ARB ); LoadSource( "shader.frac", g_pFragmentShader ); // Programmobjekt erzeugen und jeweils den Vertex- und Fragmentshader // an das Objekt binden. Zum Schluss noch alles linken g_pShaderProg = glCreateProgramObjectARB(); glAttachObjectARB( g_pShaderProg, g_pVertexShader ); glAttachObjectARB( g_pShaderProg, g_pFragmentShader ); glLinkProgramARB( g_pShaderProg ); // Prüfen ob fehler beim Linken auftraten int linked = 0; glGetObjectParameterivARB( g_pShaderProg, GL_OBJECT_LINK_STATUS_ARB, &linked ); if ( !linked ) printf( "link error...\n" ); |
C-/C++-Quelltext |
|
1 |
glUseProgramObjectARB( g_pShaderProg ); |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 |
// Erstmal die Shader vom Programmobjekt abkoppeln glDetachObjectARB( g_pShaderProg, g_pVertexShader ); glDetachObjectARB( g_pShaderProg, g_pFragmentShader ); // Und dann noch schön aufräumen glDeleteObjectARB( g_pVertexShader ); glDeleteObjectARB( g_pFragmentShader ); glDeleteObjectARB( g_pShaderProg ); |
Zitat von »"LukasBanana"«
Dann noch mal zu dem glUseProgramObjectARB:
Muss ich das immer dann, wenn ich das Objekt zeichnen will auf das der Shader angewändet werden soll, aktivieren und dann wieder deaktivieren?
Wenn ich das einmal am Anfagn des Programms aktiviere seh ich nur die Farbe des glClearColor?!
Zitat von »"LukasBanana"«
Ich hab OpenGL 2.1.2 aber wenn ich die Funktionalität von "glext.h" nutzen will - soll heißen wenn ich "glLinkProgram()" ohne ARB aufrufen will - muss ich erst mal GL_GLEXT_PROTOTYPES definieren bevor ich "glext.h" lade, damit in dem Header die Prüfung "#ifdef GL_GLEXT_PROTOTYPES" wahr wird und die Funktionen deklariert werden.
Wie macht ichr das denn?
Zitat von »"LukasBanana"«
Mhh, vielleicht stimmt ja auch was mit dem Shader nicht, aber eigentlich habe ich die Shader Dateien (opengl.vert und opengl.frag) aus dem IrrlichtEngine Tutorial genommen und da funktioniert es ja auch.
In meinem Programm sehe ich das Objetk nicht, wenn ich den Shader darafu anwenden will :cry:
Quellcode |
|
1 2 3 4 5 6 7 8 |
uniform sampler2D myTexture; void main (void) { vec4 col = texture2D(myTexture, vec2(gl_TexCoord[0])); col *= gl_Color; gl_FragColor = col * 4.0; } |
Quellcode |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
uniform mat4 mWorldViewProj; uniform mat4 mInvWorld; uniform mat4 mTransWorld; uniform vec3 mLightPos; uniform vec4 mLightColor; void main(void) { gl_Position = mWorldViewProj * gl_Vertex; vec4 normal = vec4(gl_Normal, 0.0); normal = mInvWorld * normal; normal = normalize(normal); vec4 worldpos = gl_Vertex * mTransWorld; vec4 lightVector = worldpos - vec4(mLightPos,1.0); lightVector = normalize(lightVector); float tmp2 = dot(-lightVector, normal); vec4 tmp = mLightColor * tmp2; gl_FrontColor = gl_BackColor = vec4(tmp.x, tmp.y, tmp.z, 0.0); gl_TexCoord[0] = gl_MultiTexCoord0; } |
C-/C++-Quelltext |
|
1 2 3 4 5 |
void main() { gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; gl_FrontColor = gl_Color; } |
C-/C++-Quelltext |
|
1 2 3 4 |
void main() { gl_FragColor = gl_Color; } |
Werbeanzeige