Hello guys
I read a lot of guides but I didnt found one who work for me … or Im just too dumb to “translate them” to my code :yawn: …
I rendering my textures in this way:
public void render() {
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, sprite.getT());
if (isLinealScale()) {
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER,
GL_LINEAR);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER,
GL_LINEAR);
}
float x = getPosX() + getModPosX() - getBindX();
float y = getPosY() + getModPosY() - getBindY();
float w = getPosX() + getModPosX() + getCurrentWidth() - getBindX();
float h = getPosY() + getModPosY() + getCurrentHeight() - getBindY();
float sprX = sprite.getX();
float sprY = sprite.getY();
float sprW = sprX + sprite.getW();
float sprH = sprY + sprite.getH();
// switch (blend) {
// case MULTIPLY:
// glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// break;
// case SCREEN:
// glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
// break;
//
// default:
// break;
// }
glPushMatrix();
glTranslatef(x + getBindX(), y + getBindY(), 0);
glRotatef(getAngle(), 0, 0, 1);
glTranslatef(-x - getBindX(), -y - getBindY(), 0);
glBegin(GL_QUADS);
glColor4f(1.0f, 1.0f, 1.0f, getOpasity());
if (flip) {
glTexCoord2f(sprW, sprY);
glVertex2f(x, y);
glTexCoord2f(sprX, sprY);
glVertex2f(w, y);
glTexCoord2f(sprX, sprH);
glVertex2f(w, h);
glTexCoord2f(sprW, sprH);
glVertex2f(x, h);
} else {
glTexCoord2f(sprX, sprY);
glVertex2f(x, y);
glTexCoord2f(sprW, sprY);
glVertex2f(w, y);
glTexCoord2f(sprW, sprH);
glVertex2f(w, h);
glTexCoord2f(sprX, sprH);
glVertex2f(x, h);
}
glColor4f(1.0f, 1.0f, 1.0f, 1f);
glEnd();
glPopMatrix();
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0);
// glBlendFunc(GL_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
if (isLinealScale()) {
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER,
GL_NEAREST);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER,
GL_NEAREST);
}
}
as you can see I dont use “GL_TEXTURE_2D” when I bind a texture, instep i use “GL_TEXTURE_RECTANGLE_ARB”, this might be one of the reasons I cant accomplish the masking … but when I bind my texture id with GL_TEXTURE_2D I only get a white square (and Im using glEnable(GL_TEXTURE_2D) by default in my Display and even with that it doesnt work for me)
Any way … I create a new texture object extending my normal texture who work fine with png textures with alpha and with glBlendFunc(GL_ALPHA, GL_ONE_MINUS_SRC_ALPHA) as the default blend.
This new object just add another sprite named mask who may or not has a different size, and may or not to be in the same png.
The type of masking i whant is this one …
having this texture (this texture may have Alpha channel):
and this mask (just white and black texture without Alpha channel??? ??? really want this one have alpha channel too :clue:)
and with some combination of glBlendFunc in the texture and the mask … get this
(without the background texture …just transparency)
By the moment I have this code
public void render() {
glDisable(GL_DEPTH_TEST);
float x = getPosX() + getModPosX() - getBindX();
float y = getPosY() + getModPosY() - getBindY();
glPushMatrix();
glTranslatef(x + getBindX(), y + getBindY(), 0);
glRotatef(getAngle(), 0, 0, 1);
glTranslatef(-x - getBindX(), -y - getBindY(), 0);
// ============ First Render ==============
// glColor4f(1.0f, 1.0f, 1.0f, 1f);
// glColor4f(1.0f, 1.0f, 1.0f, 0f);
// glColor4f(0f, 0f, 0f, 1f);
// glBlendFunc(GL_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// GL14.glBlendEquation(GL14.GL_FUNC_ADD);
// GL14.glBlendFuncSeparate(GL_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA,
// GL_ZERO, GL_ONE);
// glBlendFunc(GL_ONE, GL_ZERO);
// glBlendFunc(GL_ONE, GL_SRC_COLOR);
// glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR);
// glBlendFunc(GL_ONE, GL_DST_COLOR);
// glBlendFunc(GL_ONE, GL_ONE_MINUS_DST_COLOR);
// glBlendFunc(GL_ONE, GL_SRC_ALPHA);
// glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
// glBlendFunc(GL_ONE, GL_DST_ALPHA);
// glBlendFunc(GL_ONE, GL_ONE_MINUS_DST_ALPHA);
// glBlendFunc(GL_ONE, GL_SRC_ALPHA_SATURATE);
// glBlendFunc(GL_ONE, GL_CONSTANT_COLOR);
// glBlendFunc(GL_ONE, GL_ONE_MINUS_CONSTANT_COLOR);
// glBlendFunc(GL_ONE, GL_CONSTANT_ALPHA);
// glBlendFunc(GL_ONE, GL_ONE_MINUS_CONSTANT_ALPHA);
// glBlendFunc(GL_ONE_MINUS_CONSTANT_COLOR, GL_ONE_MINUS_SRC_ALPHA);
glBlendFunc(GL_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
renderMask();
// ============== End First Render ==============
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, 0);
// ============== Second Render ==============
glColor4f(1.0f, 1.0f, 1.0f, getOpasity());
// glBlendFunc(GL_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBlendFunc(GL_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
renderSprite();
// ============== End Second Render ==============
glPopMatrix();
glColor4f(1.0f, 1.0f, 1.0f, 1f);
glBlendFunc(GL_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_DEPTH_TEST);
}
private void renderMask() {
float x = getPosX() + getModPosX() - getBindX();
float y = getPosY() + getModPosY() - getBindY();
float w = getPosX() + getModPosX() + getCurrentWidth() - getBindX();
float h = getPosY() + getModPosY() + getCurrentHeight() - getBindY();
float maskSprX = mask.getX();
float maskSprY = mask.getY();
float maskSprW = maskSprX + mask.getW();
float maskSprH = maskSprY + mask.getH();
if (linearMask) {
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER,
GL_LINEAR);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER,
GL_LINEAR);
}
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, mask.getT());
glBegin(GL_QUADS);
if (isFlip()) {
glTexCoord2f(maskSprW, maskSprY);
glVertex2f(x, y);
glTexCoord2f(maskSprX, maskSprY);
glVertex2f(w, y);
glTexCoord2f(maskSprX, maskSprH);
glVertex2f(w, h);
glTexCoord2f(maskSprW, maskSprH);
glVertex2f(x, h);
} else {
glTexCoord2f(maskSprX, maskSprY);
glVertex2f(x, y);
glTexCoord2f(maskSprW, maskSprY);
glVertex2f(w, y);
glTexCoord2f(maskSprW, maskSprH);
glVertex2f(w, h);
glTexCoord2f(maskSprX, maskSprH);
glVertex2f(x, h);
}
glEnd();
if (linearMask) {
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER,
GL_NEAREST);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER,
GL_NEAREST);
}
}
private void renderSprite() {
float x = getPosX() + getModPosX() - getBindX();
float y = getPosY() + getModPosY() - getBindY();
float w = getPosX() + getModPosX() + getCurrentWidth() - getBindX();
float h = getPosY() + getModPosY() + getCurrentHeight() - getBindY();
float sprX = getSprite().getX();
float sprY = getSprite().getY();
float sprW = sprX + getSprite().getW();
float sprH = sprY + getSprite().getH();
if (isLinealScale()) {
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER,
GL_LINEAR);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER,
GL_LINEAR);
}
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, getSprite().getT());
glBegin(GL_QUADS);
if (isFlip()) {
glTexCoord2f(sprW, sprY);
glVertex2f(x, y);
glTexCoord2f(sprX, sprY);
glVertex2f(w, y);
glTexCoord2f(sprX, sprH);
glVertex2f(w, h);
glTexCoord2f(sprW, sprH);
glVertex2f(x, h);
} else {
glTexCoord2f(sprX, sprY);
glVertex2f(x, y);
glTexCoord2f(sprW, sprY);
glVertex2f(w, y);
glTexCoord2f(sprW, sprH);
glVertex2f(w, h);
glTexCoord2f(sprX, sprH);
glVertex2f(x, h);
}
glEnd();
if (isLinealScale()) {
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER,
GL_NEAREST);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER,
GL_NEAREST);
}
}
But to be honest with you … I dont have any idea what i am doing …
I dont know if i have to render the texture before the mask
I dont know if what Im trying to do is even possible
I dont know witch glBlendFunc add before the mask rendering and witch one before the normal texture
I dont know if i HAVE to use GL_TEXTURE_2D in the glBindTexture method
In other words Im totally lost
I really appreciate your attention and your suggestions
- Sorry for the ridiculous amount of comments … I try a lot of blend functions … concepts and guides … *