Java JOGL textured object not translating -
i have been attempting use jogl in standalone java app. have done work opengles on android , ported code android opengl java app. there have been syntax changes methods , build steps similar , in place.
i able draw vertex arrays of floats on canvas , pass color data shaders. working on texturing. problem is. able texture , apply additional colors shaders via java want able move object in 3d space.
without texturing, able rotate/translate object when apply texturing object (which apply texture), can not rotate/translate object.
if can point in right direction of overlooking. have searched , looked @ tutorials , examples seem doing basics of have.
to clarify, having issues moving textured object in 3d space.
this examplegl main renderer:
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 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 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 farthest gl.glenable(gl2.gl_depth_test); // enables depth testing gl.gldepthfunc(gl2.gl_lequal); // type of depth test gl.glhint(gl2.gl_perspective_correction_hint, gl2.gl_nicest); // best perspective correction gl.glshademodel(gl2.gl_smooth); // blends colors nicely, , smoothes out lighting setcameraview(gl, 30); } private void setcameraview(gl2 gl, float distance) { // todo auto-generated method stub // change 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 model view matrix. gl.glmatrixmode(gl2.gl_modelview); gl.glloadidentity(); } } this object want draw:
public class glsquareex { private floatbuffer vertexbuffer; // buffer vertex-array private floatbuffer colorbuffer; // buffer 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 vertex buffer public glsquareex(gl2 gl, boolean istex) { createvertexbuffer(); istextured = istex; if(istex){ createtexturebuffer(); initializetexture(gl); } } // render shape public void draw(gl2 gl) { gl.glpushmatrix(); /* * start drawing */ // enable vertex-array , define 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; } } this texturehelper class:
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; } } below vertex shader using when attempting apply texture:
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; } below fragment shader using when attempting apply texture:
precision mediump float; uniform sampler2d s_texture; varying vec2 v_texcoord; varying vec3 col; void main() { // pass through color gl_fragcolor = vec4( col, 1.0 ) * texture2d(s_texture, v_texcoord); }
just woke morning , went right program starring @ it. realized may need set modelview matrix drawing before translation. worked!
this method missing , needed add before loading identitiy matrix. must have been set matrix.
gl.glmatrixmode(gl2.gl_modelview); honestly don't understand why works not but, when not textured, worked.
here simple change drawing method in main renderer:
@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 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 drawing }
Comments
Post a Comment