OpenGLES gluOrtho

  • Antworten:2
Volker Hoffmann
  • Forum-Beiträge: 4

13.05.2012, 13:51:55 via Website

Hallo Zusammen,

ich habe folgendes Problem:
ich möchte OpenGLES für 2d nutzen ...

benutze also gluOrtho um die Perspektive umzustellen
Jetzt wollte ich eine Linie vom 0 Punkt ( ist ja bei Ortho links unten im Bildschirm ) in di Mitte des Display zeichnen ( dachte breite / 2 für x-Koordinate und höhe / 2 für die y-Koordinate ... ) da erwartet hatte , dass ich insgesamt eine Fläche von breite mal Höhe des Handydisplay habe ( 800 X 480 ).

wenn ich jetzt eine Linie zeichne, von 0,0 nach 1,1, dann ist diese schon über dem gesamten Display zu sehen !
Wie bekomme ich es hin, die Koordinaten der objekte in Pixelposition angeben zu können ?

Hier der code ( importe habe ich weggelassen ( eclipse Strg + O )

Die Activity :

1public class BallerfiscHActivity extends Activity {
2 /** Called when the activity is first created. */
3 @Override
4 public void onCreate(Bundle savedInstanceState) {
5super.onCreate(savedInstanceState);
6// Go fullscreen
7requestWindowFeature(Window.FEATURE_NO_TITLE);
8getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
9GLSurfaceView mView = new GLSurfaceView(this);
10mView.setRenderer(new Renderer());
11setContentView(mView);
12 }
13}

Der Renderer :

1public class Renderer implements GLSurfaceView.Renderer {
2
3 private Line mLine = new Line();
4
5 @Override
6 public void onSurfaceCreated(GL10 gl, EGLConfig config) {
7gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
8gl.glClearDepthf(1.0f);
9gl.glEnable(GL10.GL_DEPTH_TEST);
10gl.glDepthFunc(GL10.GL_LEQUAL);
11 }
12
13 @Override
14 public void onDrawFrame(GL10 gl) {
15gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
16gl.glLoadIdentity();
17
18mLine.draw(gl);
19 }
20
21 @Override
22 public void onSurfaceChanged(GL10 gl, int width, int height) {
23
24gl.glViewport(0, 0, width, height);
25
26gl.glMatrixMode(GL10.GL_PROJECTION);
27gl.glLoadIdentity();
28gl.glOrthox(0, width, 0, height, 0, 100);
29
30gl.glMatrixMode(GL10.GL_MODELVIEW);
31gl.glLoadIdentity();
32 }
33}

und die Linie

1public class Line {
2
3 private ByteBuffer mVertexBuffer;
4 private ByteBuffer mIndexBuffer;
5
6 private byte vertices[] = {
7 0, 0, 0,
8 1, 1, 0,
9 };
10
11 private byte indices[] = { 0, 1} ;
12
13 public Line() {
14mVertexBuffer = ByteBuffer.allocateDirect(vertices.length);
15mVertexBuffer.put(vertices);
16mVertexBuffer.position(0);
17mIndexBuffer = ByteBuffer.allocateDirect(indices.length);
18mIndexBuffer.put(indices);
19mIndexBuffer.position(0);
20 }
21
22 public void draw(GL10 gl) {
23gl.glFrontFace(GL10.GL_CW);
24gl.glVertexPointer(3, GL10.GL_BYTE, 0, mVertexBuffer);
25gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
26gl.glDrawElements(GL10.GL_LINES, 2, GL10.GL_UNSIGNED_BYTE, mIndexBuffer);
27gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
28 }
29}

— geändert am 13.05.2012, 16:21:23

Antworten
Volker Hoffmann
  • Forum-Beiträge: 4

15.05.2012, 12:54:02 via Website

keiner ? nicht mal eine idee ? :(

— geändert am 15.05.2012, 12:54:18

Antworten
MaMe82
  • Forum-Beiträge: 15

06.10.2012, 16:22:38 via Website

Der Fehler liegt in der Verwendung von glOrthox.
In einigen OpenGL ES Implementierungen werden die übergebenen
Integerwerte in Festkommazahlen umgewandelt. Also werden aus einem 32bit int
16bit vor dem Komma und 16bit nach dem Komma (16.16 fixed point).
Vermeiden kannst du das indem du Gleitkommazahlen verwendest.

glOrthox(0f,(float) width, (float) height, 0f, 1f, 100f) zum Beispiel

— geändert am 06.10.2012, 16:23:31

Antworten