2013-06-24 24 views
0

我可以编译并运行该程序,但它在运行时仅创建一个没有任何内容的白色窗口。我已经确定着色器文件在同一个目录中,并且除了带有白色背景的窗口外,它仍然不会产生任何其他内容。GL或GLUT有问题

// 
// Perspective view of a color cube using LookAt() and Frustum() 
// 
// Colors are assigned to each vertex and then the rasterizer interpolates 
// those colors across the triangles. 
// 
#define _CRT_SECURE_NO_WARNINGS 
#include "Angel.h" 

typedef Angel::vec4 color4; 
typedef Angel::vec4 point4; 

const int NumVertices = 36; //(6 faces)(2 triangles/face)(3 vertices/triangle) 

point4 points[NumVertices]; 
color4 colors[NumVertices]; 

// Vertices of a unit cube centered at origin, sides aligned with axes 
point4 vertices[8] = { 
    point4(-0.5, -0.5, 0.5, 1.0), 
    point4(-0.5, 0.5, 0.5, 1.0), 
    point4( 0.5, 0.5, 0.5, 1.0), 
    point4( 0.5, -0.5, 0.5, 1.0), 
    point4(-0.5, -0.5, -0.5, 1.0), 
    point4(-0.5, 0.5, -0.5, 1.0), 
    point4( 0.5, 0.5, -0.5, 1.0), 
    point4( 0.5, -0.5, -0.5, 1.0) 
}; 

// RGBA olors 
color4 vertex_colors[8] = { 
    color4(0.0, 0.0, 0.0, 1.0), // black 
    color4(1.0, 0.0, 0.0, 1.0), // red 
    color4(1.0, 1.0, 0.0, 1.0), // yellow 
    color4(0.0, 1.0, 0.0, 1.0), // green 
    color4(0.0, 0.0, 1.0, 1.0), // blue 
    color4(1.0, 0.0, 1.0, 1.0), // magenta 
    color4(1.0, 1.0, 1.0, 1.0), // white 
    color4(0.0, 1.0, 1.0, 1.0) // cyan 
}; 

// Viewing transformation parameters 

GLfloat radius = 1.0; 
GLfloat theta = 0.0; 
GLfloat phi = 0.0; 

const GLfloat dr = 5.0 * DegreesToRadians; 

GLuint model_view; // model-view matrix uniform shader variable location 

// Projection transformation parameters 

GLfloat left = -1.0, right = 1.0; 
GLfloat bottom = -1.0, top = 1.0; 
GLfloat zNear = 0.5, zFar = 3.0; 

GLuint projection; // projection matrix uniform shader variable location 

//---------------------------------------------------------------------------- 

// quad generates two triangles for each face and assigns colors 
// to the vertices 

int Index = 0; 

void 
quad(int a, int b, int c, int d) 
{ 
    colors[Index] = vertex_colors[a]; points[Index] = vertices[a]; Index++; 
    colors[Index] = vertex_colors[b]; points[Index] = vertices[b]; Index++; 
    colors[Index] = vertex_colors[c]; points[Index] = vertices[c]; Index++; 
    colors[Index] = vertex_colors[a]; points[Index] = vertices[a]; Index++; 
    colors[Index] = vertex_colors[c]; points[Index] = vertices[c]; Index++; 
    colors[Index] = vertex_colors[d]; points[Index] = vertices[d]; Index++; 
} 

//---------------------------------------------------------------------------- 

// generate 12 triangles: 36 vertices and 36 colors 
void 
colorcube() 
{ 
    quad(1, 0, 3, 2); 
    quad(2, 3, 7, 6); 
    quad(3, 0, 4, 7); 
    quad(6, 5, 1, 2); 
    quad(4, 5, 6, 7); 
    quad(5, 4, 0, 1); 
} 

//---------------------------------------------------------------------------- 

