頂点インデックスを使用してメッシュをレンダリングしています。頂点インデックスと頂点位置を渡すのに問題はありません。
しかし、テクスチャ座標の場合、インデックスを使用してそれらを渡す必要がありますか?
編集: OBJファイルを渡してレンダリングしようとしていますが、「fx / y/z」で説明されているテクスチャ座標の処理方法について混乱しています。
たとえば、立方体の場合、頂点座標を渡します。
*8頂点座標
* 36頂点インデックス:
テクスチャ(または法線)を渡すときは、次のように渡す必要があります。
* (8テクスチャ座標+ 36テクスチャ座標インデックス)。もしそうなら、レンダリング中にそれらを割り当てる方法は?
また
* (36テクスチャ座標)?
これは私の抽象メッシュクラスです、
public class AbstractMesh3D {
//private int buffers[]={0,0};
private int vbVertices[]=new int[1];
private int vbIndices[]=new int[1];
private int vbNormals[]=new int[1];
private int vbColors[]=new int[1];
private int vbTextureCords[]=new int[1];
private boolean bVertices=false;
private boolean bIndices=false;
private boolean bNormals=false;
private int numOfVertices;
private int numOfIndices;
private int numOfNormals;
private World3D _world;
private String textureId;
public void setTextureId(String textureId) {
this.textureId = textureId;
}
public AbstractMesh3D(){
}
public void setWorld(World3D world){
this._world=world;
}
public void setVertexBuffer(float vertexData[]){
GLES20.glGenBuffers(1, vbVertices, 0);
//Short
FloatBuffer vertexFloatBuffer=ByteBuffer.allocateDirect(vertexData.length*4).order(ByteOrder.nativeOrder()).asFloatBuffer();
vertexFloatBuffer.put(vertexData);
vertexFloatBuffer.position(0);
//GLES20.glGenBuffers(1, vbVertices, 0);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vbVertices[0]);
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, vertexData.length*4, vertexFloatBuffer, GLES20.GL_STATIC_DRAW);
numOfVertices=vertexData.length/3;
bVertices=true;
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);
//vertexFloatBuffer.
}
public void setNormalBuffer(float normalData[]){
GLES20.glGenBuffers(1, vbNormals, 0);
//Short
FloatBuffer vertexFloatBuffer=ByteBuffer.allocateDirect(normalData.length*4).order(ByteOrder.nativeOrder()).asFloatBuffer();
vertexFloatBuffer.put(normalData);
vertexFloatBuffer.position(0);
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vbNormals[0]);
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, normalData.length*4, vertexFloatBuffer, GLES20.GL_STATIC_DRAW);
bNormals=true;
numOfNormals=normalData.length/3;
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);
}
public void setIndices(short indices[]){
GLES20.glGenBuffers(1, vbIndices, 0);
ShortBuffer vertexFloatBuffer=ByteBuffer.allocateDirect(indices.length*2).order(ByteOrder.nativeOrder()).asShortBuffer();
vertexFloatBuffer.put(indices);
vertexFloatBuffer.position(0);
//GLES20.glGenBuffers(1, buffers[1], 0);
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, vbIndices[0]);
GLES20.glBufferData(GLES20.GL_ELEMENT_ARRAY_BUFFER, indices.length*2, vertexFloatBuffer, GLES20.GL_STATIC_DRAW);
numOfIndices=indices.length;
bIndices=true;
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);
}
public void render(){
int posHandle=_world.getOgl_aPositionHandle();
int normalHandle=_world.getOgl_aNormalHandle();
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vbVertices[0]);
GLES20.glEnableVertexAttribArray(posHandle);
GLES20.glVertexAttribPointer(posHandle, 3, GLES20.GL_FLOAT, false, 12, 0);
if(bNormals){
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vbNormals[0]);
GLES20.glEnableVertexAttribArray(normalHandle);
GLES20.glVertexAttribPointer(normalHandle, 3, GLES20.GL_FLOAT, false, 12, 0);
}
if(bIndices){
//System.out.println("render indices");
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, vbIndices[0]);
GLES20.glDrawElements(GLES20.GL_TRIANGLES, numOfIndices, GLES20.GL_UNSIGNED_SHORT, 0);
}else{
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, numOfVertices);
}
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);
GLES20.glDisableVertexAttribArray(posHandle);
GLES20.glDisableVertexAttribArray(normalHandle);
//System.out.println("rendered");
}
}