2009-01-17 42 views
8

Có thể mở OpenGL trong 2 cửa sổ không? như trong 2 cửa sổ khác nhau (cho phép nói đầu tiên là 640x480 và khác là 1024x768) hiển thị những thứ khác nhau (cho phép nói một cửa sổ là trình chỉnh sửa và cửa sổ kia là màn hình chính/bình thường)Nhiều cửa sổ trong OpenGL?

+0

Mặc dù câu hỏi này là khá cũ, cần lưu ý rằng các hành vi phát hành của nhiều ngữ cảnh chia sẻ cần được xem xét, vì việc thay đổi các bối cảnh có thể gây ra một phần hoặc thậm chí là toàn bộ. ("Flush" có nghĩa là tất cả các lệnh opengl được thực hiện trước khi trở về, đó là một showstopper tuyệt đối.) – RecursiveExceptionException

Trả lời

10

Nếu bạn đang sử dụng GLUT bạn có thể sử dụng các lệnh glutSetWindow()/glutGetWindow() để chọn cửa sổ chính xác (sau khi tạo chúng bằng glutCreateSubWindow()). Tuy nhiên đôi khi GLUT có thể không phải là công cụ thích hợp cho công việc.

Nếu bạn đang làm việc trên Windows, bạn sẽ muốn xem xét wglMakeCurrent() và wglCreateContext(). Trên OS X có aglSetCurrentContext() và cetera, và X11 yêu cầu glXMakeCurrent().

Các chức năng đó kích hoạt ngữ cảnh OpenGL hiện tại mà bạn có thể hiển thị. Mỗi thư viện nền tảng cụ thể có những cách riêng để tạo cửa sổ và ràng buộc ngữ cảnh OpenGL với nó.

Trên Windows, sau khi bạn đã mua HWND và HDC cho cửa sổ (sau cuộc gọi CreateWindow và GetDC). Bạn thường làm điều gì đó như thế này để thiết lập OpenGL:

GLuint l_PixelFormat = 0; 

// some pixel format descriptor that I generally use: 
static PIXELFORMATDESCRIPTOR l_Pfd = { sizeof(PIXELFORMATDESCRIPTOR), 1, 
    PFD_DRAW_TO_WINDOW + PFD_SUPPORT_OPENGL + PFD_DOUBLEBUFFER, 
    PFD_TYPE_RGBA, m_BitsPerPixel, 0, 0, 0, 0, 0, 0, 
    0, 0, 0, 0, 0, 0, 0, 16, 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0}; 

if(!(l_PixelFormat = ChoosePixelFormat(m_hDC, &l_Pfd))){ 
    throw std::runtime_error("No matching pixel format descriptor"); 
} 

if(!SetPixelFormat(m_hDC, l_PixelFormat, &l_Pfd)){ 
    throw std::runtime_error("Can't set the pixel format"); 
} 

if(!(m_hRC = wglCreateContext(m_hDC))){ 
    throw std::runtime_error("Can't create rendering context"); 
} 

wglMakeCurrent(m_hDC, m_hRC); 

Bạn sử dụng mã đó để tạo nhiều cửa sổ và ràng buộc OpenGL với nó, sau đó mỗi lần bạn muốn vẽ một cửa sổ cụ thể mà bạn phải gọi wglMakeCurrent trước bạn làm bất cứ điều gì và bạn vượt qua các thông số tương ứng với cửa sổ đó.

Là một lưu ý phụ, OpenGL cho phép bạn chia sẻ dữ liệu nhất định giữa các ngữ cảnh khác nhau, tuy nhiên theo thông số kỹ thuật, dữ liệu bạn có thể chia sẻ là khá hạn chế. Tuy nhiên, hầu hết các hệ điều hành đều cho phép bạn chia sẻ nhiều dữ liệu hơn so với quy định trong đặc tả.

+0

Điều gì về std :: error_code err {static_cast (:: GetLastError()), std :: system_category()}; ném tiêu chuẩn :: system_error {err}; Điều này sẽ cung cấp thông báo lỗi thích hợp. – Julien

9

Có, điều này là có thể. Đối với mỗi cửa sổ, bạn sẽ cần tạo một bối cảnh thiết bị duy nhất và hiển thị ngữ cảnh.

