2012-05-25 12 views
5

Chcę móc renderować coś do tekstury, na OpenGL, więc mogę dalej używać go, kiedy chcę, bez ponownego renderowania wszystkiego. Ta strona internetowa here dała mi wskazówki, aby to zrobić, bez korzystania z FrameBuffer. Nie chcę tego robić z obiektem FrameBuffer z powodu problemów ze zgodnością, ponieważ ten stary komputer go nie obsługuje. Zrobiłem trochę kodu, który tworzy moją teksturę, renderuje moją scenę, a następnie tworzę Quad, aby renderować na nim teksturę. Jedynym problemem jest to, że tekstura jest renderowana jak "Maska alfa", oznacza to, że bierze pod uwagę tylko wartość Alfa, utrzymując mój prostokąt zawsze z tym samym kolorem, ale po prostu zmieniając przezroczystość na pikselach. Oto kod zrobiłem do tej pory:OpenGL - Renderowanie w teksturę

void CreateTexture() 
{ 
    xSize = 512; 
    ySize = 512; //size of texture 
//new array 
    char* colorBits = new char[ xSize * ySize * 3 ]; 
//texture creation.. 
    glGenTextures(1,&texture); 
    glBindTexture(GL_TEXTURE_2D,texture); 
    glTexImage2D(GL_TEXTURE_2D,0 ,3 , xSize, 
       ySize, 0 , GL_RGB, 
       GL_UNSIGNED_BYTE, colorBits); 
//you can set other texture parameters if you want 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
//clean up 
    delete[] colorBits; 
} 

Następnie:

int viewport[4]; 
    glGetIntegerv(GL_VIEWPORT,(int*)viewport); 
    glViewport(0,0,xSize,ySize); 


    DrawScene(hDC); 

    //save data to texture using glCopyTexImage2D 
    glBindTexture(GL_TEXTURE_2D,texture); 

    glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 
        0,0, xSize, ySize, 0); 
    glClearColor(.0f, 0.5f, 0.5f, 1.0f);    // Set The Clear Color To Medium Blue 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glViewport(viewport[0],viewport[1],viewport[2],viewport[3]); 
    // glBindTexture(GL_TEXTURE_2D,texture); 

I wreszcie:

glEnable(GL_TEXTURE_2D);     // Enable 2D Texture Mapping 
     glBlendFunc(GL_DST_COLOR,GL_ONE);    // Set Blending Mode 
     glEnable(GL_BLEND); 

     glClear(GL_COLOR_BUFFER_BIT); 
     glBindTexture(GL_TEXTURE_2D,texture); 

     glRotatef(theta, 0.0f, 0.0f, 0.01f); 
     glBegin(GL_QUADS); 
     //Front Face 
     glTexCoord2f(0.0f, 0.0f); 
     glVertex3f(-0.5, -0.5f, 0.5f); 
     glTexCoord2f(1.0f, 0.0f); 
     glVertex3f(0.5f, -0.5f, 0.5f); 
     glTexCoord2f(1.0f, 1.0f); 
     glVertex3f(0.5f, 0.5f, 0.5f); 
     glTexCoord2f(0.0f, 1.0f); 
     glVertex3f(-0.5f, 0.5f, 0.5f); 
     glEnd(); 
     SwapBuffers(hDC); 

DrawScene() funkcja po prostu renderuje prostokąt z trójkątem do góry, z każdym wierzchołkiem o różnych kolorach .. nic specjalnego.

glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
glClear(GL_COLOR_BUFFER_BIT);//| GL_DEPTH_BUFFER_BIT); 

glPushMatrix(); 
// glRotatef(theta, 0.0f, 0.0f, 1.0f); 

glBegin(GL_QUADS); 
glColor3f(1.0f, 0.0f, 0.0f); 
glVertex3f(-1.0f, -1.0f, 1.0f); 
glColor3f(0.0f, 1.0f, 0.0f); 
glVertex3f(1.0f, -1.0f, 1.0f); 
glColor3f(0.0f, 0.0f, 1.0f); 
glVertex3f(1.0f, 1.0f, 1.0f); 
glColor3f(1.0f, 1.0f, 1.0f); 
glVertex3f(-1.0f, 1.0f, 1.0f); 
glEnd(); 

glBegin(GL_TRIANGLES); 

glColor3f(1.0f, 0.0f, 0.0f); 
glVertex2f(0.0f, 1.0f); 
glColor3f(0.0f, 1.0f, 0.0f); 
glVertex2f(0.87f, -0.5f); 
glColor3f(0.0f, 0.0f, 1.0f); 
glVertex2f(-0.87f, -0.5f); 
glEnd(); 
glPopMatrix(); 
+0

Edytuj tekst, aby odnosić się do renderowalnej powierzchni jako obiektu FrameBuffer we wszystkich przypadkach - nie tylko framebuffer, który wprowadza w błąd. – Ani

+0

Gotowe. Dziękuję za uwagę. – filipehd

+0

Wydajesz się mieszać podczas renderowania. Czy to twoja intencja? Czy wywołasz funkcję swapBuffers, aby zobaczyć, co faktycznie jest renderowane? – Ani

Odpowiedz

4

Znalazłem coś na stronie nVidii, która wygląda przydatna dla kogoś, kto nie może zrobić poza ekranem trójwymiarowa z FBO:

http://developer.download.nvidia.com/SDK/9.5/Samples/samples.html

This wstęg Zawiera jeden projekt o nazwie "Simple P-Buffer", który zasadniczo zawiera implementację bufora P. Idea próbki polega na tym, że przełączasz kontekst na pBuffer, podczas gdy chcesz narysować piksele w trybie poza ekranem, powiedzmy. Po narysowaniu sceny za pomocą normalnych funkcji renderowania, używamy glReadPixels do odczytu danych z pBuffer do tablicy unsigned bytes (GLubyte). Następnie przełączamy kontekst ponownie, przywracając go do kontekstu ekranu, dzięki czemu można użyć glReadPixels do odczytu zawartości z naszej tablicy.

0

Sposób przed FBOs były dostępne było użyć alternatywnego czyni bufor (see glDrawBuffer(GL_AUX0), skopiuj pikseli z tym buforze (see glReadBuffer) do tekstury (see glCopyTexImage2D. Renderowania bezpośrednio tekstury wymaga FBOs.

+0

Ben Voigt, dziękuję za odpowiedź, wypróbuję to w poniedziałek i opublikuję wyniki tutaj, razem z rozwiązaniem, jeśli uda mi się to zrobić. – filipehd

+0

Bufory pomocnicze są jeszcze mniej obsługiwane niż serwery FBO. Najszerzej obsługiwaną metodą było użycie kontekstu kontekstowego/renderowania urządzenia PBuffer jako docelowego renderowania (udostępnianie obiektów z głównym kontekstem OpenGL) i kopiowanie renderowanego obrazu do tekstury. Google "renderowanie PBuff do tekstury" – datenwolf

+0

datenwolf, dziękuję za odpowiedź. Pozwoliło mi to uzyskać interesujące wyniki, o czym pisałem w poniższej odpowiedzi. – filipehd

Powiązane problemy