2015-09-30 5 views
0

Я пытаюсь использовать JOGL в автономном приложении Java. Я работал с OpenGLES на Android и просто портировал свой код с Android OpenGL на это Java-приложение. Были некоторые изменения синтаксиса, но методы и этапы сборки схожи и на месте.Java JOGL текстурированный объект не перевод

Я могу рисовать вершинные массивы поплавков на холсте и передавать данные о цветах в шейдеры. Теперь я работаю над текстурированием. Вот где моя проблема. Я могу текстурировать и даже применять дополнительные цвета к шейдерам через Java, но теперь я хочу, чтобы иметь возможность перемещать объект в 3D-пространстве.

Без текстурирования я могу поворачивать/переводить объект, но когда я применяю текстуру к объекту (который применяет текстуру), я не могу вращать/переводить объект.

Если кто-то может указать мне в правильном направлении, что я пропускаю. Я искал и смотрел учебники и примеры, но все они, кажется, делают основы того, что у меня есть.

Чтобы уточнить, у меня возникают проблемы с перемещением текстурированного объекта в 3D-пространстве.

это мой ExampleGL главный рендер:

private GLU glu; 

float xLoc = 0; 

@Override 
public void display(GLAutoDrawable drawable) { 
    // TODO Auto-generated method stub 
    GL2 gl = drawable.getGL().getGL2(); 
    gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);    
    gl.glLoadIdentity(); 
    // call your draw code here 

     gl.glTranslatef(0, 0, xLoc); 
     gl.glRotatef(rotateX, 1, 0, 0); 
     gl.glRotatef(rotateY, 0, 1, 0); 
     gl.glRotatef(rotateZ, 0, 0, 1); 

     square.draw(gl); 

    // end calls for drawing 

} 

@Override 
public void dispose(GLAutoDrawable drawable) { 
    // TODO Auto-generated method stub 

} 

GLSquareEx square; 
int mProgramShader; 

@Override 
public void init(GLAutoDrawable drawable) { 
    // TODO Auto-generated method stub 
    GL2 gl = drawable.getGL().getGL2(); 
    glu = new GLU(); 
    OpenGLInit(gl); 
    square = new GLSquareEx(gl, true);//boolean true = textured; false = not textured 
    if(square.textured()){ 
     mProgramShader = ShaderHelper.loadAndCompileShader(gl, "texturevertexshader.txt", "texturefragmentshader.txt", 
       new String[]{ 
       "vertColor", 
       "a_texCoord" 
       }); 
    } else { 
     mProgramShader = ShaderHelper.loadAndCompileShader(gl, "vertexshader.txt", "fragmentshader.txt", 
       new String[]{ 
       "vertColor" 
       }); 
    } 
    square.setShaderProgram(mProgramShader); 
} 

@Override 
public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3, 
     int arg4) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void keyPressed(KeyEvent e) { 
    int key = e.getKeyCode(); 
    if (key == KeyEvent.VK_LEFT){ 
     rotateY -= 15; 
    } else if (key == KeyEvent.VK_RIGHT){ 
     rotateY += 15; 
    } else if (key == KeyEvent.VK_DOWN){ 
     xLoc -= 1.0f; 
     rotateX += 15; 
    } else if (key == KeyEvent.VK_UP){ 
     xLoc += 1.0f; 
     rotateX -= 15; 
    } else if (key == KeyEvent.VK_PAGE_UP){ 
     rotateZ += 15; 
    } else if (key == KeyEvent.VK_PAGE_DOWN){ 
     rotateZ -= 15; 
    } else if (key == KeyEvent.VK_HOME){ 
     rotateX = rotateY = rotateZ = 0; 
    } 
    System.out.println(KeyEvent.getKeyText(key)); 
    //repaint(); 
} 

@Override 
public void keyReleased(KeyEvent arg0) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void keyTyped(KeyEvent arg0) { 
    // TODO Auto-generated method stub 

} 

private void OpenGLInit(GL2 gl) { 
    // TODO Auto-generated method stub 
    gl.glClearColor(0.392f, 0.584f, 0.929f, 1.0f); 
    gl.glClearDepth(1.0f);  // set clear depth value to farthest 
    gl.glEnable(GL2.GL_DEPTH_TEST); // enables depth testing 
    gl.glDepthFunc(GL2.GL_LEQUAL); // the type of depth test to do 
    gl.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL2.GL_NICEST); // best perspective correction 
    gl.glShadeModel(GL2.GL_SMOOTH); // blends colors nicely, and smoothes out lighting 
    SetCameraView(gl, 30); 
} 

