opengl - LWJGL - Interleaved VAO/VBO not texturing -
i have been attempting transition game's prototype renderer it's immediate mode testing implementation actual vao/vbo implementation. vbo rendering on screen, refusing texture. below simplest test class shows problem:
public static void main(string[] args) throws exception { // vertx,verty texx, texy float[] data = new float[] {0.0f, 0.0f, 0.25f, 0.75f, 0.0f, 64.0f, 0.25f, 1.0f, 64.0f, 64.0f, 0.5f, 1.0f, 0.0f, 0.0f, 0.25f, 0.75f, 64.0f, 64.0f, 0.5f, 1.0f, 64.0f, 0.0f, 0.5f, 0.75f}; glfwseterrorcallback(glfwerrorcallback.createprint(system.err)); if (!glfwinit()) throw new illegalstateexception("unable initialize glfw"); long window = glfw.glfwcreatewindow(1600, 900, "test", 0, 0); glfw.glfwmakecontextcurrent(window); gl.createcapabilities(); glmatrixmode(gl_projection); glloadidentity(); glortho(0, 1600, 900, 0, 0.000001, 100); glmatrixmode(gl_modelview); glloadidentity(); glblendfunc(gl_src_alpha, gl_one_minus_src_alpha); int vboid = glgenbuffers(); int vaoid = glgenvertexarrays(); glclientactivetexture(gl_texture0); glenableclientstate(gl_vertex_array); glenableclientstate(gl_texture_coord_array); glbindvertexarray(vaoid); glbindbuffer(gl_array_buffer, vboid); glbufferdata(gl_array_buffer, data, gl_static_draw); glvertexattribpointer(0, 2, gl_float, false, 4*float.bytes, 0); gltexcoordpointer(2, gl_float, 4*float.bytes, 4*float.bytes); glbindbuffer(gl_array_buffer, 0); glbindvertexarray(0); gldisableclientstate(gl_texture_coord_array); gldisableclientstate(gl_vertex_array); gltranslatef(50, 50, 0); texture t = new texture(test.class.getclassloader().getresourceasstream("test/wallfloor.png")); while (!glfw.glfwwindowshouldclose(window)) { glfw.glfwpollevents(); glfw.glfwswapbuffers(window); glclear(gl_depth_buffer_bit | gl_color_buffer_bit); glclientactivetexture(gl_texture0); glenableclientstate(gl_vertex_array); glenableclientstate(gl_texture_coord_array); glbindvertexarray(vaoid); glenablevertexattribarray(0); t.bind(); gldrawarrays(gl_triangles, 0, 6); gldisablevertexattribarray(0); glbindvertexarray(0); gldisableclientstate(gl_texture_coord_array); gldisableclientstate(gl_vertex_array); /* equivelent immediate mode code - works t.bind(); glbegin(gl_triangles); gltexcoord2f(0.25f, 0.75f); glvertex2f(0, 0); gltexcoord2f(0.25f, 1f); glvertex2f(0, 64); gltexcoord2f(0.5f, 0.75f); glvertex2f(64, 0); gltexcoord2f(0.5f, 1f); glvertex2f(64, 64); gltexcoord2f(0.25f, 1f); glvertex2f(0, 64); gltexcoord2f(0.5f, 0.75f); glvertex2f(64, 0); glend(); */ } }
the texture bind call following (where wrap = gl_repeat , filter = gl_nearest):
public void bind() { glactivetexture(gl_texture0); glclientactivetexture(gl_texture0); glenable(gl_texture_2d); glbindtexture(target, id); gltexparameteri(target, gl_texture_min_filter, filter); gltexparameteri(target, gl_texture_mag_filter, filter); gltexparameteri(target, gl_texture_wrap_s, wrap); gltexparameteri(target, gl_texture_wrap_t, wrap); }
having spent weekend googling not finding answer, doing horribly wrong? have tested using immediate mode, still render texture.
in addition, mixing core profile code (glvertexattribpointer
) non-core profile (gltexcoordpointer
)
but real problem comes wrong stride , offset used. stride defines how large data of 1 vertex is, while offset specifies how far beginning of each vertex actual data starts. in case, every vertex consists of 4 floats stride has 4 * float.bytes
. positions first 2 floats in each vertex (offset 0) while texture coordinates 3rd , 4th floats means offset = 2 * float.bytes
. correct code somehow (note usage of glvertexpointer
instead of glvertexattribpointer
):
glvertexpointer(2, gl_float, false, 4*float.bytes, 0); gltexcoordpointer(2, gl_float, 4*float.bytes, 2*float.bytes);
edit
the usage of vaos wrong. in initialization store glvertexpointer/gltexcoordpointer vao vaoid
. in rendering code bind vao 0 instead. attribute settings not present when drawing. in addition, i'm not absolutely sure whether vaos work fixed function calls. in case can remove of vao calls.
Comments
Post a Comment