opengl multitexturing正在消灭我的场景!

时间:2011-06-10 15:45:02

标签: opengl

我正在尝试使用opengl和multitexturing实现alpha蒙版。我有一个alpha图像(它是alpha通道中没有数据的RGB)和另一个图像(也是RGB没有alpha)我想用alpha图像进行掩码。我在场景中使用四边形地面和背景四边形,然后是一个四边形,代表我试图掩盖的实体。

当我“打开”多重纹理代码时,屏幕上会擦除地面和背景四边形。我确实看到前景四边形与图像图像,它被正确掩盖。当我关闭多纹理代码时,场景会按预期渲染,但会删除前景对象和图像(以及多重纹理)。

我修改了我的alpha蒙版并发现,多纹理代码正在绘制一个巨大的平面(尽管我的uv坐标计算和glVertex3f调用)与原始图像和alpha贴图。我得到的印象是OpenGL忽略了我的glVertex3f调用。

我必须将GL_SOURCE0_RGB更改为GL_SOURCE1_RGB b / c如果我不这样做我从视频卡中得到了非常奇怪的行为(前景对象渲染但是未应用蒙版并且变为灰色四边形屏幕的右侧应用了一个时髦的投影)。我在2个系统上测试了这个,在两种情况下都是相同的行为。

我正在尝试使用固定的管道多纹理技术。

GLuint alphaGLTexture; 
SDL_SurfaceToGLTexture(aTexture, &alphaGLTexture);

GLuint fgGLTexture;
SDL_SurfaceToGLTexture(fgTexture, &fgGLTexture);

glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glBindTexture (GL_TEXTURE_2D, alphaGLTexture);

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);

glActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, fgGLTexture); 

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_ALPHA);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);

glTranslatef(0.0f, 0.0f, 0.0f);

double u_coord = 0.0f, v_coord = 0.0f;

glBegin(GL_QUADS);

glMultiTexCoord2f(GL_TEXTURE0, u_coord, v_coord);
glMultiTexCoord2f(GL_TEXTURE1, u_coord, v_coord);
glVertex3f(posax, posay, posaz);

u_coord = 1.0f; v_coord = 0.0f;
glMultiTexCoord2f(GL_TEXTURE0, u_coord, v_coord);
glMultiTexCoord2f(GL_TEXTURE1, u_coord, v_coord);
glVertex3f(posbx, posby, posbz);

u_coord = 1.0f; v_coord = 1.0f;
glMultiTexCoord2f(GL_TEXTURE0, u_coord, v_coord);
glMultiTexCoord2f(GL_TEXTURE1, u_coord, v_coord);
glVertex3f(poscx, poscy, poscz);

u_coord = 0.0f; v_coord = 1.0f;
glMultiTexCoord2f(GL_TEXTURE0, u_coord, v_coord);
glMultiTexCoord2f(GL_TEXTURE1, u_coord, v_coord);
glVertex3f(posdx, posdy, posdz);

glEnd();

glLoadIdentity();

函数SDL_SurfaceToGLTexture一致地为地面和背景四边形工作。

2 个答案:

答案 0 :(得分:2)

将alpha纹理绑定到GL_TEXTURE0,将前景纹理绑定到GL_TEXTURE1。但在绘制时,您为GL_TEXTURE1GL_TEXTURE2设置了纹理坐标。这是打算还是可能是你的问题?

编辑:除了渲染背景四边形时使用的单位外,您确定已禁用所有单位的纹理。还要记住,纹理环境是单位状态而不是每纹理状态,因此在背景四边形上使用纹理时也必须恢复纹理环境。

克里斯的解决方案与此相关。请记住,OpenGL是一个状态机,当不重置活动纹理单元时,所有后续纹理操作都适用于GL_TEXTURE1,当不为未使用单元禁用纹理时,所有后续对象(即使在下一帧中,当然)将被绘制成多层纹理。

答案 1 :(得分:1)

在为第二级设置纹理环境后,尝试调用“glActiveTexture(GL_TEXTURE0);”再次。当我忘记将纹理级别重置回GL_TEXTURE0时,我看到了很多奇怪。

此外,在每次OpenGL调用之后,将一些调用分散到glGetError(),以查看看起来无辜的东西是否有错误。