Текстура OpenGL с альфа и glColor4f, glColor4f влияет на текстуру
Я хочу применить текстуру из a .TGA-файл, включающий Альфа-прозрачность. Когда текстура привязана к объекту, она просвечивает до сплошного цвета самого объекта. Я хочу, чтобы цвет исчез или, по крайней мере, стал прозрачным. Если я изменю цвет объекта на прозрачный, то текстура в целом станет более прозрачной, чего я не хочу.
Есть ли способ либо отключить цвет, либо как я могу сделать так, чтобы glColor4f не влиял на текстуру?
void Sector::DrawPlanets(double gameTime){
glEnable(GL_TEXTURE_2D);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable( GL_BLEND );
glColor4f(0.0f, 0.0f, 1.0f,0.1f);
for(std::vector<Planet *>::iterator it = Planets.begin(); it != Planets.end(); it++){
double x,y,angle;
(*it)->GetPosition(&x,&y,&angle,gameTime);
int radius = (*it)->GetRadius();
glPushMatrix();
glTranslatef(x,y,0);
GLUquadricObj * sphere = gluNewQuadric();
gluQuadricDrawStyle(sphere, GLU_FILL);
gluQuadricTexture(sphere, GL_TRUE);
glBindTexture(GL_TEXTURE_2D, get_textures()[static_cast<int>((*it)->GetPlanetZone())]);
gluSphere(sphere,radius,20,20);
glPopMatrix();
}
glDisable(GL_TEXTURE_2D);
}
Сторона Информация Я видел, что способ загрузки текстуры также может быть виновником проблемы. Я включу и это. Это код, который я получил из класса, вот почему я использую .tga, потому что он уже был пригоден для использования. Вот то, что я считаю актуальным, некоторые функции не включены.
const int num_textures = 5;
static GLuint texName[num_textures];
void InitializeTextures(){
bool repeat[num_textures];
bool border[num_textures];
gliGenericImage *image[num_textures];
int n=0;
repeat[n] = false; border[n] = false;
image[n++] = readImage("ice.tga");
repeat[n] = false; border[n] = false;
image[n++] = readImage("jupiter.tga");
repeat[n] = false; border[n] = false;
image[n++] = readImage("world.tga");
repeat[n] = false; border[n] = false;
image[n++] = readImage("volcanic.tga");
repeat[n] = false; border[n] = false;
image[n++] = readImage("stars.tga");
if(n!=num_textures)
{
printf("Error: Wrong number of texturesn");
_getch();
exit(1);;
}
glGenTextures(num_textures, texName);
for(int i=0; i<num_textures; i++)
{
glBindTexture(GL_TEXTURE_2D, texName[i]);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
int repeats = repeat[i];
int needs_border = border[i]; // Needed if clamping and not filling the whole polygon.
if(repeats)
{
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
}
else
{
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
}
if(needs_border)
{
// set a border.
SetBorder(image[i]);
}
bool mipmaps = false;
if(!PowerOf2(image[i]->height) || !PowerOf2(image[i]->width))
{
// WARNING: Images that do not have width and height as
// powers of 2 MUST use mipmaps.
mipmaps = true;
}
if (mipmaps)
{
gluBuild2DMipmaps(GL_TEXTURE_2D, image[i]->components,
image[i]->width, image[i]->height,
image[i]->format, GL_UNSIGNED_BYTE, image[i]->pixels);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
//GL_LINEAR_MIPMAP_LINEAR);
GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
//GL_LINEAR);
GL_NEAREST);
}
else
{
glTexImage2D(GL_TEXTURE_2D, 0, image[i]->components,
image[i]->width, image[i]->height, 0,
image[i]->format, GL_UNSIGNED_BYTE, image[i]->pixels);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}
}
}
3 ответа:
Когда вы устанавливаете
TEXTURE_ENV_MODE
вDECAL
, Вы получаете текстуру, накладывающуюся на цвет:// This is not what you want glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
Вы хотите
MODULATE
, что является значением по умолчанию, поэтому просто удалите эту строку.Обратите внимание, что
MODULATE
умножит цвет на текстуру, поэтому измените свой цвет на белый, если вы хотите, чтобы текстура отображалась с полной яркостью:glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
Изменение
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
К
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_REPLACE);
Просто нужно позвонить сюда и сказать вам, что вместо того, чтобы рвать волосы с помощью текстурной среды с фиксированной функцией, вы должны просто отказаться от всего беспорядка с фиксированной функцией и просто использовать шейдеры. В шейдере фрагментов вы можете точно указать способ комбинирования базового цвета и текстуры.