OpenGL无法用VBO绘制三角形

时间:2014-09-26 14:13:15

标签: opengl sdl glew

我最近开始使用OpenGL编程,并发现这个教程网站名为“open.gl”。 第二个教程解释了使用“现代”OpenGL绘制多边形的过程,但在仔细遵循教程后,我无法在屏幕上看到我的三角形。我一直在寻找我想要看到的东西,但到目前为止还不知道为什么我的三角形不会被画在屏幕上。我错过了一些非常简单的东西吗?

我使用SDL创建窗口,使用GLEW来检查硬件上的OpenGL函数,就像在教程中一样。我也做过检查,看看OpenGL上下文版本是“3.2”。

#include <stdio.h>
#include "glew.h"
#include <SDL.h>
#include <SDL_opengl.h>

const int SCREEN_WIDTH = 800;
const int SCREEN_HEIGHT = 600;

const GLchar* vertexSource =
"#version 150 core\n"
"in vec2 position;"
"void main() {"
"   gl_Position = vec4(position, 0.0, 1.0);"
"}";

const GLchar* fragmentSource =
"#version 150 core\n"
"out vec4 outColor;"
"void main() {"
"   outColor = vec4(1.0, 1.0, 1.0, 1.0,);"
"}";


GLfloat vertices[] =
{
    0.0f, 0.5f,
    0.5f, -0.5f,
    -0.5f, -0.5f
};

int main( int argc, char* argv[] )
{
    SDL_Init( SDL_INIT_VIDEO );

    // OpenGL core profile - deprecated functions are disabled
    SDL_GL_SetAttribute( SDL_GL_CONTEXT_PROFILE_MASK,
                         SDL_GL_CONTEXT_PROFILE_CORE );
    // OpenGL version 3.2
    SDL_GL_SetAttribute( SDL_GL_CONTEXT_MAJOR_VERSION, 3 );
    SDL_GL_SetAttribute( SDL_GL_CONTEXT_MINOR_VERSION, 2 );

    SDL_Window* window = SDL_CreateWindow( "SDL OpenGL",
                                           SDL_WINDOWPOS_CENTERED,
                                           SDL_WINDOWPOS_CENTERED,
                                           SCREEN_WIDTH,
                                           SCREEN_HEIGHT,
                                           SDL_WINDOW_OPENGL );

    SDL_GLContext context = SDL_GL_CreateContext( window );

    glewExperimental = GL_TRUE;
    if( glewInit() != GLEW_OK )
    {
        printf( "Failed to init glew!\n" );
        return -1;
    }

    glClearColor( 0.0f, 0.0f, 0.3f, 1.0f );

    GLuint vao;
    glGenVertexArrays( 1, &vao );
    glBindVertexArray(vao);

    GLuint vbo;
    glGenBuffers( 1, &vbo );

    glBindBuffer( GL_ARRAY_BUFFER, vbo );
    glBufferData( GL_ARRAY_BUFFER,
                  sizeof(vertices),
                  vertices,
                  GL_STATIC_DRAW );

    GLuint vertexShader = glCreateShader( GL_VERTEX_SHADER );
    glShaderSource( vertexShader, 1, &vertexSource, NULL );
    glCompileShader( vertexShader );

    GLuint fragmentShader = glCreateShader( GL_FRAGMENT_SHADER );
    glShaderSource( fragmentShader, 1, &fragmentSource, NULL );
    glCompileShader( fragmentShader );

    GLuint shaderProgram = glCreateProgram();
    glAttachShader( shaderProgram, vertexShader );
    glAttachShader( shaderProgram, fragmentShader );
    glBindFragDataLocation( shaderProgram, 0, "outColor" );
    glLinkProgram( shaderProgram );
    glUseProgram( shaderProgram );

    GLuint posAttrib = glGetAttribLocation( shaderProgram, "position" );
    glEnableVertexAttribArray( posAttrib );
    glVertexAttribPointer( posAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0 );

    SDL_Event windowEvent;
    while( true )
    {
        if( SDL_PollEvent( &windowEvent ) )
        {
            if( windowEvent.type == SDL_QUIT )
                break;

            if( windowEvent.type == SDL_KEYUP &&
                windowEvent.key.keysym.sym == SDLK_ESCAPE )
                break;
        }

        glClear( GL_COLOR_BUFFER_BIT );

        glDrawArrays( GL_TRIANGLES, 0, 3 );

        SDL_GL_SwapWindow( window );
    }

    glDeleteProgram( shaderProgram );
    glDeleteShader( fragmentShader );
    glDeleteShader( vertexShader );

    glDeleteBuffers( 1, &vbo );
    glDeleteVertexArrays( 1, &vao );

    SDL_GL_DeleteContext( context );
    SDL_Quit();
    return 0;
}

0 个答案:

没有答案