质地并不适用于网 - OpenGL的并不、适用于、质地、OpenGL

2023-09-04 07:08:53 作者:散了吧算了吧

我使用的OpenGL ES。我已成功加载OBJ文件(目),其显示良好,但是当我申请的质感其不显示。

我添加下面的code。

 公共无效画(GL10 GL){
    //绑定pviously生成的纹理在$ P $
    gl.glBindTexture(GL10.GL_TEXTURE_2D,纹理[0]);
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    //设置面旋转
    gl.glFrontFace(GL10.GL_CW);

    gl.glVertexPointer(3,GL10.GL_FLOAT,0,vertexBuffer);
    gl.glTexCoordPointer(2,GL10.GL_FLOAT,0,textureBuffer);

    临行前//禁用客户端状态
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

    的for(int i = 0; I< parts.size();我++){
        TDModelPart吨= parts.get(ⅰ);
        gl.glNormalPointer(GL10.GL_FLOAT,0,t.getNormalBuffer());
        gl.glDrawElements(GL10.GL_TRIANGLES,t.getFacesCount(),GL10.GL_UNSIGNED_SHORT,t.getFaceBuffer());
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    }
}

公共无效buildVertexBuffer(){
    ByteBuffer的vBuf = ByteBuffer.allocateDirect(v.size()* 4);
    vBuf.order(ByteOrder.nativeOrder());
    vertexBuffer = vBuf.asFloatBuffer();
    vertexBuffer.put(toPrimitiveArrayF(ⅴ));
    vertexBuffer.position(0);

    vBuf = ByteBuffer.allocateDirect(texture.length * 4);
    vBuf.order(ByteOrder.nativeOrder());
    textureBuffer = vBuf.asFloatBuffer();
    textureBuffer.put(纹理);
    textureBuffer.position(0);
}

私有静态浮动[] toPrimitiveArrayF(矢量<浮法>向量){
    浮动[] F;
    F =新的浮动[vector.size()];
    的for(int i = 0; I< vector.size();我++){
        F [I] = vector.get(ⅰ);
    }
    返回F;
}

/ **
 *加载纹理方
 * @参数GL
 * @参数方面
 * /
公共无效loadGLTexture(GL10 GL,上下文语境){
    //载入纹理
    点阵位图= BitmapFactory.de codeResource(context.getResources()
            R.drawable.nehe);

    //生成一个纹理指针
    gl.glGenTextures(1,纹理,0);
    // ...并将其绑定到我们的数组
    gl.glBindTexture(GL10.GL_TEXTURE_2D,纹理[0]);

    //创建就近过滤的纹理
    gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_NEAREST);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER,GL10.GL_LINEAR);

    //不同可能纹理参数,例如GL10.GL_CLAMP_TO_EDGE
    //gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_S,GL10.GL_REPEAT);
    //gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_WRAP_T,GL10.GL_REPEAT);

    //使用机器人GLUtils从我们的位图指定一个二维纹理图像
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D,0,位图,0);

    // 清理
    bitmap.recycle();
}

公共无效onSurfaceCreated(GL10 GL,EGLConfig配置){
    gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_AMBIENT,lightAmbientBuffer);
    gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_DIFFUSE,lightDiffuseBuffer);
    gl.glLightfv(GL10.GL_LIGHT0,GL10.GL_POSITION,lightPositionBuffer);
    gl.glEnable(GL10.GL_LIGHT0);

    model.loadGLTexture(GL,背景);
    gl.glEnable(GL10.GL_TEXTURE_2D);
    gl.glShadeModel(GL10.GL_SMOOTH);
    gl.glClearColor(0.0,0.0,0.0,0.5F);
    gl.glClearDepthf(1.0F);
    gl.glEnable(GL10.GL_DEPTH_TEST);
    gl.glDepthFunc(GL10.GL_LEQUAL);

    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT,GL10.GL_NICEST);
}
 

解决方案

  //临行前禁用客户端状态
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

的for(int i = 0; I< parts.size();我++){
    TDModelPart吨= parts.get(ⅰ);
    gl.glNormalPointer(GL10.GL_FLOAT,0,t.getNormalBuffer());
    gl.glDrawElements(GL10.GL_TRIANGLES,t.getFacesCount(),GL10.GL_UNSIGNED_SHORT,t.getFaceBuffer());
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}
 

当然禁用TEXCOORD阵列的在的绘图东西是不是一个好主意,因为这会导致你的对象不会有任何有效的纹理坐标(当然,stricty说所有的顶点具有当前默认纹理坐标)。以同样的方式,你不应该禁用 GL_VERTEX_ARRAY 在循环的末尾或者,因为这会当然,你的目的是不是对所有下面的循环任何有效位置数据迭代。所以,你的code或许应该是这​​样的:

  //绑定pviously生成的纹理在$ P $
gl.glBindTexture(GL10.GL_TEXTURE_2D,纹理[0]);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
//设置面旋转
gl.glFrontFace(GL10.GL_CW);

gl.glVertexPointer(3,GL10.GL_FLOAT,0,vertexBuffer);
gl.glTexCoordPointer(2,GL10.GL_FLOAT,0,textureBuffer);

的for(int i = 0; I< parts.size();我++){
    TDModelPart吨= parts.get(ⅰ);
    gl.glNormalPointer(GL10.GL_FLOAT,0,t.getNormalBuffer());
    gl.glDrawElements(GL10.GL_TRIANGLES,t.getFacesCount(),GL10.GL_UNSIGNED_SHORT,t.getFaceBuffer());
}

临行前//禁用客户端状态
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
 
Opencv Contrib OpenGL

(现在我会忽略你设置一个 glNormalPointer ,而不是使 GL_NORMAL_ARRAY

永远记住,OpenGL是一个状态机和所有的操作,尤其是绘制调用,在他们被称为点的当前状态下工作,并且状态永远不会改变,除非的您的变化它的自己的(用的你的这意味着应用程序code在这里,包括使用相同的OpenGL上下文任何其他THRID第三方组件)。

I am using OpenGL Es. I have successfully loaded the obj file (mesh) and its displayed well but when I am applying the texture its not displaying.

I have added the code below.

public void draw(GL10 gl) {
    // bind the previously generated texture
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    // Set the face rotation
    gl.glFrontFace(GL10.GL_CW);

    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);

    //Disable the client state before leaving
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

    for(int i=0; i<parts.size(); i++){
        TDModelPart t=parts.get(i);
        gl.glNormalPointer(GL10.GL_FLOAT, 0, t.getNormalBuffer());
        gl.glDrawElements(GL10.GL_TRIANGLES,t.getFacesCount(),GL10.GL_UNSIGNED_SHORT,t.getFaceBuffer());
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    }
}

public void buildVertexBuffer(){
    ByteBuffer vBuf = ByteBuffer.allocateDirect(v.size() * 4);
    vBuf.order(ByteOrder.nativeOrder());
    vertexBuffer = vBuf.asFloatBuffer();
    vertexBuffer.put(toPrimitiveArrayF(v));
    vertexBuffer.position(0);

    vBuf = ByteBuffer.allocateDirect(texture.length * 4);
    vBuf.order(ByteOrder.nativeOrder());
    textureBuffer = vBuf.asFloatBuffer();
    textureBuffer.put(texture);
    textureBuffer.position(0);
}

private static float[] toPrimitiveArrayF(Vector<Float> vector){
    float[] f;
    f=new float[vector.size()];
    for (int i=0; i<vector.size(); i++){
        f[i]=vector.get(i);
    }
    return f;
}

/**
 * Load the texture for the square
 * @param gl
 * @param context
 */
public void loadGLTexture(GL10 gl, Context context) {
    // loading texture
    Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),
            R.drawable.nehe);

    // generate one texture pointer
    gl.glGenTextures(1, textures, 0);
    // ...and bind it to our array
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);

    // create nearest filtered texture
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);

    //Different possible texture parameters, e.g. GL10.GL_CLAMP_TO_EDGE
    //gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT);
    //gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);

    // Use Android GLUtils to specify a two-dimensional texture image from our bitmap 
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);

    // Clean up
    bitmap.recycle();
}

public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_AMBIENT, lightAmbientBuffer);      
    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_DIFFUSE, lightDiffuseBuffer);      
    gl.glLightfv(GL10.GL_LIGHT0, GL10.GL_POSITION, lightPositionBuffer);    
    gl.glEnable(GL10.GL_LIGHT0);

    model.loadGLTexture(gl, context);
    gl.glEnable(GL10.GL_TEXTURE_2D);
    gl.glShadeModel(GL10.GL_SMOOTH);            
    gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);    
    gl.glClearDepthf(1.0f);                     
    gl.glEnable(GL10.GL_DEPTH_TEST);            
    gl.glDepthFunc(GL10.GL_LEQUAL);         

    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); 
}

解决方案

//Disable the client state before leaving
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

for(int i=0; i<parts.size(); i++) {
    TDModelPart t=parts.get(i);
    gl.glNormalPointer(GL10.GL_FLOAT, 0, t.getNormalBuffer());
    gl.glDrawElements(GL10.GL_TRIANGLES,t.getFacesCount(),GL10.GL_UNSIGNED_SHORT,t.getFaceBuffer());
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
}

Of course disabling the texCoord array before drawing anything is not a good idea, since that will cause your object to not have any valid texture coordinates (well, stricty speaking all its vertices have the current default texture coordinates). In the same way you shouldn't disable the GL_VERTEX_ARRAY at the end of the loop either, since this will course your object to not have any valid position data for all the following loop iterations. So your code should probably look like:

// bind the previously generated texture
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
// Set the face rotation
gl.glFrontFace(GL10.GL_CW);

gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);

for(int i=0; i<parts.size(); i++){
    TDModelPart t=parts.get(i);
    gl.glNormalPointer(GL10.GL_FLOAT, 0, t.getNormalBuffer());
    gl.glDrawElements(GL10.GL_TRIANGLES,t.getFacesCount(),GL10.GL_UNSIGNED_SHORT,t.getFaceBuffer());
}

//Disable the client state before leaving
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

(For now I'll ignore that you set a glNormalPointer while not enabling the GL_NORMAL_ARRAY.)

Always keep in mind that OpenGL is a state machine and all operations, especially draw calls, operate on the current state at the point they are called and that state won't ever change except you change it yourself (with "you" meaning the application code here, including any other thrid party components using the same OpenGL context).