Skocz do zawartości


Błąd w książce


Brak odpowiedzi do tego tematu

#1 PasiastyWiewiór

    Nowy na forum

  • Użytkownicy
  • 1 Postów:

Napisano wto, 21 cze 2011 - 10:01

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

Użytkownik Nakiel edytował ten post wto, 26 lip 2011 - 11:05
zmiana formatowania