Witam,
mam drobny problem z teksturowaniem sfery. O ile nakłada mi jakis materiał który jest cały szary to nie jest to ustawiona przeze mnie tekstura. Co więcej wszystko się ładnie robi dla szescianu jesli podam mu TexCoord. Błąd w przypadku korzystania z mojej tekstury to HEAP CORRUPTION , gdy korzystam z teksturki kolegi błędu NIE MA natomiast tekstury nie widać jest po prostu jest szara powierzchnia rysowanego elementu bryły. Proszę o wskazanie błędu, być może muszę wyznaczać kordy jesli tak to prosze o potwierdzenie.
O to chodzi mi z szarą powierzchnią:
Te kuleczki na sstatku które normalnie sąniebieskie po nałożeniu tekstury są szare, właściwie dzieje sie tak z każdą powierzchnią na której dam GL_Enable(GL_TEXTURE_2D)
Funkcja wczytująca teksture (w draw), być może nie powinienem jej tu dawać z sześcianem działa.
Włączenie teksturowania koła.
kolo_goscia(float h)
{
glBegin(GL_POLYGON);
for (int i = 0; i <= 300; i++){
double angle = 2 * PI * i / 300;
double x = cos(angle)*h;
double y = sin(angle)*h;
glEnable(GL_TEXTURE_2D);
glVertex2d(x, y);
glDisable(GL_TEXTURE_2D);
}
glEnd();
}
unsigned char *LoadBitmapFile(char *filename, BITMAPINFOHEADER *bitmapInfoHeader)
{
FILE *filePtr; // wskaŸnik pozycji pliku
BITMAPFILEHEADER bitmapFileHeader; // nag³ówek pliku
unsigned char *bitmapImage; // dane obrazu
int imageIdx = 0; // licznik pikseli
unsigned char tempRGB; // zmienna zamiany sk³adowych
// otwiera plik w trybie "read binary"
filePtr = fopen(filename, "rb");
if (filePtr == NULL)
return NULL;
// wczytuje nag³ówek pliku
fread(&bitmapFileHeader, sizeof(BITMAPFILEHEADER), 1, filePtr);
// sprawdza, czy jest to plik formatu BMP
if (bitmapFileHeader.bfType != BITMAP_ID)
{
fclose(filePtr);
return NULL;
}
// wczytuje nag³ówek obrazu
fread(bitmapInfoHeader, sizeof(BITMAPINFOHEADER), 1, filePtr);
// ustawia wskaŸnik pozycji pliku na pocz¹tku danych obrazu
fseek(filePtr, bitmapFileHeader.bfOffBits, SEEK_SET);
// przydziela pamiêæ buforowi obrazu
bitmapImage = (unsigned char*)malloc(bitmapInfoHeader->biSizeImage);
// sprawdza, czy udao si przydzieli pami
if (!bitmapImage)
{
free(bitmapImage);
fclose(filePtr);
return NULL;
}
// wczytuje dane obrazu
fread(bitmapImage, 1, bitmapInfoHeader->biSizeImage, filePtr);
// sprawdza, czy dane zostay wczytane
if (bitmapImage == NULL)
{
fclose(filePtr);
return NULL;
}
// zamienia miejscami sk³adowe R i B
for (imageIdx = 0; imageIdx < bitmapInfoHeader->biSizeImage; imageIdx += 3)
{
tempRGB = bitmapImage[imageIdx];
bitmapImage[imageIdx] = bitmapImage[imageIdx + 2];
bitmapImage[imageIdx + 2] = tempRGB;
}
// zamyka plik i zwraca wskaŸnik bufora zawieraj¹cego wczytany obraz
fclose(filePtr);
return bitmapImage;
}
void DrawOpenGLScene()
{
GLfloat position[4] = { 10.0f, 10.0, 100.0f, 0.0f };
// flagi czynnosci pomocniczych
glEnable(GL_DEPTH_TEST);
// czyszczenie buforow
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//glEnable(GL_CULL_FACE);
glEnable(GL_COLOR_MATERIAL);
// glMaterialf(GL_FRONT, GL_SHININESS, 16.0f); //blysk
glGenTextures(1, &texture[0]); // tworzy obiekt tekstury
// aduje pierwszy obraz tekstury:
bitmapData = LoadBitmapFile("Bitmapy//v2k.bmp", &bitmapInfoHeader);
glBindTexture(GL_TEXTURE_2D, texture[0]); // aktywuje obiekt tekstury
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); /// (pierwszy - na jaka texture oddzialuje),(3 parametr NEAREST LUB LINEAR)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
// tworzy obraz tekstury
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, bitmapInfoHeader.biWidth,
bitmapInfoHeader.biHeight, 0,GL_RGB , GL_UNSIGNED_BYTE, bitmapData);
if (bitmapData)
free(bitmapData);
// ustalenie sposobu mieszania tekstury z tem
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
auxInitDisplayMode(AUX_SINGLE | AUX_RGBA);
// wlaczenie oswietlenia
glLightfv(GL_LIGHT0, GL_POSITION, position);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
// transformacja obserwacji
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// zrobienie zlagodzenia modeli
glShadeModel(GL_SMOOTH);
// umiejscowienie kamery w odleglym miejscu
glTranslatef(pivot_x, pivot_y, -z_dist);
glRotatef(pivot_vert_angle, 1, 0, 0);
glRotatef(pivot_horiz_angle, 0, 1, 0);
glPushMatrix(); //dalej rysuje obiekty niewazne}
Niesamowicie cięzko mi edytowac post gdyż edycja chodzi strasznie wolno.
//edit fakt podalem kod dla koła a a nie kuli ale problem pozostaje ten sam.