2013-08-22 47 views
3

所以當我製作一個三角形時,它只是錯過了下面顯示的面孔(有四個面)任何形狀我嘗試錯過面孔,你可以直接看到,是我第一次同時使用OpenGL和GLFW)爲什麼我的3D形狀在OpenGL/GLFW C++中缺少面孔

形狀代碼來自一個教程,因爲我嘗試了許多形狀代碼,看看這是否是問題,看起來不是。

enter image description here enter image description here enter image description here

#include <glfw3.h> 
#include <stdio.h> 
#include <iostream> 

using namespace std; 

/* Begin Void prototyping */ 
void error_callback(int error, const char* description); 
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods); 

int main(void) 
{ 
    GLFWwindow* window; 

    /* Initializes error call-backs */ 
    glfwSetErrorCallback(error_callback); 

    /* Initialize the library */ 
    if (!glfwInit()) 
     return -1; 

    /* Create a windowed mode window and its OpenGL context */ 
    window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL); // fullscreen glfwGetPrimaryMonitor() (first NULL) 
    if (!window) 
    { 
     glfwTerminate(); 
     return -1; 
    } 

    /* Makes OpenGL context current */ 
    glfwMakeContextCurrent(window); 

    /* Make the window's context current */ 
    glfwMakeContextCurrent(window); 

    /* Receives input events */ 
    glfwSetKeyCallback(window, key_callback); 

    /* Loop until the user closes the window */ 
    while (!glfwWindowShouldClose(window)) 
    { 
     /* Render here */ 
     float ratio; 
     int width, height; 

     glfwGetFramebufferSize(window, &width, &height); 
     ratio = width/(float) height; 

     glViewport(0, 0, width, height); 
     glClear(GL_COLOR_BUFFER_BIT); 

     glMatrixMode(GL_PROJECTION); 
     glLoadIdentity(); 
     glOrtho(-ratio, ratio, -1.f, 1.f, 1.f, -1.f); 
     glMatrixMode(GL_MODELVIEW); 

     glLoadIdentity(); 
     glRotatef((float) glfwGetTime() * 50.f, 0.f, 0.f, 1.f); 


    glBegin(GL_TRIANGLES);        // Start Drawing A Triangle 
     glColor3f(1.0f,0.0f,0.0f);      // Red 
     glVertex3f(0.0f, 1.0f, 0.0f);     // Top Of Triangle (Front) 
     glColor3f(0.0f,1.0f,0.0f);      // Green 
     glVertex3f(-1.0f,-1.0f, 1.0f);     // Left Of Triangle (Front) 
     glColor3f(0.0f,0.0f,1.0f);      // Blue 
     glVertex3f(1.0f,-1.0f, 1.0f);     // Right Of Triangle (Front) 
     glColor3f(1.0f,0.0f,0.0f);      // Red 
     glVertex3f(0.0f, 1.0f, 0.0f);     // Top Of Triangle (Right) 
     glColor3f(0.0f,0.0f,1.0f);      // Blue 
     glVertex3f(1.0f,-1.0f, 1.0f);     // Left Of Triangle (Right) 
     glColor3f(0.0f,1.0f,0.0f);      // Green 
     glVertex3f(1.0f,-1.0f, -1.0f);     // Right Of Triangle (Right) 
     glColor3f(1.0f,0.0f,0.0f);      // Red 
     glVertex3f(0.0f, 1.0f, 0.0f);     // Top Of Triangle (Back) 
     glColor3f(0.0f,1.0f,0.0f);      // Green 
     glVertex3f(1.0f,-1.0f, -1.0f);     // Left Of Triangle (Back) 
     glColor3f(0.0f,0.0f,1.0f);      // Blue 
     glVertex3f(-1.0f,-1.0f, -1.0f);     // Right Of Triangle (Back) 
     glColor3f(1.0f,0.0f,0.0f);      // Red 
     glVertex3f(0.0f, 1.0f, 0.0f);     // Top Of Triangle (Left) 
     glColor3f(0.0f,0.0f,1.0f);      // Blue 
     glVertex3f(-1.0f,-1.0f,-1.0f);     // Left Of Triangle (Left) 
     glColor3f(0.0f,1.0f,0.0f);      // Green 
     glVertex3f(-1.0f,-1.0f, 1.0f);     // Right Of Triangle (Left) 
    glEnd();           // Done Drawing The Pyramid 


     /* Swap front and back buffers */ 
     glfwSwapBuffers(window); 

     /* Poll for and process events */ 
     glfwPollEvents(); 
    } 

    glfwDestroyWindow(window); 

    glfwTerminate(); 
    return 0; 
} 

/* 
    Calls back the program if a GLFW function fail and logs it 
*/ 
void error_callback(int error, const char* description) 
{ 
    fputs(description, stderr); 
} 

/* Gives keys events */ 
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) 
{ 
    switch(key) 
    { 
    case GLFW_KEY_ESCAPE: 
     glfwSetWindowShouldClose(window, GL_TRUE); 
     break; 
    case GLFW_KEY_W: 
     cout << "W works!!!" << endl; 
     break; 
    case GLFW_KEY_A: 
     cout << "A works!!!" << endl; 
     break; 
    case GLFW_KEY_S: 
     cout << "S works!!!" << endl; 
     break; 
    case GLFW_KEY_D: 
     cout << "D works!!!" << endl; 
     break; 
    } 
} 

我一直試圖修復它幾個小時,我只是不知道該怎麼過現在要做的

進出口使用的OpenGL 3+與GLFW和C++

+0

也就是說OpenGL的1.0,OpenGL的不3+ – bcrist

回答

8

你需要啓用深度測試:

glEnable(GL_DEPTH_TEST); 
glDepthFunc(GL_LEQUAL); 

此外,一定要清除深度緩存,除了顏色緩衝區:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
+0

好吧,我得到了工作,但仍然是金字塔的底部是不顯示當旋轉時我可以在底部看到它 –

+0

glClear可以保持它當前的位置。深度測試啓用可以在「while」循環之上。 –

+0

謝謝你的幫助很多:) –