Skocz do zawartości
Zaloguj się, aby obserwować  
PasiastyWiewiór

Błąd w książce

Polecane posty

Witam. Od niedawna zacząłem swoją przygodę z OpenGL i już w pierwszym rozdziale książki ,,Grafika, Fizyka, Metody numeryczne. Symulacje fizyczne związane z wizualizacją 3D napotkałem problem. Problemem tym jest to, że zamiast białego trójkąta na czarnym tle uzyskuję samo czarne tło. W OpenGL jestem kompletnie zielony. Jedyne co znam to C++ i dzięki temu z klasami i pętlami w tym kodzie nie miałem problemu, ale mam problem z renderingiem

 

plik .cpp

 

 

C++

#include "OknoGL.h"

 

 

 

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

return okno.WndProc(hWnd, message, wParam,lParam);

 

}

 

 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

 

{

POINT polozenieOkna={100,100};

POINT rozmiarOkna={150,100};

if(!okno.Init(hInstance,polozenieOkna,rozmiarOkna))

{

MessageBox(NULL,"Inicjacja okna nie powiodła się","Aplikacja OpenGL",MB_OK | MB_ICONERROR);

return EXIT_FAILURE;

}

else return okno.Run();

}

 

 

 

 

 

bool COkno::Init(HINSTANCE uchwytAplikacji,POINT polozenieOkna,POINT rozmiarOkna) {

 

char nazwaOkna[]="Aplikacja windows, okno widmo";

 

WNDCLASSEX wc;

wc.cbSize=sizeof(wc);

wc.style= CS_HREDRAW | CS_VREDRAW | CS_OWNDC; //styl okna

wc.lpfnWndProc= (WNDPROC)::WndProc; // procedura okna

wc.cbClsExtra= 0; // dodatkowe bajty zarezerwoana za klasą okna

wc.cbWndExtra= 0; // dodatkowe bajty zarezerwowane za instancją okna

wc.hInstance= uchwytAplikacji; // instancja aplikacji

wc.hIcon= NULL; //uchwyt ikony

wc.hIconSm= NULL; //uchwyt ikony

wc.hCursor= LoadCursor(NULL, IDC_ARROW); // uchwyt kursora

wc.hbrBackground= NULL; // uchwyt pędzla tła

wc.lpszMenuName= NULL; // nazwa menu

wc.lpszClassName= nazwaOkna; // nazwa klasy okna

 

//Rejstracja klasy okna

if(RegisterClassEx(&wc)==0) return false;

 

//Tworzenie okna

uchwytOkna = CreateWindow( nazwaOkna, nazwaOkna, WS_OVERLAPPEDWINDOW, polozenieOkna.x, polozenieOkna.y, rozmiarOkna.x,rozmiarOkna.y, NULL, NULL, uchwytAplikacji, NULL);

 

if(uchwytOkna==NULL) return false;

//Pokazanie i aktualizacja okna

ShowWindow(uchwytOkna,SW_SHOW);

UpdateWindow(uchwytOkna);

 

return true;

};

 

WPARAM COkno::Run()

{

 

//Pętla główna - obsługa komunikatów

MSG msg;

while(GetMessage(&msg, NULL, 0, 0))

{

 

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return msg.wParam;

}

 

 

 

bool COknoGL::UstalFormatPikseli (HDC uchwytDC) const

{

PIXELFORMATDESCRIPTOR opis; //opisFormatuPixeli

ZeroMemory(&opis, sizeof(opis));

//w oknie podwojne buforowanie

opis.dwFlags=PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;

opis.iPixelType=PFD_TYPE_RGBA;

opis.cColorBits=32;

opis.cDepthBits=16;

opis.iLayerType=PFD_MAIN_PLANE;

int formatPikseli=ChoosePixelFormat(uchwytDC,&opis);

if (formatPikseli ==0) return false;

if (!SetPixelFormat(uchwytDC, formatPikseli, &opis)) return false;

return true;

 

}

 

bool COknoGL::InitWGL(HWND uchwytOkna)

{

uchwytDC = ::GetDC(uchwytOkna);

//Utworzenie kontekstu rederowania i uczynienie go aktywnym

if (!UstalFormatPikseli(uchwytDC)) return false;

uchwytRC = wglCreateContext(uchwytDC);

if (uchwytRC==NULL) return false;

if (!wglMakeCurrent(uchwytDC, uchwytRC)) return false;

return true;

}

 

void COknoGL::UsunWGL()

{

wglMakeCurrent(NULL,NULL);

wglDeleteContext(uchwytRC);

::ReleaseDC(uchwytOkna,uchwytDC);

}

 

 

bool COknoGL::UstawienieSceny(bool rzutowanieIzometryczne) //wartość domyślna =false

{

//okno OpenGL = wewnętrzne formy (domyślnie)

glViewport(0,0,szerokoscObszaruUzytkownika,wysokoscObszaruUzytkownika);

 

//ustawienie punktu projekcji

glMatrixMode(GL_PROJECTION);//przełączenie na macierz projekcji

glLoadIdentity();

//left,right,bottom,top,znear,zfar (clipping)

float wsp=wysokoscObszaruUzytkownika/(float)szerokoscObszaruUzytkownika;

if(!rzutowanieIzometryczne)

//left,right,bottom,top,znear,zfar (clipping)

//mnożenie macierzy rzutowanie przez macierz perspektywy - ustalenie frustum

glFrustum(-0.1, 0.1, wsp*-0.1, wsp*0.1, 0.0, 100.0);

else

glOrtho(-3, 3, wsp*-3, wsp*3, 0.3, 100.0);

glMatrixMode(GL_MODELVIEW); //powrót do macierzy widoku modelu

glEnable(GL_DEPTH_TEST); //z-buffer aktywny = ukrywanie niewidocznych powierzchni

return true;

}

 

 

void COknoGL::RysujScene()

{

 

const float x0=1.0;

const float y0=1.0;

const float z0=1.0;

 

//Przygotowanie bufora

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // czyści bufory

glLoadIdentity(); //macierzy model-widok = macierz jednostkowa

glTranslatef(0.0, 0.0, -10.0); // odsunięcie sceny o 10

 

//Rysowanie trójkąta

glBegin(GL_TRIANGLES);

//ustalenie trzech wierzchołków (werteksów (x,y,z))

//(0,0,z) jest mniej więcej na środku ekranu

glColor3f(1,1,0);

glVertex3f(-x0, -y0, 0); //dolny lewy

glColor3f(1,1,1);

glVertex3f(x0, -y0, 0); //dolny prawy

glColor3f(0,1,0);

glVertex3f(0, y0, 0); //górny

//koniec rysowania figury

glEnd();

 

//Z bufora na ekran

SwapBuffers(uchwytDC);

}

Edytowano przez Nakiel
zmiana formatowania

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się
Zaloguj się, aby obserwować  

×