HDC hDC = GetDC(hWnd); /* get the device context for a particular window */ 
/* snip */ 
HGLRC hRC; 
hRC = wglCreateContext(hDC); /* get a render context for the same window */ 
/* repeat with hDC2 and hRC2 with another window handle*/ 

Trước khi thực hiện các cuộc gọi đến GL cửa sổ bạn phải gọi wglMakeCurrent như thế này:

wglMakeCurrent(hDC, hRC); 
/* GL calls for first window */ 
wglMakeCurrent(NULL, NULL); 

wglMakeCurrent(hDC2, hRC2); 
/* GL calls for second window */ 
wglMakeCurrent(NULL, NULL); 
+0

+1 Câu trả lời hay và chính xác. – kol

4

Trên Windows, bạn có thể chia sẻ OpenGL đối tượng như kết cấu và shaders với wglShareLists(). Nó thường chia sẻ tất cả mọi thứ bạn quan tâm, mặc dù những gì MSDN nói.

1

Tôi đã thực hiện nhiều cửa sổ OpenGL trong ứng dụng MFC trước đây. Đây là một lớp bạn có thể thấy hữu ích: vì chỉ có thể có một ngữ cảnh hiển thị hiện tại trong chuỗi giao diện người dùng tại một thời điểm, tôi đã viết một trình bao bọc lớp để quản lý nó dễ dàng hơn.

SaveRestoreRC.h

// this class helps to manage multiple RCs using an RAII design pattern

class CSaveRestoreRC 
{ 
public: 
HDC oldDC;    
HGLRC oldRC;    

CSaveRestoreRC(HDC hDC, HGLRC hRC); 
~CSaveRestoreRC(void); 
}; 

SaveRestoreRC.cpp:

CSaveRestoreRC::CSaveRestoreRC(HDC hDC, HGLRC hRC) 
{ 
ASSERT(hDC); 
ASSERT(hRC); 

oldDC = wglGetCurrentDC(); 
oldRC = wglGetCurrentContext(); 

BOOL result = wglMakeCurrent(hDC, hRC); 
ASSERT(result); 
} 

CSaveRestoreRC::~CSaveRestoreRC(void) 
{ 
if(!oldRC) 
    return; 
ASSERT(oldDC); 
BOOL result = wglMakeCurrent(oldDC, oldRC); 
ASSERT(result);  
} 

Bây giờ lấy được một lớp từ CWnd và thêm các biến thành viên:

