Parsing .obj files: How to do materials/textures?
I'm new to OpenGL. I'm playing around with it using JOGL. I'm using this model.
I am successfully rendering it to the window. However, I would like to apply textures/materials. I'm not entirely sure how to do this.
From the .obj file:
f 6307/4525/3 6303/4524/3 6327/4523/3 6315/4526/3
usemtl kahki_light_pave_W.png
f 6445/3470/305 6437/4623/305 6593/4624/305 6597/4625/305
f 6594/4626/306 6438/4627/306 6446/4628/306 6598/4629/306
f 6595/4630/307 6439/4631/307 6447/4632/307 6599/4633/307
f 6448/3482/308 6440/4634/308 6596/4635/308 6600/4636/308
Wikipedia tells me that everything after the usemtl
statement and before the next usemtl
statement is supposed to use khaki_light_pave_W.png
. However, I'm not sure how do this in OpenGL.
There are a bunch of vertices defined at the top of the file:
v 19.886690 3.093822 -21.149584
v 23.886690 3.093822 -21.149584
vt 0.918121 0.920883
vt 0.918121 0.959193
vt -0.537323 1.541370
vt -0.537323 1.503060
vt 0.462677 0.503060
Do I need to use the vt
vertices for the texture? T开发者_JAVA百科he f
statements include indices. Are these indicies into the v
vertices, vt
, or both?
tl;dr: The vt
entries specify texture coordinates and the f
entries index (1-based!) into three separate arrays (v
, vt
, and vn
).
From the spec, section "Referencing vertex data":
For all elements, reference numbers are used to identify geometric vertices, texture vertices, vertex normals, and parameter space vertices.
Each of these types of vertices is numbered separately, starting with 1. This means that the first geometric vertex in the file is 1, the second is 2, and so on. The first texture vertex in the file is 1, the second is 2, and so on. The numbering continues sequentially throughout the entire file. Frequently, files have multiple lists of vertex data. This numbering sequence continues even when vertex data is separated by other data.
In addition to counting vertices down from the top of the first list in the file, you can also count vertices back up the list from an element's position in the file. When you count up the list from an element, the reference numbers are negative. A reference number of -1 indicates the vertex immediately above the element. A reference number of -2 indicates two references above and so on
I wrote up an OBJ file loader along with a sample model viewer to display the model using LWJGL, which is similar to JOGL but not exactly the same. (I've used both JOGL and LWJGL - in fact I recently switched from JOGL to LWJGL.)
I strove to make the code as clean and simple as possible. Unfortunately it is "old fashioned" in that it uses the Fixed Function Pipeline rather than custom shaders, but I hope it may be somewhat useful and instructive for the basics. You can find it at;
http://darksleep.com/oObjLoader/
精彩评论