alles Krum und schief - SDL2/OPENGL ES
-
Hallo allerseits,
Vor ein paar Tagen stieß ich auf was recht interessantes...
Ich habe mir mal aus Langeweile die App CC-Tools
(ein sehr komplizierter Compiler) runtergeladen und dazu
das SDL plugin ..In diesem Plugin befindet sich ein Example, wie man mithilfe
von C++/SDL2/Open GL (ES) ein 3D Würfel auf Android darstellt , mit ganz wenig Code!
und ohne NDK,Eclipse ect pp!-> das besondere daran ist, diesen Code kann ich via C4Droid einfach öffnen
und ausführen O.oes gibt zwar ein Example auch von C4droid seids aus, aber es benötigt Nativ-Activity
und hat sehr viel spagetti code...So nach dem ich mir das ganze mal angeschaut habe,
habe ich versucht mithilfe eines OpenGl tutorials ein Dreieck darzustellen ...
hmm das hat leider nicht functioniert -> ist ja auch OpenGL Esund trotzdem habe ich es hinbekommen und verstehe mittlerweile ein bisschen davon
...Denke ich ...ich zeige euch mal den Original Code - er darf anscheind ohne weiteres bearbeitet werden
/* CCTools SDL plugin GLES example Derived from SDL testgles sources: Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org> This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely. */ #include <stdlib.h> #include <stdio.h> #include <string.h> #include <math.h> #include <SDL2/SDL.h> #include <SDL2/SDL_opengles.h> static SDL_Window *window; static SDL_GLContext context; static void AspectAdjust(int w, int h) { float aspectAdjust; aspectAdjust = (4.0f / 3.0f) / ((float)w / h); glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrthof(-2.0, 2.0, -2.0 * aspectAdjust, 2.0 * aspectAdjust, -20.0, 20.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); glShadeModel(GL_SMOOTH); } static void Render() { static GLubyte color[8][4] = { {255, 0, 0, 0}, {255, 0, 0, 255}, {0, 255, 0, 255}, {0, 255, 0, 255}, {0, 255, 0, 255}, {255, 255, 255, 255}, {255, 0, 255, 255}, {0, 0, 255, 255} }; static GLfloat cube[8][3] = { {0.5, 0.5, -0.5}, {0.5f, -0.5f, -0.5f}, {-0.5f, -0.5f, -0.5f}, {-0.5f, 0.5f, -0.5f}, {-0.5f, 0.5f, 0.5f}, {0.5f, 0.5f, 0.5f}, {0.5f, -0.5f, 0.5f}, {-0.5f, -0.5f, 0.5f} }; static GLubyte indices[36] = { 0, 3, 4, 4, 5, 0, 0, 5, 6, 6, 1, 0, 6, 7, 2, 2, 1, 6, 7, 4, 3, 3, 2, 7, 5, 4, 7, 7, 6, 5, 2, 3, 1, 3, 0, 1 }; /* Do our drawing, too. */ glClearColor(0.0, 0.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* Draw the cube */ glColorPointer(4, GL_UNSIGNED_BYTE, 0, color); glEnableClientState(GL_COLOR_ARRAY); glVertexPointer(3, GL_FLOAT, 0, cube); glEnableClientState(GL_VERTEX_ARRAY); glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, indices); glMatrixMode(GL_MODELVIEW); glRotatef(5.0, 1.0, 1.0, 1.0); } int main(int argc, char *argv[]) { int done; SDL_DisplayMode mode; SDL_Event event; Uint32 then, now, frames; if (SDL_Init(SDL_INIT_EVERYTHING) < 0) { /* Initialize SDL's Video subsystem */ SDL_Log("Unable to initialize SDL"); return 1; } SDL_GetDesktopDisplayMode(0, &mode); SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 16); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 1); // Create our window centered window = SDL_CreateWindow("GLES example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, mode.w, mode.h, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_FULLSCREEN); if (!window) { // Die if creation failed SDL_Log("Unable to create window"); return 1; } // Create our opengl context and attach it to our window context = SDL_GL_CreateContext(window); if (!context) { SDL_Log("Unable to create GL context"); return 1; } SDL_GL_MakeCurrent(window, context); SDL_GL_SetSwapInterval(1); SDL_Log("Screen bpp: %d\n", SDL_BITSPERPIXEL(mode.format)); SDL_Log("\n"); SDL_Log("Vendor : %s\n", glGetString(GL_VENDOR)); SDL_Log("Renderer : %s\n", glGetString(GL_RENDERER)); SDL_Log("Version : %s\n", glGetString(GL_VERSION)); SDL_Log("Extensions : %s\n", glGetString(GL_EXTENSIONS)); SDL_Log("\n"); AspectAdjust(mode.w, mode.h); /* Main render loop */ frames = 0; then = SDL_GetTicks(); done = 0; while (!done) { /* Check for events */ ++frames; while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_KEYDOWN: if (event.key.keysym.scancode == SDL_SCANCODE_AC_BACK) { done = 1; } break; case SDL_WINDOWEVENT: switch (event.window.event) { case SDL_WINDOWEVENT_RESIZED: /* Change view port to the new window dimensions */ AspectAdjust(event.window.data1, event.window.data2); /* Update window content */ Render(); SDL_GL_SwapWindow(window); break; } } } Render(); SDL_GL_SwapWindow(window); } /* Print out some timing information */ now = SDL_GetTicks(); if (now > then) { SDL_Log("%2.2f frames per second\n", ((double) frames * 1000) / (now - then)); } SDL_GL_DeleteContext(context); SDL_DestroyWindow(window); SDL_Quit(); return 0; }
nun zu den fragen:
- was hat es mit dem indices aufsich, wenn die Punkte über den Float doch schon gegeben sind ?
- was hat es mit den Arrays aufsich [8][4] ? -> ändere ich diese , egal wie, ist das dreieck weg
- gibt es irgendwo OpenGL ES dazu tutorials, die nicht mit java laufen, sondern nur halt über c++/ OpenGL ES ?
- könnt ihr mir ein "einfachen" object-loader schreiben oder zeigen wie das geht ?
-> auch hierzu gibs nur java Tutorialshier der veränderter code -> er sollte ein einfaches Quadrat darstellen
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <math.h> #include <SDL2/SDL.h> #include <SDL2/SDL_opengles.h> static SDL_Window *window; static SDL_GLContext context; int move_me; static void AspectAdjust(int w, int h) { float aspectAdjust; aspectAdjust = (4.0f / 3.0f) / ((float)w / h); glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrthof(-2.0, 2.0, -2.0 * aspectAdjust, 2.0 * aspectAdjust, -20.0, 20.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); glShadeModel(GL_SMOOTH); } static void Render() { static GLubyte color[8][4] = { {0, 0, 255, 0}, {2, 0, 0, 255}, {0, 255, 0, 255}, {0, 255, 0, 255}, {0, 255, 0, 255}, {255, 255, 255, 255}, {255, 0, 255, 255}, {0, 0, 255, 255}, }; /* static GLfloat cube[8][3] = { {-0.5f, 0.5f, 1.0f, 0.0f, 0.0f}, { 0.5f, 0.5f, 0.0f, 1.0f, 0.0f}, { 0.5f, -0.5f, 0.0f, -0.0f, 1.0f}, {-0.5f, -0.5f, 1.0f, 1.0f, 1.0f}, //{-0.5f, 0.5f, 0.5f}, //{0.5f, 0.5f, 0.5f}, //{0.5f, -0.5f, 0.5f}, //{-0.5f, -0.5f, 0.5f} }; */ /* static GLfloat trangleVectiles[8][4] = { {0.0f, 0.5f, 0.0f}, {-0.5f, -0.5f,-0.5f}, { 0.5f, -0.5f, 0.0f}, }; */ static GLfloat trangleVectiles[8][4] = { {0.5f, 0.5f, -0.5f}, {0.5f, -0.5f, -0.5f}, {0.0f, -0.5f, -0.5f}, {-0.5f, 0.5f, 0.0f}, {-0.5f, 0.5f, 0.5f}, }; static GLubyte indices[36] = { 4, 5, 0, 0, 5, 6 }; /* Do our drawing, too. */ glClearColor(0.0, 0.0, 0.0, 0.5); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* Draw the cube */ glColorPointer(4, GL_UNSIGNED_BYTE, 0, color); glEnableClientState(GL_COLOR_ARRAY); glVertexPointer(3, GL_FLOAT, 0, trangleVectiles); glEnableClientState(GL_VERTEX_ARRAY); glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, indices); glMatrixMode(GL_MODELVIEW); glRotatef(1.0, 0.0, 1.0, 0.0); } int main(int argc, char *argv[]) { int done; SDL_DisplayMode mode; SDL_Event event; if (SDL_Init(SDL_INIT_EVERYTHING) < 0) { /* Initialize SDL's Video subsystem */ SDL_Log("Unable to initialize SDL"); return 1; } SDL_GetDesktopDisplayMode(0, &mode); SDL_GL_SetAttribute(SDL_GL_BUFFER_SIZE, 32); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 1); // Create our window centered window = SDL_CreateWindow("GLES example", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, mode.w, mode.h, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_FULLSCREEN); // Create our opengl context and attach it to our window context = SDL_GL_CreateContext(window); SDL_GL_MakeCurrent(window, context); SDL_GL_SetSwapInterval(1); AspectAdjust(mode.w, mode.h); done = 0; while (!done) { /* Check for events */ while (SDL_PollEvent(&event)) { if ( event.type == SDL_MOUSEBUTTONDOWN ) { if (event.button.button == SDL_BUTTON_LEFT ) { if (event.type == SDL_MOUSEMOTION) { move_me = event.motion.x; }} // cursorPosition.y = event.motion.y; } switch (event.type) { case SDL_KEYDOWN: if (event.key.keysym.scancode == SDL_SCANCODE_AC_BACK) { done = 1; } break; case SDL_WINDOWEVENT: switch (event.window.event) { case SDL_WINDOWEVENT_RESIZED: /* Change view port to the new window dimensions */ AspectAdjust(event.window.data1, event.window.data2); /* Update window content */ Render(); SDL_GL_SwapWindow(window); break; } } } Render(); SDL_GL_SwapWindow(window); } SDL_GL_DeleteContext(context); SDL_DestroyWindow(window); SDL_Quit(); return 0; }
ich habe mir dazu das Tutorial angeschaut und wollt es 1:1 abtippen ,dann die fehlermeldung zu viele werte:
werde daraus nicht schlau wegen den Floats und Indices -> irgenwie ist mein Rechteck krumm und schief :S... könnt ihr helfen ?
-
hier das tutorial http://open.gl/drawing
-
keiner ?