private void SetCameraView(GL2 gl, float distance) { 
    // TODO Auto-generated method stub 
     // Change to projection matrix. 
    gl.glMatrixMode(GL2.GL_PROJECTION); 
    gl.glLoadIdentity(); 

    // Perspective. 
    float widthHeightRatio = (float) getWidth()/(float) getHeight(); 
    glu.gluPerspective(45.0f, widthHeightRatio, 0.1f, 100f); 
    glu.gluLookAt(0, 0, distance, 0, 0, 0, 0, 1, 0); 

    // Change back to model view matrix. 
    gl.glMatrixMode(GL2.GL_MODELVIEW); 
    gl.glLoadIdentity(); 
} 

} 

это мой объект я хочу рисовать:

public class GLSquareEx { 
private FloatBuffer vertexBuffer; // Buffer for vertex-array 
private FloatBuffer colorBuffer; // Buffer for color-array (NEW) 
private FloatBuffer texBuffer; 
private boolean isTextured; 
private Texture tex = null; 
int mProgram; 

private int mSamplerLoc; 
private int mTexCoordLoc; 
private int colLoc; 

private float[] vertices = { 
    -1.0f, -1.0f, 0.0f, // 0. left-bottom 
    1.0f, -1.0f, 0.0f, // 1. right-bottom 
    -1.0f, 1.0f, 0.0f, // 2. left-top 
    1.0f, 1.0f, 0.0f // 3. right-top 
}; 

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

// Constructor - Setup the vertex buffer 
public GLSquareEx(GL2 gl, boolean isTex) { 
    CreateVertexBuffer(); 
    isTextured = isTex; 
    if(isTex){ 
     CreateTextureBuffer(); 
     InitializeTexture(gl); 
    } 
} 

// Render the shape 
public void draw(GL2 gl) { 
    gl.glPushMatrix(); 
    /* 
    * start drawing 
    */ 
    // Enable vertex-array and define its buffer 

    gl.glEnableClientState(GL2.GL_VERTEX_ARRAY); 

    gl.glUseProgram(mProgram); 
    colLoc = gl.glGetUniformLocation(mProgram, "vertColor"); 
    gl.glUniform3f(colLoc, 0.8f, 0.0f, 0.0f); 

    if(isTextured){ 
     gl.glEnableClientState(GL2.GL_TEXTURE_COORD_ARRAY);  
     //gl.glTexCoordPointer(2, GL2.GL_FLOAT, 0, texBuffer); 
     //gl.glActiveTexture(GL2.GL_TEXTURE0); 
     tex.enable(gl); 
     tex.bind(gl);  

     mTexCoordLoc = gl.glGetAttribLocation(mProgram, "a_texCoord"); 
     mSamplerLoc = gl.glGetUniformLocation(mProgram, "s_texture");   

     gl.glEnableVertexAttribArray (mTexCoordLoc); 
     gl.glUniform1i(mSamplerLoc, 0); 
     gl.glVertexAttribPointer (mTexCoordLoc, 2, GL2.GL_FLOAT, false, 0, texBuffer);     

    }    

    gl.glVertexPointer(3, GL2.GL_FLOAT, 0, getVertexBuffer()); 

    gl.glDrawArrays(GL2.GL_TRIANGLE_STRIP, 0, getVertices().length/3); 

    gl.glDisableClientState(GL2.GL_VERTEX_ARRAY); 

    if(isTextured){ 
     tex.disable(gl); 
     gl.glDisableVertexAttribArray(mTexCoordLoc); 
     gl.glDisableClientState(GL2.GL_TEXTURE_COORD_ARRAY) ; 
    } 

    /* 
    * end drawing 
    */ 

    gl.glPopMatrix(); 

} 

public void setShaderProgram(int prog){ 
    mProgram = prog; 
} 

public boolean textured(){ 
    return isTextured; 
} 

private void InitializeTexture(GL2 gl) { 
// TODO Auto-generated method stub 
    String dir = System.getProperty("user.dir")+"\\lib\\"; 
    try { 
     tex = TextureHelper.loadTexture(gl, gl.getGLProfile(), dir + "cia.jpg", TextureIO.JPG); 
     tex.setTexParameteri(gl, GL2.GL_TEXTURE_MIN_FILTER, 
       GL2.GL_LINEAR); 
     tex.setTexParameteri(gl, GL2.GL_TEXTURE_MAG_FILTER, 
       GL2.GL_LINEAR); 
     tex.setTexParameteri(gl, GL2.GL_TEXTURE_WRAP_S, 
       GL2.GL_CLAMP_TO_EDGE);//GL_REPEAT 
     tex.setTexParameteri(gl, GL2.GL_TEXTURE_WRAP_T, 
       GL2.GL_CLAMP_TO_EDGE);//GL_REPEAT 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

private void CreateTextureBuffer() { 
// TODO Auto-generated method stub 
     texBuffer = Buffers.newDirectFloatBuffer(texmap); 
     texBuffer.put(texmap); 
     texBuffer.rewind(); 
} 

private void CreateVertexBuffer() { 
// TODO Auto-generated method stub 
     vertexBuffer = Buffers.newDirectFloatBuffer(vertices); 
     vertexBuffer.put(vertices); 
     vertexBuffer.rewind(); 
} 

public float[] getVertices(){ 
    return vertices; 
} 

public FloatBuffer getVertexBuffer() { 
    // TODO Auto-generated method stub 
    return vertexBuffer; 
} 

} 

это мой TextureHelper класс:

public class TextureHelper 
{ 

public static Texture loadTexture(GL2 gl, GLProfile glProfile, String filepath, String extension) 
{ 
    try { 
      gl.glMatrixMode(GL2.GL_TEXTURE); 
      gl.glLoadIdentity(); 

      InputStream stream = new FileInputStream(filepath); 
      TextureData data = TextureIO.newTextureData(glProfile, stream, false, extension); 
      Texture tex = TextureIO.newTexture(data);    

      return tex; 
     } 
     catch (IOException exc) { 
      exc.printStackTrace(); 
      System.exit(1); 
     } 
    return null; 
} 

} 

ниже мой vertex shader Я использую, когда пытаюсь применить текстуру:

uniform vec3 vertColor; 

attribute vec2 a_texCoord; 

varying vec2 v_texCoord; 
varying vec3 col; 


void main() { 

gl_Position=gl_ModelViewProjectionMatrix*gl_Vertex; 

col=vertColor; 

v_texCoord = a_texCoord; 
} 

ниже мой пиксельный шейдер я использую, когда я пытаюсь применить текстуру:

precision mediump float;   

uniform sampler2D s_texture; 
varying vec2 v_texCoord; 

varying vec3 col;   

void main()       
{        
// Pass through the color 
gl_FragColor = vec4(col, 1.0) * texture2D(s_texture, v_texCoord);           
} 
+0

Не уверены, если это вызывает проблему, но так как вы используете общий атрибут вершины для текстурных координат, вы не должны 't вызывать 'gl.glEnableClientState (GL2.GL_TEXTURE_COORD_ARRAY);'. Это позволит использовать атрибут фиксированной функции текстурной текстуры, который вы не используете. –

+0

Да, я прокомментировал это. Когда я сделал свою копию/вставку, она, должно быть, была без комментариев из одного из моих последних тестов. Это не сработало. – itgeek25

+0

Есть ли способ получить матрицу ModelView до и после моего перевода и рисования, чтобы увидеть, изменилось ли это? Я бы поверила, что это изменилось, но я думаю, что проблема находится где-то в одном из моих методов текстурирования. – itgeek25

ответ

1

Просто проснулся сегодня утром и пошел прямо в программе в главной роли в нем. Тогда я понял, что мне может потребоваться установить матрицу ModelView на чертеж перед переводом. ЭТО СРАБОТАЛО!

Это метод, который мне не хватало и необходимо добавить перед загрузкой идентификационной матрицы. Должно быть, она была установлена ​​в другую матрицу.

gl.glMatrixMode(GL2.GL_MODELVIEW); 

Честно говоря, не понимаю, почему это работает, но, если не текстурировано, это сработало.

Вот это простое изменение метода рисования в моем основном рендер:

@Override 
public void display(GLAutoDrawable drawable) { 
    // TODO Auto-generated method stub 
    GL2 gl = drawable.getGL().getGL2(); 
    gl.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT);    
    gl.glMatrixMode(GL2.GL_MODELVIEW); 
    gl.glLoadIdentity(); 
    // call your draw code here 

     gl.glTranslatef(0, 0, xLoc); 
     gl.glRotatef(rotateX, 1, 0, 0); 
     gl.glRotatef(rotateY, 0, 1, 0); 
     gl.glRotatef(rotateZ, 0, 0, 1); 

     square.draw(gl); 

    // end calls for drawing 

} 

 Смежные вопросы

  • Нет связанных вопросов^_^