class COpenGLControl : public CWnd 
{ 
    // used to interface OpenGL with Windows 
    HDC hdc;   
    HGLRC hrc;   
// ... 

int COpenGLControl::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{ 
if (CWnd::OnCreate(lpCreateStruct) == -1) 
    return -1; 
// Get device context only once. 
hdc = GetDC()->m_hDC; 

// ... ChoosePixelFormat, SetPixelFormat, etc. here. 

// Create the OpenGL Rendering Context. 
hrc = wglCreateContext(hdc); 
ASSERT(hrc); 

Sau đó, trong mỗi chức năng thành viên nơi bạn gọi bất kỳ lệnh OpenGL nào, sử dụng CSaveRestoreRC để ngữ cảnh hiển thị hiện tại của bạn không bị làm hỏng.

void COpenGLControl::UpdateCamera() 
{ 
CSaveRestoreRC c(hdc, hrc); 

// Map the OpenGL device coordinates. 
glViewport(0, 0, renderingWindow.Width(), renderingWindow.Height()); 

// Do your other OpenGL stuff here 
// ... 

// the CSaveRestoreRC destructor will automatically put the correct render context back, 
// even if you call other functions. Of course, put another CSaveRestoreRC there too. 
} 

-1

Nếu bạn chỉ muốn sử dụng thư viện glut, vui lòng xem a code by Eric Stringer.

// Glutdualwindow.c 
// By Eric Stringer 2002 
// Simple examples of OpenGL and Glut usage. 
// Keyboard input 
// 'v' = view ortho/perspective 
// 'l' = lighting on/off 


#include <windows.h> // This header file will be needed for some windows compilers 
//#include <GL/gl.h> // gl.h and glu.h also maybe needed for some compilers 
//#include <GL/glu.h> 
#include <GL/glut.h> // glut (gl utility toolkit) basic windows functions, keyboard, mouse. 
#include <stdio.h> // standard (I/O library) 
#include <stdlib.h> // standard library (set of standard C functions 
#include <math.h>  // Math library (Higher math functions) 


// lighting 
GLfloat LightAmbient[]= { 0.2f, 0.2f, 0.2f, 1.0f }; 
GLfloat LightDiffuse[]= { 0.5f, 0.5f, 0.5f, 1.0f }; 
GLfloat LightPosition[]= { 5.0f, 5.0f, -10.0f, 1.0f }; 
GLfloat mat_specular[] = { 0.2, 0.2, 0.2, 1.0 }; 

int window_1, window_2; 

static int view_state = 0, light_state = 0; 

int spin; 

int shape; 

// I use this to put text on the screen 
void Sprint(int x, int y, char *st) 
{ 
    int l,i; 

    l=strlen(st); // see how many characters are in text string. 
    glRasterPos2i(x, y); // location to start printing text 
    for(i=0; i < l; i++) // loop until i is greater then l 
     { 
     glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, st[i]); // Print a character on the screen 
    } 

} 


// This creates the spinning of the cube. 
static void TimeEvent(int te) 
{ 

    spin++; // increase cube rotation by 1 
    if (spin > 360) spin = 0; // if over 360 degress, start back at zero. 

    glutSetWindow(window_1); 
    glutPostRedisplay(); // Update screen with new rotation data 

    glutSetWindow(window_2); 
    glutPostRedisplay(); // Update screen with new rotation data 

    glutTimerFunc(100, TimeEvent, 1); // Reset our timmer. 
} 


// Setup our Opengl world, called once at startup. 
void init(void) 
{ 


    glClearColor (0.0, 0.0, 0.0, 0.0); // When screen cleared, use black. 
    glShadeModel (GL_SMOOTH); // How the object color will be rendered smooth or flat 
    glEnable(GL_DEPTH_TEST); // Check depth when rendering 
    // Lighting is added to scene 
    glLightfv(GL_LIGHT1 ,GL_AMBIENT, LightAmbient); 
    glLightfv(GL_LIGHT1 ,GL_DIFFUSE, LightDiffuse); 
    glLightfv(GL_LIGHT1 ,GL_POSITION, LightPosition); 
    glEnable(GL_LIGHTING); // Turn on lighting 
    glEnable(GL_LIGHT1); // Turn on light 1 


} 


// Draw our world 
void display_1(void) 
{ 
char *p; 

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //Clear the screen 

glMatrixMode (GL_PROJECTION); // Tell opengl that we are doing project matrix work 
glLoadIdentity(); // Clear the matrix 
glOrtho(-8.0, 8.0, -8.0, 8.0, 0.0, 30.0); // Setup an Ortho view 
glMatrixMode(GL_MODELVIEW); // Tell opengl that we are doing model matrix work. (drawing) 
glLoadIdentity(); // Clear the model matrix 


glColor3f(1.0, 1.0, 1.0); 
if (shape == 0) Sprint(-3, -7 ,"Solid Cube"); 
if (shape == 1) Sprint(-3, -7 ,"Solid Cone"); 
if (shape == 2) Sprint(-3, -7 ,"Solid Sphere"); 
if (shape == 3) Sprint(-3, -7 ,"Solid Torus"); 
if (shape == 4) Sprint(-3, -7 ,"Solid Dodecahedron"); 
if (shape == 5) Sprint(-3, -7 ,"Solid Octahedron"); 
if (shape == 6) Sprint(-3, -7 ,"Solid Tetrahedron"); 
if (shape == 7) Sprint(-3, -7 ,"Solid Icosahedron"); 
if (shape == 8) Sprint(-3, -7 ,"Solid Teapot"); 

// Setup view, and print view state on screen 
if (view_state == 1) 
    { 
    glColor3f(1.0, 1.0, 1.0); 
    Sprint(-2, 4, "Perspective view"); 
    glMatrixMode (GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(60, 1, 1, 30); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    }else 
    { 
    glColor3f(1.0, 1.0, 1.0); 
    Sprint(-2, 4, "Ortho view"); 
    } 

glColor3f(0.0, 0.0, 1.0); // Cube color 

// Lighting on/off 
if (light_state == 1) 
    { 
    glDisable(GL_LIGHTING); // Turn off lighting 
    glDisable(GL_COLOR_MATERIAL); // Turn off material, which needs lighting to work 
    }else 
    { 
    glEnable(GL_LIGHTING); // Turn on lighting 
    glEnable(GL_COLOR_MATERIAL); // Turn on material settings 
    glColorMaterial(GL_FRONT, GL_AMBIENT); 
    glColor4f(0.65, 0.65, 0.65, 0.4); 
    glColorMaterial(GL_FRONT, GL_EMISSION); 
    glColor4f(0.10, 0.10, 0.10, 0.0); 
    glColorMaterial(GL_FRONT, GL_SPECULAR); 
    glColor4f(0.5, 0.5, 0.5, 0.4); 
    glColorMaterial(GL_FRONT, GL_DIFFUSE); 
    glColor4f(0.85, 0.85, 0.85, 0.4); 
    } 

gluLookAt(0, 0, 20, 0, 0, 0, 0, 1, 0); 

//glRotatef(45, 1.0, 1.0, 0.0); // rotate cube 
glRotatef(spin++, 1.0, 1.0, 1.0); // spin cube 

if (shape == 0) glutSolidCube(10); // Draw a cube 
if (shape == 1) glutSolidCone(5,10, 16,16); // Draw a Cone 
if (shape == 2) glutSolidSphere(5, 16,16); // Draw a Sphere 
if (shape == 3) glutSolidTorus(2.5, 5, 16, 16); 
if (shape == 4) 
    { 
    glScalef(3.5, 3.5, 3.5); 
    glutSolidDodecahedron(); 
    } 

if (shape == 5) 
    { 
    glScalef(5.0, 5.0, 5.0); 
    glutSolidOctahedron(); 
    } 
if (shape == 6) 
    { 
    glScalef(5.0, 5.0, 5.0); 
    glutSolidTetrahedron(); 
    } 

if (shape == 7) 
    { 
    glScalef(5.0, 5.0, 5.0); 
    glutSolidIcosahedron(); 
    } 
if (shape == 8) glutSolidTeapot(5); 

glutSwapBuffers(); 
} 

void display_2(void) 
{ 
char *p; 

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //Clear the screen 

glMatrixMode (GL_PROJECTION); // Tell opengl that we are doing project matrix work 
glLoadIdentity(); // Clear the matrix 
glOrtho(-8.0, 8.0, -8.0, 8.0, 0.0, 30.0); // Setup an Ortho view 
glMatrixMode(GL_MODELVIEW); // Tell opengl that we are doing model matrix work. (drawing) 
glLoadIdentity(); // Clear the model matrix 


glColor3f(1.0, 1.0, 1.0); 
if (shape == 0) Sprint(-3, -7 ,"Wire Cube"); 
if (shape == 1) Sprint(-3, -7 ,"Wire Cone"); 
if (shape == 2) Sprint(-3, -7 ,"Wire Sphere"); 
if (shape == 3) Sprint(-3, -7 ,"Wire Torus"); 
if (shape == 4) Sprint(-3, -7 ,"Wire Dodecahedron"); 
if (shape == 5) Sprint(-3, -7 ,"Wire Octahedron"); 
if (shape == 6) Sprint(-3, -7 ,"Wire Tetrahedron"); 
if (shape == 7) Sprint(-3, -7 ,"Wire Icosahedron"); 
if (shape == 8) Sprint(-3, -7 ,"Wire Teapot"); 

// Setup view, and print view state on screen 
if (view_state == 1) 
    { 
    glColor3f(1.0, 1.0, 1.0); 
    Sprint(-2, 4, "Perspective view"); 
    glMatrixMode (GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(60, 1, 1, 30); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    }else 
    { 
    glColor3f(1.0, 1.0, 1.0); 
    Sprint(-2, 4, "Ortho view"); 
    } 

glColor3f(0.0, 0.0, 1.0); // Cube color 

// Lighting on/off 
if (light_state == 1) 
    { 
    glDisable(GL_LIGHTING); // Turn off lighting 
    glDisable(GL_COLOR_MATERIAL); // Turn off material, which needs lighting to work 
    }else 
    { 
    glEnable(GL_LIGHTING); // Turn on lighting 
    glEnable(GL_COLOR_MATERIAL); // Turn on material settings 
    glColorMaterial(GL_FRONT, GL_AMBIENT); 
    glColor4f(0.65, 0.65, 0.65, 0.4); 
    glColorMaterial(GL_FRONT, GL_EMISSION); 
    glColor4f(0.10, 0.10, 0.10, 0.0); 
    glColorMaterial(GL_FRONT, GL_SPECULAR); 
    glColor4f(0.5, 0.5, 0.5, 0.4); 
    glColorMaterial(GL_FRONT, GL_DIFFUSE); 
    glColor4f(0.85, 0.85, 0.85, 0.4); 
    } 

gluLookAt(0, 0, 20, 0, 0, 0, 0, 1, 0); 

//glRotatef(45, 1.0, 1.0, 0.0); // rotate cube 
glRotatef(spin++, 1.0, 1.0, 1.0); // spin cube 

if (shape == 0) glutWireCube(10); // Draw a cube 
if (shape == 1) glutWireCone(5,10, 16,16); // Draw a Cone 
if (shape == 2) glutWireSphere(5, 16,16); // Draw a Sphere 
if (shape == 3) glutWireTorus(2.5, 5, 16, 16); 
if (shape == 4) 
    { 
    glScalef(3.5, 3.5, 3.5); 
    glutSolidDodecahedron(); 
    } 

if (shape == 5) 
    { 
    glScalef(5.0, 5.0, 5.0); 
    glutWireOctahedron(); 
    } 
if (shape == 6) 
    { 
    glScalef(5.0, 5.0, 5.0); 
    glutWireTetrahedron(); 
    } 

if (shape == 7) 
    { 
    glScalef(5.0, 5.0, 5.0); 
    glutWireIcosahedron(); 
    } 
if (shape == 8) glutWireTeapot(5); 

glutSwapBuffers(); 
} 


// This is called when the window has been resized. 
void reshape_1 (int w, int h) 
{ 
    glViewport (0, 0, (GLsizei) w, (GLsizei) h); 
    glMatrixMode (GL_PROJECTION); 
    glLoadIdentity(); 
} 

// This is called when the window has been resized. 
void reshape_2 (int w, int h) 
{ 
    glViewport (0, 0, (GLsizei) w, (GLsizei) h); 
    glMatrixMode (GL_PROJECTION); 
    glLoadIdentity(); 
} 

// Read the keyboard 
void keyboard (unsigned char key, int x, int y) 
{ 
    switch (key) 
    { 

     case 'v': 
     case 'V': 
      view_state = abs(view_state -1); 
      break; 
     case 'l': 
     case 'L': 
      light_state = abs(light_state -1); 
      break; 
     case 's': 
     case 'S': 
      shape++; 
      break; 
     case 27: 
     exit(0); // exit program when [ESC] key presseed 
     break; 
     default: 
     break; 
    } 

if (shape > 8) shape = 0; 

} 


// Main program 
int main(int argc, char** argv) 
{ 
    glutInit(&amp;argc, argv); 
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); 
    glutInitWindowSize (500, 500); 
    glutInitWindowPosition (10, 10); 
    glutTimerFunc(10, TimeEvent, 1); 
    window_1 = glutCreateWindow (argv[0]); 
    glutSetWindowTitle("GlutWindow 1"); 
    init(); 
    glutDisplayFunc(display_1); 
    glutReshapeFunc(reshape_1); 
    glutKeyboardFunc(keyboard); 

    window_2 = glutCreateWindow (argv[0]); 
    glutSetWindowTitle("GlutWindow 2"); 
    init(); 
    glutDisplayFunc(display_2); 
    glutReshapeFunc(reshape_2); 
    glutMainLoop(); 
    return 0; 
} 



// Glutdualwindow.c 
// By Eric Stringer 2002 
// Simple examples of OpenGL and Glut usage. 
// Keyboard input 
// 'v' = view ortho/perspective 
// 'l' = lighting on/off 


#include <windows.h> // This header file will be needed for some windows compilers 
//#include <GL/gl.h> // gl.h and glu.h also maybe needed for some compilers 
//#include <GL/glu.h> 
#include <GL/glut.h> // glut (gl utility toolkit) basic windows functions, keyboard, mouse. 
#include <stdio.h> // standard (I/O library) 
#include <stdlib.h> // standard library (set of standard C functions 
#include <math.h>  // Math library (Higher math functions) 


// lighting 
GLfloat LightAmbient[]= { 0.2f, 0.2f, 0.2f, 1.0f }; 
GLfloat LightDiffuse[]= { 0.5f, 0.5f, 0.5f, 1.0f }; 
GLfloat LightPosition[]= { 5.0f, 5.0f, -10.0f, 1.0f }; 
GLfloat mat_specular[] = { 0.2, 0.2, 0.2, 1.0 }; 

int window_1, window_2; 

static int view_state = 0, light_state = 0; 

int spin; 

int shape; 

// I use this to put text on the screen 
void Sprint(int x, int y, char *st) 
{ 
    int l,i; 

    l=strlen(st); // see how many characters are in text string. 
    glRasterPos2i(x, y); // location to start printing text 
    for(i=0; i < l; i++) // loop until i is greater then l 
     { 
     glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_24, st[i]); // Print a character on the screen 
    } 

} 


// This creates the spinning of the cube. 
static void TimeEvent(int te) 
{ 

    spin++; // increase cube rotation by 1 
    if (spin > 360) spin = 0; // if over 360 degress, start back at zero. 

    glutSetWindow(window_1); 
    glutPostRedisplay(); // Update screen with new rotation data 

    glutSetWindow(window_2); 
    glutPostRedisplay(); // Update screen with new rotation data 

    glutTimerFunc(100, TimeEvent, 1); // Reset our timmer. 
} 


// Setup our Opengl world, called once at startup. 
void init(void) 
{ 


    glClearColor (0.0, 0.0, 0.0, 0.0); // When screen cleared, use black. 
    glShadeModel (GL_SMOOTH); // How the object color will be rendered smooth or flat 
    glEnable(GL_DEPTH_TEST); // Check depth when rendering 
    // Lighting is added to scene 
    glLightfv(GL_LIGHT1 ,GL_AMBIENT, LightAmbient); 
    glLightfv(GL_LIGHT1 ,GL_DIFFUSE, LightDiffuse); 
    glLightfv(GL_LIGHT1 ,GL_POSITION, LightPosition); 
    glEnable(GL_LIGHTING); // Turn on lighting 
    glEnable(GL_LIGHT1); // Turn on light 1 


} 


// Draw our world 
void display_1(void) 
{ 
char *p; 

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //Clear the screen 

glMatrixMode (GL_PROJECTION); // Tell opengl that we are doing project matrix work 
glLoadIdentity(); // Clear the matrix 
glOrtho(-8.0, 8.0, -8.0, 8.0, 0.0, 30.0); // Setup an Ortho view 
glMatrixMode(GL_MODELVIEW); // Tell opengl that we are doing model matrix work. (drawing) 
glLoadIdentity(); // Clear the model matrix 


glColor3f(1.0, 1.0, 1.0); 
if (shape == 0) Sprint(-3, -7 ,"Solid Cube"); 
if (shape == 1) Sprint(-3, -7 ,"Solid Cone"); 
if (shape == 2) Sprint(-3, -7 ,"Solid Sphere"); 
if (shape == 3) Sprint(-3, -7 ,"Solid Torus"); 
if (shape == 4) Sprint(-3, -7 ,"Solid Dodecahedron"); 
if (shape == 5) Sprint(-3, -7 ,"Solid Octahedron"); 
if (shape == 6) Sprint(-3, -7 ,"Solid Tetrahedron"); 
if (shape == 7) Sprint(-3, -7 ,"Solid Icosahedron"); 
if (shape == 8) Sprint(-3, -7 ,"Solid Teapot"); 

// Setup view, and print view state on screen 
if (view_state == 1) 
    { 
    glColor3f(1.0, 1.0, 1.0); 
    Sprint(-2, 4, "Perspective view"); 
    glMatrixMode (GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(60, 1, 1, 30); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    }else 
    { 
    glColor3f(1.0, 1.0, 1.0); 
    Sprint(-2, 4, "Ortho view"); 
    } 

glColor3f(0.0, 0.0, 1.0); // Cube color 

// Lighting on/off 
if (light_state == 1) 
    { 
    glDisable(GL_LIGHTING); // Turn off lighting 
    glDisable(GL_COLOR_MATERIAL); // Turn off material, which needs lighting to work 
    }else 
    { 
    glEnable(GL_LIGHTING); // Turn on lighting 
    glEnable(GL_COLOR_MATERIAL); // Turn on material settings 
    glColorMaterial(GL_FRONT, GL_AMBIENT); 
    glColor4f(0.65, 0.65, 0.65, 0.4); 
    glColorMaterial(GL_FRONT, GL_EMISSION); 
    glColor4f(0.10, 0.10, 0.10, 0.0); 
    glColorMaterial(GL_FRONT, GL_SPECULAR); 
    glColor4f(0.5, 0.5, 0.5, 0.4); 
    glColorMaterial(GL_FRONT, GL_DIFFUSE); 
    glColor4f(0.85, 0.85, 0.85, 0.4); 
    } 

gluLookAt(0, 0, 20, 0, 0, 0, 0, 1, 0); 

//glRotatef(45, 1.0, 1.0, 0.0); // rotate cube 
glRotatef(spin++, 1.0, 1.0, 1.0); // spin cube 

if (shape == 0) glutSolidCube(10); // Draw a cube 
if (shape == 1) glutSolidCone(5,10, 16,16); // Draw a Cone 
if (shape == 2) glutSolidSphere(5, 16,16); // Draw a Sphere 
if (shape == 3) glutSolidTorus(2.5, 5, 16, 16); 
if (shape == 4) 
    { 
    glScalef(3.5, 3.5, 3.5); 
    glutSolidDodecahedron(); 
    } 

if (shape == 5) 
    { 
    glScalef(5.0, 5.0, 5.0); 
    glutSolidOctahedron(); 
    } 
if (shape == 6) 
    { 
    glScalef(5.0, 5.0, 5.0); 
    glutSolidTetrahedron(); 
    } 

if (shape == 7) 
    { 
    glScalef(5.0, 5.0, 5.0); 
    glutSolidIcosahedron(); 
    } 
if (shape == 8) glutSolidTeapot(5); 

glutSwapBuffers(); 
} 

void display_2(void) 
{ 
char *p; 

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //Clear the screen 

glMatrixMode (GL_PROJECTION); // Tell opengl that we are doing project matrix work 
glLoadIdentity(); // Clear the matrix 
glOrtho(-8.0, 8.0, -8.0, 8.0, 0.0, 30.0); // Setup an Ortho view 
glMatrixMode(GL_MODELVIEW); // Tell opengl that we are doing model matrix work. (drawing) 
glLoadIdentity(); // Clear the model matrix 


glColor3f(1.0, 1.0, 1.0); 
if (shape == 0) Sprint(-3, -7 ,"Wire Cube"); 
if (shape == 1) Sprint(-3, -7 ,"Wire Cone"); 
if (shape == 2) Sprint(-3, -7 ,"Wire Sphere"); 
if (shape == 3) Sprint(-3, -7 ,"Wire Torus"); 
if (shape == 4) Sprint(-3, -7 ,"Wire Dodecahedron"); 
if (shape == 5) Sprint(-3, -7 ,"Wire Octahedron"); 
if (shape == 6) Sprint(-3, -7 ,"Wire Tetrahedron"); 
if (shape == 7) Sprint(-3, -7 ,"Wire Icosahedron"); 
if (shape == 8) Sprint(-3, -7 ,"Wire Teapot"); 

// Setup view, and print view state on screen 
if (view_state == 1) 
    { 
    glColor3f(1.0, 1.0, 1.0); 
    Sprint(-2, 4, "Perspective view"); 
    glMatrixMode (GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(60, 1, 1, 30); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    }else 
    { 
    glColor3f(1.0, 1.0, 1.0); 
    Sprint(-2, 4, "Ortho view"); 
    } 

glColor3f(0.0, 0.0, 1.0); // Cube color 

// Lighting on/off 
if (light_state == 1) 
    { 
    glDisable(GL_LIGHTING); // Turn off lighting 
    glDisable(GL_COLOR_MATERIAL); // Turn off material, which needs lighting to work 
    }else 
    { 
    glEnable(GL_LIGHTING); // Turn on lighting 
    glEnable(GL_COLOR_MATERIAL); // Turn on material settings 
    glColorMaterial(GL_FRONT, GL_AMBIENT); 
    glColor4f(0.65, 0.65, 0.65, 0.4); 
    glColorMaterial(GL_FRONT, GL_EMISSION); 
    glColor4f(0.10, 0.10, 0.10, 0.0); 
    glColorMaterial(GL_FRONT, GL_SPECULAR); 
    glColor4f(0.5, 0.5, 0.5, 0.4); 
    glColorMaterial(GL_FRONT, GL_DIFFUSE); 
    glColor4f(0.85, 0.85, 0.85, 0.4); 
    } 

gluLookAt(0, 0, 20, 0, 0, 0, 0, 1, 0); 

//glRotatef(45, 1.0, 1.0, 0.0); // rotate cube 
glRotatef(spin++, 1.0, 1.0, 1.0); // spin cube 

if (shape == 0) glutWireCube(10); // Draw a cube 
if (shape == 1) glutWireCone(5,10, 16,16); // Draw a Cone 
if (shape == 2) glutWireSphere(5, 16,16); // Draw a Sphere 
if (shape == 3) glutWireTorus(2.5, 5, 16, 16); 
if (shape == 4) 
    { 
    glScalef(3.5, 3.5, 3.5); 
    glutSolidDodecahedron(); 
    } 

if (shape == 5) 
    { 
    glScalef(5.0, 5.0, 5.0); 
    glutWireOctahedron(); 
    } 
if (shape == 6) 
    { 
    glScalef(5.0, 5.0, 5.0); 
    glutWireTetrahedron(); 
    } 

if (shape == 7) 
    { 
    glScalef(5.0, 5.0, 5.0); 
    glutWireIcosahedron(); 
    } 
if (shape == 8) glutWireTeapot(5); 

glutSwapBuffers(); 
} 


// This is called when the window has been resized. 
void reshape_1 (int w, int h) 
{ 
    glViewport (0, 0, (GLsizei) w, (GLsizei) h); 
    glMatrixMode (GL_PROJECTION); 
    glLoadIdentity(); 
} 

// This is called when the window has been resized. 
void reshape_2 (int w, int h) 
{ 
    glViewport (0, 0, (GLsizei) w, (GLsizei) h); 
    glMatrixMode (GL_PROJECTION); 
    glLoadIdentity(); 
} 

// Read the keyboard 
void keyboard (unsigned char key, int x, int y) 
{ 
    switch (key) 
    { 

     case 'v': 
     case 'V': 
      view_state = abs(view_state -1); 
      break; 
     case 'l': 
     case 'L': 
      light_state = abs(light_state -1); 
      break; 
     case 's': 
     case 'S': 
      shape++; 
      break; 
     case 27: 
     exit(0); // exit program when [ESC] key presseed 
     break; 
     default: 
     break; 
    } 

if (shape > 8) shape = 0; 

} 


// Main program 
int main(int argc, char** argv) 
{ 
    glutInit(&amp;argc, argv); 
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); 
    glutInitWindowSize (500, 500); 
    glutInitWindowPosition (10, 10); 
    glutTimerFunc(10, TimeEvent, 1); 
    window_1 = glutCreateWindow (argv[0]); 
    glutSetWindowTitle("GlutWindow 1"); 
    init(); 
    glutDisplayFunc(display_1); 
    glutReshapeFunc(reshape_1); 
    glutKeyboardFunc(keyboard); 

    window_2 = glutCreateWindow (argv[0]); 
    glutSetWindowTitle("GlutWindow 2"); 
    init(); 
    glutDisplayFunc(display_2); 
    glutReshapeFunc(reshape_2); 
    glutMainLoop(); 
    return 0; 
} 

Tôi chạy đoạn code mẫu ở Windows 7 nhưng tôi đã phải thay thế một dòng glutIntit để

glutInit(&argc, argv); 
+0

Bạn nên dán vào một mã khóa có liên quan nhiều từ nguồn của bạn khi cần thiết để làm cho câu trả lời này hoàn chỉnh (trong khi vẫn giữ tham chiếu của bạn) vì các liên kết có thể bị hỏng theo thời gian. –

Các vấn đề liên quan