Problem mit beleuchtung und Textur mit OpenGL

  • Antworten:0
Forest
  • Forum-Beiträge: 14

17.10.2015, 12:47:15 via Website

Hallo zusammen.

Ich bin gerade dabei meine ersten Schritte in OpenGL zu machen und weiss nicht weiter.

Wenn ich GL_LIGHTING disable wird das Object (Quadrat) Weiß vor Blauen Hintergrund dargestellt.
Enable ich GL_LIGHTING bleibt alles Schwarz, entferne ich aber die Zeile aus dem Renderer, mit welcher das Object gerendert wird, wird der Hintergrund wieder schön Blau dargestellt. Zum Vermerk, dass Object nimmt nicht den Ganzen Display ein.

Quellcode Object:

package com.Trials;

import java.nio.;
import javax.microedition.khronos.opengles.
;
import android.opengl.;
import android.graphics.
;
import android.content.*;

import android.net.http.*;public class Quad
{
public FloatBuffer vertexBuffer,
normalBuffer,
uvBuffer;
public ShortBuffer indexBuffer;

private float[] matAmbDif={0f,.5f,.8f,1f};

private float[] vertices={      -3f,0f,-3f,
                           3f,0f,-3f,
                           3f,0f, 3f,
                          -3f,0f, 3f};

private short[] indices={       0,1,2,
                         0,2,3};

private float[] normals={      0f,1f,0f,
                         0f,1f,0f,
                         0f,1f,0f,
                         0f,1f,0f};

private float[] uv={       1f,0f,
                    1f,1f,
                    0f,1f,
                    0f,0f};

private int[] texturPointer;

Context context;

public Quad(GL10 gl10,Context context)
{
    GL11 gl=(GL11)gl10;
    this.context=context;

    ByteBuffer vbb=ByteBuffer.allocateDirect(vertices.length*4);
    vbb.order(ByteOrder.nativeOrder());
    vertexBuffer=vbb.asFloatBuffer();
    vertexBuffer.put(vertices);
    vertexBuffer.position(0);

    ByteBuffer nbb=ByteBuffer.allocateDirect(normals.length*4);
    nbb.order(ByteOrder.nativeOrder());
    normalBuffer=nbb.asFloatBuffer();
    normalBuffer.put(normals);
    normalBuffer.position(0);

    ByteBuffer uvbb=ByteBuffer.allocateDirect(uv.length*4);
    uvbb.order(ByteOrder.nativeOrder());
    uvBuffer=uvbb.asFloatBuffer();
    uvBuffer.put(uv);
    uvBuffer.position(0);

    ByteBuffer ibb=ByteBuffer.allocateDirect(indices.length*2);
    ibb.order(ByteOrder.nativeOrder());
    indexBuffer=ibb.asShortBuffer();
    indexBuffer.put(indices);
    indexBuffer.position(0);

    Bitmap textur=BitmapFactory.decodeResource(context.getResources(),R.drawable.ic_launcher);

    texturPointer=new int[1];
    gl.glGenTextures(1,this.texturPointer,0);
    gl.glBindTexture(GL11.GL_TEXTURE_2D,texturPointer[0]);
    gl.glTexParameterf(GL11.GL_TEXTURE_2D,GL11.GL_TEXTURE_MIN_FILTER,GL11.GL_NEAREST);
    gl.glTexParameterf(GL11.GL_TEXTURE_2D,GL11.GL_TEXTURE_MAG_FILTER,GL11.GL_LINEAR);
    GLUtils.texImage2D(GL11.GL_TEXTURE_2D,0,textur,0);
    textur.recycle();*/
}
public void Draw(GL10 gl10)
{
    GL11 gl=(GL11)gl10;

    gl.glBindTexture(GL11.GL_TEXTURE_2D,texturPointer[0]);

    // Eigenschaften für das Material festlegen
    gl.glMaterialfv(GL11.GL_FRONT_AND_BACK,GL11.GL_AMBIENT_AND_DIFFUSE,matAmbDif,0);


    gl.glEnableClientState(GL11.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY);
    gl.glEnableClientState(GL11.GL_NORMAL_ARRAY);

    gl.glVertexPointer(3,GL11.GL_FLOAT,0,vertexBuffer);
    gl.glTexCoordPointer(2,GL11.GL_FLOAT,0,uvBuffer);

    gl.glDrawElements(GL11.GL_TRIANGLES,indices.length,GL11.GL_UNSIGNED_SHORT,indexBuffer);

    gl.glDisableClientState(GL11.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GL11.GL_TEXTURE_COORD_ARRAY);
    gl.glDisableClientState(GL11.GL_NORMAL_ARRAY);


}

}

