将alpha指定给对象OpenGL ES
我是OpenGl新手,我想实现的是将纹理的alpha值从1.0设置为0.0 我一直在搜索,只找到了“如何在图像中加载alpha”,但我找不到如何将alpha应用于对象 我曾尝试过:将alpha指定给对象OpenGL ES,opengl,opengl-es,alpha,Opengl,Opengl Es,Alpha,我是OpenGl新手,我想实现的是将纹理的alpha值从1.0设置为0.0 我一直在搜索,只找到了“如何在图像中加载alpha”,但我找不到如何将alpha应用于对象 我曾尝试过: gl.glEnable(GL10.GL_ALPHA_TEST); alpha += 0.002f; if(alpha > 1) alpha = 1f; gl.glAlphaFunc(GL10.GL_EQUAL, alpha); 但它不起作用,我如何给一个对象/纹理赋予alpha值(使其褪色的效果) 这是我的课
gl.glEnable(GL10.GL_ALPHA_TEST);
alpha += 0.002f;
if(alpha > 1) alpha = 1f;
gl.glAlphaFunc(GL10.GL_EQUAL, alpha);
但它不起作用,我如何给一个对象/纹理赋予alpha值(使其褪色的效果)
这是我的课
public class Palabra {
public float posX = 0f;
public float posY = 0f;
public float scaleX = 2f;
public float scaleY = 2f;
public float alpha= 0.5f;
public State estado;
private FloatBuffer vertexBuffer, texBuffer; // Buffer for vertex-array
private float[] vertices = { // Vertices for a face
0.0f, 0.0f, 0.2f, // 0. left-bottom-front
2.1f, 0.0f, 0.2f, // 1. right-bottom-front
0.0f, 0.35f, 0.2f, // 2. left-top-front
2.1f, 0.35f, 0.2f // 3. right-top-front
};
float[] texCoords = { // Texture coords for the above face
0.00f, 0.0f, 1.0f, // A. left-bottom
1.00f, 0.0f, 1.0f, // B. right-bottom
0.00f, 0.2f, 1.0f, // C. left-top
1.00f, 0.2f, 1.0f // D. right-top
};
public enum State {
MISS, NORMAL,GREAT,AWESOME,PERFECT;
}
public Palabra(int a) {
// Setup vertex-array buffer. Vertices in float. An float has 4 bytes
ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
vbb.order(ByteOrder.nativeOrder()); // Use native byte order
vertexBuffer = vbb.asFloatBuffer(); // Convert from byte to float
vertexBuffer.put(vertices); // Copy data into buffer
vertexBuffer.position(0); // Rewind
// Setup texture-coords-array buffer, in float. An float has 4 bytes
// (NEW)
ByteBuffer tbb = ByteBuffer.allocateDirect(texCoords.length * 4);
tbb.order(ByteOrder.nativeOrder());
texBuffer = tbb.asFloatBuffer();
texBuffer.put(texCoords);
texBuffer.position(0);
posX = (float) 0.00f;
switch(a)
{
case 0:
posY = (float) 1f;
break;
case 1:
posY = (float) 1.5f;
break;
case 2:
posY = (float) 2f;
break;
case 3:
posY = (float) 2.5f;
break;
case 4:
posY = (float) 3f;
break;
}
}
public void draw(GL10 gl)
{
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glPushMatrix();
gl.glTranslatef(posX, posY, 0f);
gl.glScalef(scaleX, scaleY, 0f);
scaleX -= 0.02f;
scaleY -= 0.02f;
posX += 0.02f;
if(scaleX < 1)
{
scaleX = 1f;
posX -= 0.02f;
}
if(scaleY < 1) scaleY = 1f;
gl.glMatrixMode(GL10.GL_TEXTURE);
gl.glLoadIdentity();
switch(this.estado)
{
case AWESOME:
gl.glTranslatef(0.0f, 0.2f, 0f);
break;
case GREAT:
gl.glTranslatef(0.0f, 0.4f, 0f);
break;
case NORMAL:
gl.glTranslatef(0.0f, 0.6f, 0f);
break;
case MISS:
gl.glTranslatef(0.0f, 0.8f, 0f);
break;
case PERFECT:
break;
}
gl.glFrontFace(GL10.GL_CCW); // Front face in counter-clockwise
// orientation
gl.glEnable(GL10.GL_CULL_FACE); // Enable cull face
gl.glCullFace(GL10.GL_BACK); // Cull the back face (don't display)
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); // Enable
// texture-coords-array
// (NEW)
gl.glTexCoordPointer(3, GL10.GL_FLOAT, 0, texBuffer); // Define
// texture-coords
// buffer (NEW)
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
// front
gl.glBindTexture(GL10.GL_TEXTURE_2D, TextureLoader.palabrasIDs[0]);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY); // Disable
// texture-coords-array
// (NEW)
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisable(GL10.GL_CULL_FACE);
gl.glDisable(GL10.GL_BLEND);
gl.glPopMatrix();
}
公共类宫殿{
公共浮点数posX=0f;
公共浮点数posY=0f;
公共浮点数scaleX=2f;
公共浮点数scaleY=2f;
公众浮标α=0.5f;
公共国家财产;
私有FloatBuffer vertexBuffer,texBuffer;//顶点数组的缓冲区
私有浮动[]顶点={//面的顶点
0.0f,0.0f,0.2f,//0.左下前
2.1f、0.0f、0.2f、//1.右下前
0.0f,0.35f,0.2f,//2.左上前
2.1f、0.35f、0.2f//3.右上前
};
float[]texCoords={//上面的纹理坐标
0.00f,0.0f,1.0f,//A.左下
1.00f,0.0f,1.0f,//B.右下角
0.00f,0.2f,1.0f,//C.左上角
1.00f、0.2f、1.0f//D.右上角
};
公共枚举状态{
小姐,正常,很棒,很棒,完美;
}
公共宫殿(INTA){
//设置顶点数组缓冲区。浮点中的顶点。浮点有4个字节
ByteBuffer vbb=ByteBuffer.allocateDirect(顶点.length*4);
vbb.order(ByteOrder.nativeOrder());//使用本机字节顺序
vertexBuffer=vbb.asFloatBuffer();//从字节转换为浮点
vertexBuffer.put(顶点);//将数据复制到缓冲区
vertexBuffer.position(0);//倒带
//设置纹理坐标数组缓冲区,浮点型。浮点型有4个字节
//(新)
ByteBuffer tbb=ByteBuffer.allocateDirect(texCoords.length*4);
tbb.order(ByteOrder.nativeOrder());
texBuffer=tbb.asFloatBuffer();
texBuffer.put(texCoords);
位置(0);
posX=(浮动)0.00f;
开关(a)
{
案例0:
posY=(浮动)1f;
打破
案例1:
posY=(浮动)1.5f;
打破
案例2:
posY=(浮动)2f;
打破
案例3:
posY=(浮动)2.5f;
打破
案例4:
posY=(浮动)3f;
打破
}
}
公共作废提款(GL10 gl)
{
gl.glMatrixMode(GL10.gl_MODELVIEW);
gl.glLoadIdentity();
gl.glPushMatrix();
gl.glTranslatef(posX,posY,0f);
gl.glScalef(scaleX,scaleY,0f);
scaleX-=0.02f;
scaleY-=0.02f;
posX+=0.02f;
if(scaleX<1)
{
scaleX=1f;
posX-=0.02f;
}
如果(scaleY<1)scaleY=1f;
gl.glMatrixMode(GL10.gl_纹理);
gl.glLoadIdentity();
开关(this.estado)
{
案例真棒:
gl.glTranslatef(0.0f,0.2f,0f);
打破
伟大案例:
gl.glTranslatef(0.0f,0.4f,0f);
打破
正常情况:
gl.glTranslatef(0.0f,0.6f,0f);
打破
案件未遂:
gl.glTranslatef(0.0f,0.8f,0f);
打破
案例完善:
打破
}
gl.glFrontFace(GL10.gl_CCW);//逆时针方向的正面
//定向
gl.glEnable(GL10.gl_CULL_FACE);//启用消隐面
gl.glCullFace(GL10.gl_BACK);//剔除背面(不显示)
gl.glEnableClientState(GL10.gl_顶点数组);
gl.glVertexPointer(3,GL10.gl_FLOAT,0,vertexBuffer);
gl.glEnableClientState(GL10.gl_纹理_坐标_数组);//启用
//纹理坐标数组
//(新)
gl.glTexCoordPointer(3,GL10.gl_FLOAT,0,texBuffer);//定义
//纹理坐标
//缓冲区(新)
glEnable(GL10.Glu混合物);
gl.glBlendFunc(GL10.gl_SRC_ALPHA,GL10.gl_ONE_减去SRC_ALPHA);
//正面
gl.glBindTexture(GL10.gl_TEXTURE_2D,TextureLoader.palabrasIDs[0]);
gl.gldrawArray(GL10.gl_三角形_带,0,4);
gl.glDisableClientState(GL10.gl_纹理_坐标_数组);//禁用
//纹理坐标数组
//(新)
gl.glDisableClientState(GL10.gl_顶点数组);
gl.glDisable(GL10.gl\u CULL\u FACE);
gl.glDisable(GL10.gl\u混合);
gl.glPopMatrix();
}
}我成功了
这就是代码
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glColor4f(1f, 1f, 1f,alpha);
alpha -= 0.002f;
if(alpha < 0) alpha = 0f;
gl.glEnable(GL10.gl\u混合物);
gl.glBlendFunc(GL10.gl_SRC_ALPHA,GL10.gl_ONE_减去SRC_ALPHA);
gl.glColor4f(1f,1f,1f,alpha);
α-=0.002f;
如果(α<0)α=0f;
您是否在任何地方启用纹理?我在张贴的代码中没有看到它。应该有一个glEnable(GL_TEXTURE_2D)
在某个地方。我想我不需要它(它们在某种程度上正确显示),因为我使用GL_VERTEX_数组来绘制纹理,而不是使用纹理2D。那么你想要逐顶点alpha吗?任何地方都没有调用glColor4*(…)
的代码,也没有颜色指针。感谢您的回复,并在上面帮助我解决问题,使用glColor4f,我在做什么?我给每个像素加上alpha的颜色?