【问题标题】:Multiply textures in Android OpenGL ES 1.1在 Android OpenGL ES 1.1 中叠加纹理
【发布时间】:2012-02-07 08:00:13
【问题描述】:

我正在尝试在 Android 上学习 OpenGL,作为我学习项目的一部分,我想让纹理的一部分透明。为了实现这一点,我有一个全白的纹理,在我想要透明度的地方设置为透明的 alpha 通道。我的计划是将它与我​​想要显示的纹理相乘,但我对缩写的函数名称和整数常量感到有些困惑。

有没有简单但完整的纹理乘法示例?

【问题讨论】:

    标签: android opengl-es textures


    【解决方案1】:

    编辑:我的错,我刚刚看到您正在寻找 gl 1.0 示例

    看起来您正在寻找多纹理示例:http://code.google.com/p/opengles-book-samples/source/browse/trunk/Android/Ch10_MultiTexture/src/com/openglesbook/multitexture/MultiTextureRenderer.java?r=45

    这是一个 opengl es 2.0 示例。当您阅读代码时,您会看到纹理的实际混合是在 Fragmentsshader 中完成的。

    编辑 2:我找不到 opengl-es 1.1 示例,但我有一些旧的 opengl 2.0 代码。它是c/c++,所以你必须自己把它转换成java。

    我查阅了 GLES 1.1 规范,它似乎支持我的代码中的关键功能:glActiveTexture、glMultiTexCoord 和 glTexEnvi,所以这可能有助于您入门...

    glActiveTextureARB( GL_TEXTURE0_ARB );
    glBindTexture( GL_TEXTURE_2D, KdMapIndex );
    glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    
    glActiveTextureARB( GL_TEXTURE1_ARB );
    glBindTexture(GL_TEXTURE_2D, KaMapIndex);
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD);
    
    glBegin(GL_TRIANGLES);
    for (face = faces.begin(); face != faces.end(); face++)
    {
        CVector3f normal;
        CVector2f texture0, texture1, texture2;
        CVector3f vertex0, vertex1, vertex2;
    
        normal.x = data.normals[face->nIndex[0]-1].x;
        normal.y = data.normals[face->nIndex[1]-1].y;
        normal.z = data.normals[face->nIndex[2]-1].z;
        normal.normalize();
    
        texture0 = data.texcoords[face->tIndex[0]-1];
        texture1 = data.texcoords[face->tIndex[1]-1];
        texture2 = data.texcoords[face->tIndex[2]-1];
    
        vertex0 = data.vertices[face->vIndex[0]-1];
        vertex1 = data.vertices[face->vIndex[1]-1];
        vertex2 = data.vertices[face->vIndex[2]-1];
    
        glNormal3f(normal.x, normal.y, normal.z);       // Face normal
    
        glMultiTexCoord2fARB( GL_TEXTURE0_ARB, texture0.x, texture0.y ); // texcoord 0
        glMultiTexCoord2fARB( GL_TEXTURE1_ARB, texture0.x, texture0.y );        
        glVertex3f(vertex0.x, vertex0.y, vertex0.z);    // vertex 0
    
        glMultiTexCoord2fARB( GL_TEXTURE0_ARB, texture1.x, texture1.y ); // texcoord 1
        glMultiTexCoord2fARB( GL_TEXTURE1_ARB, texture1.x, texture1.y );    
        glVertex3f(vertex1.x, vertex1.y, vertex1.z);    // vertex 1
    
        glMultiTexCoord2fARB( GL_TEXTURE0_ARB, texture2.x, texture2.y ); // texcoord 2
        glMultiTexCoord2fARB( GL_TEXTURE1_ARB, texture2.x, texture2.y );    
        glVertex3f(vertex2.x, vertex2.y, vertex2.z);    // vertex 2
    }
    glEnd();
    

    【讨论】:

    • 是的,不幸的是我使用的库需要 ES 1.0
    • 小划痕:ES 1.1。虽然仍然不是 2.0
    • 就像我说的,我正在学习,所以我会向您提出问题。随意回答这些或不回答,因为它们是辅助的。 glBegin() 和 glEnd() 是必要的吗?我不是在处理面法线(这都是平坦的,没有动态照明),我的顶点都被捆绑到一个 float[] 缓冲区中
    • 不,glBegin() 和 glEnd() 不是必需的。就像我说的,这是旧代码,这个特定的示例是从显示列表中提取出来的。这里最相关的是确定纹理混合的 glMultiTexCoord 调用和 glTexEnv 调用。您可以忽略其余部分,但我认为这里的一般原则也适用于 opengl-es(请注意,这是我的假设)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    相关资源
    最近更新 更多