Quellcode Renderer:

package com.Trials;

import android.opengl.GLSurfaceView;
import android.opengl.GLU;
import javax.microedition.khronos.opengles.;
import javax.microedition.khronos.egl.
;
import android.content.Context;
import android.text.style.*;

public class TrialsRenderer implements GLSurfaceView.Renderer
{
private Context context;
public Quad QuadObj;

private float[] lightAmbDif={1f,1f,1f,1f},
             lightPos={0f,-1f,0f,0f};

public TrialsRenderer(Context context)
{
    this.context=context;
}

@Override
public void onSurfaceCreated(GL10 gl10, EGLConfig config)
{
    // TODO: Implement this method
    GL11 gl=(GL11)gl10;

    QuadObj=new Quad(gl,context);

    gl.glClearColor(0f,0f,1f,1f); // Hintergrundfarbe
    gl.glClearDepthf(1f); // Z-Buffer leeren.
    gl.glEnable(GL11.GL_DEPTH_TEST);
    gl.glDepthFunc(GL11.GL_LEQUAL);
    gl.glLightfv(GL11.GL_LIGHT0,GL11.GL_AMBIENT,lightAmbDif,0);
    gl.glLightfv(GL11.GL_LIGHT0,GL11.GL_DIFFUSE,lightAmbDif,0); 


    gl.glEnable(GL11.GL_LIGHTING);
    gl.glEnable(GL11.GL_LIGHT0);

    gl.glHint(GL11.GL_PERSPECTIVE_CORRECTION_HINT,GL11.GL_NICEST); //Kantenglätung.
    gl.glDisable(GL11.GL_DITHER);// Dither ist zum ausgleichen von Farbübergängen.
}

@Override
public void onSurfaceChanged(GL10 gl10, int width, int height)
{
    // TODO: Implement this method
    GL11 gl=(GL11)gl10;

    // Die Projection festlegen
    if(width==0) width=1;
    float aspect=(float) width/height;
    gl.glViewport(0,0,width,height);

    gl.glMatrixMode(GL11.GL_PROJECTION);
    gl.glLoadIdentity();
    GLU.gluPerspective(gl,45,aspect,0.1f,200.0f);
    gl.glMatrixMode(GL11.GL_MODELVIEW);
    gl.glLoadIdentity();        
}

@Override
public void onDrawFrame(GL10 gl10)
{
    // TODO: Implement this method
    GL11 gl=(GL11)gl10;

    // Grafikspeicher auf Hintergrundfarbe(S.onSurefaceCreated) stellen und Z-Buffer leeren.
    gl.glClear(GL11.GL_COLOR_BUFFER_BIT|GL11.GL_DEPTH_BUFFER_BIT);
    // Identitätsmatrix laden
    gl.glLoadIdentity();

    gl.glLightfv(GL11.GL_LIGHT0,GL11.GL_POSITION,lightPos,0);

    // Kammera mit gluLookat auf Blickwinkel 45° Blickwinkel auf Szenenmittelpunkt
    GLU.gluLookAt(gl,0f,5f,5f,  0f,0f,0f,  0f,1f,0f); // 1. Kammeraposition 2. Focuspunkt 3. Up-Vector

    // Object Rendern.
    QuadObj.Draw(gl10);

}

}

Ich weiss nicht, was ich falsch mache .

Viekeicht kann mir jemand helfen.

Antworten