// OpenGL initialization 
void 
init() 
{ 
    colorcube(); 

    // Create a vertex array object 
    GLuint vao; 
    glGenVertexArrays(1, &vao); 
    glBindVertexArray(vao); 

    // Create and initialize a buffer object 
    GLuint buffer; 
    glGenBuffers(1, &buffer); 
    glBindBuffer(GL_ARRAY_BUFFER, buffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(points) + sizeof(colors), 
      NULL, GL_STATIC_DRAW); 
    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(points), points); 
    glBufferSubData(GL_ARRAY_BUFFER, sizeof(points), sizeof(colors), colors); 

    // Load shaders and use the resulting shader program 
    GLuint program = InitShader("vshader42.glsl", "fshader42.glsl"); 
    glUseProgram(program); 

    // set up vertex arrays 
    GLuint vPosition = glGetAttribLocation(program, "vPosition"); 
    glEnableVertexAttribArray(vPosition); 
    glVertexAttribPointer(vPosition, 4, GL_FLOAT, GL_FALSE, 0, 
       BUFFER_OFFSET(0)); 

    GLuint vColor = glGetAttribLocation(program, "vColor"); 
    glEnableVertexAttribArray(vColor); 
    glVertexAttribPointer(vColor, 4, GL_FLOAT, GL_FALSE, 0, 
       BUFFER_OFFSET(sizeof(points))); 

    model_view = glGetUniformLocation(program, "model_view"); 
    projection = glGetUniformLocation(program, "projection"); 

    glEnable(GL_DEPTH_TEST); 
    glClearColor(1.0, 1.0, 1.0, 1.0); 
} 

//---------------------------------------------------------------------------- 

void 
display(void) 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    point4 eye(radius*sin(theta)*cos(phi), 
     radius*sin(theta)*sin(phi), 
     radius*cos(theta), 
     1.0); 
    point4 at(0.0, 0.0, 0.0, 1.0); 
    vec4 up(0.0, 1.0, 0.0, 0.0); 

    mat4 mv = LookAt(eye, at, up); 
    glUniformMatrix4fv(model_view, 1, GL_TRUE, mv); 

    mat4 p = Frustum(left, right, bottom, top, zNear, zFar); 
    glUniformMatrix4fv(projection, 1, GL_TRUE, p); 

    glDrawArrays(GL_TRIANGLES, 0, NumVertices); 

    glutSwapBuffers(); 
} 

//---------------------------------------------------------------------------- 

void 
keyboard(unsigned char key, int x, int y) 
{ 
    switch(key) { 
    case 033: // Escape Key 
    case 'q': case 'Q': 
     exit(EXIT_SUCCESS); 
     break; 

    case 'x': left *= 1.1; right *= 1.1; break; 
    case 'X': left *= 0.9; right *= 0.9; break; 
    case 'y': bottom *= 1.1; top *= 1.1; break; 
    case 'Y': bottom *= 0.9; top *= 0.9; break; 
    case 'z': zNear *= 1.1; zFar *= 1.1; break; 
    case 'Z': zNear *= 0.9; zFar *= 0.9; break; 
    case 'r': radius *= 2.0; break; 
    case 'R': radius *= 0.5; break; 
    case 'o': theta += dr; break; 
    case 'O': theta -= dr; break; 
    case 'p': phi += dr; break; 
    case 'P': phi -= dr; break; 

    case ' ': // reset values to their defaults 
     left = -1.0; 
     right = 1.0; 
     bottom = -1.0; 
     top = 1.0; 
     zNear = 0.5; 
     zFar = 3.0; 

     radius = 1.0; 
     theta = 0.0; 
     phi = 0.0; 
     break; 
    } 

    glutPostRedisplay(); 
} 

//---------------------------------------------------------------------------- 

void 
reshape(int width, int height) 
{ 
    glViewport(0, 0, width, height); 
} 

//---------------------------------------------------------------------------- 

int 
main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); 
    glutInitWindowSize(512, 512); 
    glutInitContextVersion(3, 2); 
    glutInitContextProfile(GLUT_CORE_PROFILE); 
    glutCreateWindow("Color Cube"); 

    glewInit(); 

    init(); 

    glutDisplayFunc(display); 
    glutKeyboardFunc(keyboard); 
    glutReshapeFunc(reshape); 

    glutMainLoop(); 
    return 0; 
} 

回答

2

几个想法:

替换您glewInit();有:

glewExperimental = GL_TRUE; // Added because of http://openglbook.com/glgenvertexarrays-access-violationsegfault-with-glew/  
GLint GlewInitResult = glewInit(); 
if (GlewInitResult != GLEW_OK) { 
    printf("ERROR: %s\n", glewGetErrorString(GlewInitResult)); 
} 

而且你应该使用检查OpenGL的错误glGetError()。在我的博客文章中阅读更多详情:http://blog.nobel-joergensen.com/2013/01/29/debugging-opengl-using-glgeterror/

1

一些想法:

  1. 您要请求与支持OpenGL 3.2,但是从我假设你是#使用GLSL 4.2着色器的文件名上下文?这可能是一个问题。

  2. 是否InitShaders寻找(编译)错误?

  3. 消除一个又一个错误的可能来源。绘制全屏,四,而不是你的几何形状,禁用着色器等