Skocz do zawartości

Błąd w książce


PasiastyWiewiór

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);

}

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...