【发布时间】:2012-02-07 08:00:13
【问题描述】:
我正在尝试在 Android 上学习 OpenGL,作为我学习项目的一部分,我想让纹理的一部分透明。为了实现这一点,我有一个全白的纹理,在我想要透明度的地方设置为透明的 alpha 通道。我的计划是将它与我想要显示的纹理相乘,但我对缩写的函数名称和整数常量感到有些困惑。
有没有简单但完整的纹理乘法示例?
【问题讨论】:
标签: android opengl-es textures
我正在尝试在 Android 上学习 OpenGL,作为我学习项目的一部分,我想让纹理的一部分透明。为了实现这一点,我有一个全白的纹理,在我想要透明度的地方设置为透明的 alpha 通道。我的计划是将它与我想要显示的纹理相乘,但我对缩写的函数名称和整数常量感到有些困惑。
有没有简单但完整的纹理乘法示例?
【问题讨论】:
标签: android opengl-es textures
编辑:我的错,我刚刚看到您正在寻找 gl 1.0 示例
这是一个 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();
【讨论】: