2013-12-21 2 views
0

Я следую 8-й редакции, а ниже - код, который я изменил из книги. это не дает мне то, что я хочу, но вместо этого пустое окно. Интересно, какие ошибки я сделал во время модификаций?Руководство по программированию OpenGL Первый пример

ниже - код, который я модифицировал, надеюсь, что любой может указать на ошибку.

#include <iostream> 
#include <OpenGL/glu.h> 
#include <OpenGL/gl3.h> 
#include <GLUT/GLUT.h> 

GLuint vaoNames[1]; 
GLuint bufferNames[1]; 
int vPosition = 0; 

GLuint createProgram(); 
GLuint createShader(GLenum type, const char* src); 
GLuint program; 

void init() 
{ 
    glGenVertexArrays(1, vaoNames); 
    glBindVertexArray(vaoNames[0]); 

    GLfloat vertices[6][2] = { 
     { -0.90, -0.90 }, // Triangle 1 
     { 0.85, -0.90 }, 
     { -0.90, 0.85 }, 
     { 0.90, -0.85 }, // Triangle 2 
     { 0.90, 0.90 }, 
     { -0.85, 0.90 } 
    }; 

    glGenBuffers(1, bufferNames); 
    glBindBuffer(GL_ARRAY_BUFFER, bufferNames[0]); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 

    glUseProgram(createProgram()); 
    glVertexAttribPointer(vPosition, 2, GL_FLOAT, GL_FALSE, 0, 0); 
    glEnableVertexAttribArray(vPosition); 
} 

void render() 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 
    glBindVertexArray(vaoNames[0]); 
    glDrawArrays(GL_TRIANGLES, 0, 6); 
    glFlush(); 
} 

GLuint createProgram() 
{ 
    GLuint program = glCreateProgram(); 

    const char* vertexShaderSrc = 
    "#version 400 core        \n" 
    "layout(location = 0) in vec4 vPosition;  \n" 
    "void main()         \n" 
    "{            \n" 
     "gl_Position = vPosition;     \n" 
    "}"; 
    GLuint vertexShader = createShader(GL_VERTEX_SHADER, vertexShaderSrc); 

    const char* fragmentShaderSrc = 
    "#version 400 core        \n" 
    "out vec4 fColor;        \n" 
    "void main()         \n" 
    "{            \n" 
    "fColor = vec4(0.0, 0.0, 1.0, 1.0);   \n" 
    "}"; 
    GLuint fragmentShader = createShader(GL_FRAGMENT_SHADER, fragmentShaderSrc); 

    glAttachShader(program, vertexShader); 
    glAttachShader(program, fragmentShader); 

    glLinkProgram(program); 
    return program; 
} 

GLuint createShader(GLenum type, const char* src){ 
    GLuint shaderID = glCreateShader(type); 
    glShaderSource(shaderID, 1, &src, 0); 
    glCompileShader(shaderID); 
    return shaderID; 
} 

int main(int argc, char ** argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA); 
    glutInitWindowSize(512, 512); 
    glutCreateWindow("8877"); 

    init(); 
    glutDisplayFunc(render); 
    glutMainLoop(); 
} 
+0

Вы пытаетесь сделать что-то глупое, как использовать это на OSX? – genpfault

+0

Есть ли у вас какие-либо ошибки, кроме пустого экрана? Можете ли вы опубликовать снимок экрана о том, что вы получаете, и о том, что вы ожидаете (если это возможно)? – rhughes

+0

Почему вы не проверяете сборку шейдеров и журналы ссылок? – genpfault

ответ

3

Когда вы говорите «нет ошибки во время шейдерной компиляции и программы компоновки», вы имеете в виду, что программа не останавливается, или вы имеете в виду, что вы на самом деле побежали другую программу и проверили результаты от glGetError() в разных точках, или выбрал журнал компиляции или связывания? Ваша программа как есть, не проверяет фактическую ошибку, и OpenGL, конечно же, не генерирует исключения или создает ошибку. Вы должны действительно просить об этом.

Просто потому, что glCompileShader() не генерирует ошибку, не означает, что ваш шейдер фактически скомпилирован. Вы должны быть проверка состояния компиляции шейдеров и состояние соединения программ с кодом, похожее на это:

GLint compiled; 
    glGetShaderiv(newShader, GL_COMPILE_STATUS, &compiled); 
    if (!compiled) { 
     std::string log = getLog(newShader); 
     SAY(log.c_str()); 
     throw std::runtime_error("Failed to compile shader " + log); 
    } 

где getLog является

static std::string getLog(GLuint shader) { 
    std::string log; 
    GLint infoLen = 0; 
    glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infoLen); 

    if (infoLen > 1) { 
     char* infoLog = new char[infoLen]; 
     glGetShaderInfoLog(shader, infoLen, NULL, infoLog); 
     log = std::string(infoLog); 
     delete[] infoLog; 
    } 
    return log; 
} 

Это для проверки шейдеров, и есть эквивалентные функции для проверки результатов и получения журналов для связывания программ. Если вы их не назовете, у вас нет гарантии, что шейдеры компилируются. Предполагая, что вы не допустили какой-либо простой ошибки в синтаксисе шейдеров, наиболее вероятной проблемой, с которой вы сталкиваетесь, является отсутствие поддержки OpenGL 4.x, что может привести к сбою в работе шейдеров.

+0

Спасибо @ Jherico, Кажется, проблема была в Mac OS X, поддерживающей более низкую версию Opengl, поскольку шейдер не удалось скомпилировать. – Korben

+0

Я должен был догадаться. Оператор #include отличается от Mac OS, и я борется с отсутствием поддержки OSX 4.x. – Jherico

+0

Я тоже, согласно этой ссылке https://developer.apple.com/graphicsimaging/opengl/capabilities/index.html, мой код должен поддерживать GLSL 4.1. как-то это не похоже. Я все еще работаю над этим – Korben

Смежные вопросы