OpenGL编程指南第一个例子

时间:2013-12-21 04:14:22

标签: opengl

我正在关注第8版,以下是我从书中修改过的代码。它没有给我我想要的东西,而是一个空白的窗口。我想知道在修改过程中我犯了什么错误?

下面是我修改的代码,希望任何人都可以指出错误。

#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();
}

1 个答案:

答案 0 :(得分:3)

当你说'着色器编译和程序链接期间没有错误'时,你的意思是程序没有停止,或者你的意思是你实际运行了不同的程序并检查了{{1在各个点,或者获取编译或链接日志?你的程序没有实际的错误检查,OpenGL不会抛出异常或产生错误输出。你必须实际要求这些东西。

仅仅因为glGetError()没有生成错误并不意味着您的着色器实际编译。您需要使用与此类似的代码检查着色器的编译状态和程序的链接状态:

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

这用于检查着色器,并且有相同的函数用于检查结果和获取程序链接的日志。除非你打电话给他们,否则你无法保证着色器正在编译。假设你在着色器语法中没有犯一些简单的错误,你面临的最可能的问题是缺乏对OpenGL 4.x的支持,这会导致着色器立即失败。